OpenVZがうまくいかなかったので、Welcome to Linux-VServer.org - Linux-VServerにトライしてみることにした。
Downloads - Linux-VServerのArchivesリンクをたどり、ftp://ftp.linux-vserver.org/pub/kernel/vs2.2/patch-2.6.22.18-vs2.2.0.6.diff を見つけてダウンロード(こちらはカーネルの各バージョンごとにそれぞれパッチがあった)。patchを当てるとはじかれたのは2箇所でcoLinuxと#includeがかち合ってるだけだった。これなら手で修正可能だ。
coLinuxのソース取得とカーネル一旦作成。
# cd /usr/src
# wget http://www.colinux.org/snapshots/stable-colinux-20080524.tar.gz
# tar zxf stable-colinux-20080524.tar.gz
# cd stable-colinux-20080524
# ./configure
# make kernel
(そういえば、make kernelのときだかにwww.kernel.orgからカーネルソースをダウンロードしようとしてタイムアウトになり困ったので、iij.ad.jpとかからwgetして/usr/src/downloadに置いた。)
Linux-VServerのカーネルパッチ取得とパッチ当て。
# cd /usr/src/download/
# wget ftp://ftp.linux-vserver.org/pub/kernel/vs2.2/patch-2.6.22.18-vs2.2.0.6.diff
# cd /usr/src/build/linux-2.6.22.18-source
# patch -p1 < /usr/src/download/patch-2.6.22.18-vs2.2.0.6.diff
# find . -name '*.rej'
./arch/i386/kernel/traps.c.rej
./mm/page_alloc.c.rej
# cat ./arch/i386/kernel/traps.c.rej
***************
*** 56,61 ****
#include <asm/stacktrace.h>
#include <linux/module.h>
#include "mach_traps.h"
--- 56,63 ----
#include <asm/stacktrace.h>
#include <linux/module.h>
+ #include <linux/vs_context.h>
+ #include <linux/vserver/history.h>
#include "mach_traps.h"
# cat ./mm/page_alloc.c.rej
***************
*** 41,46 ****
#include <linux/pfn.h>
#include <linux/backing-dev.h>
#include <linux/fault-inject.h>
#include <asm/tlbflush.h>
#include <asm/div64.h>
--- 41,48 ----
#include <linux/pfn.h>
#include <linux/backing-dev.h>
#include <linux/fault-inject.h>
+ #include <linux/vs_base.h>
+ #include <linux/vs_limit.h>
#include <asm/tlbflush.h>
#include <asm/div64.h>
*.rejの内容を見ながら手動パッチ当て。
次にcoLinuxのメモ - カーネルのコンパイルのカーネルのコンフィグレーションの部分を実行。CUIからロードするのは面倒なので直接.configにコピーした。
# cd /usr/src/build/linux-2.6.22.18-source
# cp /usr/src/devel-colinux-20080226/conf/linux-2.6.22.18-config .config
# make menuconfig
- 「File systems → DOS/FAT/NT Filesystems → Default codepage」を「932」
- 「File systems → DOS/FAT/NT Filesystems → Default iocharset for FAT」 を「utf-8」
としてみた(参照先はcharsetはeuc-jpだったのだがutf-8にしてみた)。NFSは使わないつもりなので設定省略。
とりあえずmakeでやってみた。
# make
しかし途中でコンパイルエラー。
CC [M] fs/squashfs/inode.o
fs/squashfs/inode.c: In function 'squashfs_get_cached_block':
fs/squashfs/inode.c:367: error: 'TASK_UNINTERRUPTIBLE' undeclared (first use in this funct
ion)
grepで探すとTASK_UNINTERRUPTIBLEはinclude/linux/sched.hで定義されていることが判明。ググってみるとRe: [ANN] Squashfs 3.3 released | KernelTrap、Re: [ANN] Squashfs 3.3 released | KernelTrapという記事を発見。間違って必要な#includeを削ってリリースしてしまったということらしい。というわけで手で修正。
--- linux-2.6.22.orig/fs/squashfs/inode.c 2007-07-12 14:57:22.000000000 +0400
+++ linux-2.6.22/fs/squashfs/inode.c 2007-07-12 14:57:53.000000000 +0400
@@ -31,6 +31,7 @@
#include <linux/vfs.h>
#include <linux/vmalloc.h>
+#include <linux/sched.h>
#include <linux/smp_lock.h>
#include "squashfs.h"
再度makeしてみると今度は通りました!ついでに設定をバックアップ。
# make
# cp .config colinux-2.6.22.18-1
ビルドが通ることを確認したので、debianの流儀でパッケージを作成。
# make-kpkg --initrd --revision=colinux.1 kernel_image kernel_headers
# cp -p vmlinux vmlinux-2.6.22.18-vs2.2.0.6-co-0.7.3
パッケージインストール。
# mv /lib/modules/2.6.22.18-co-0.7.3/ /lib/modules/2.6.22.18-co-0.7.3.old
# cd /usr/src/build/
# dpkg -i linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3_colinux.1_i386.deb
こんなエラーが出た。
Selecting previously deselected package linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3.
(Reading database ... 16479 files and directories currently installed.)
Unpacking linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3 (from linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3_colinux.1_i386.deb) ...
Done.
Setting up linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3 (colinux.1) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.
Could not find postinst hook script [update-grub].
Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'
dpkg: error processing linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3 (--install):
subprocess post-installation script returned error exit status 2
Errors were encountered while processing:
linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3
coLinuxのメモ - カーネルのコンパイルに書いてあったこれを忘れてた。
# vi /etc/kernel-img.conf
--- /etc/kernel-img.conf.orig 2007-04-17 17:22:27.000000000 -0400
+++ /etc/kernel-img.conf 2008-11-24 01:33:35.000000000 -0500
@@ -6,5 +6,5 @@
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
-postinst_hook = update-grub
-postrm_hook = update-grub
+#postinst_hook = update-grub
+#postrm_hook = update-grub
もう一度dpkgを実行したら/lib/modules/に既に同じ名前のがあると言われたので抜けて消して再実行。
# rm -rf /lib/modules/2.6.22.18-vs2.2.0.6-co-0.7.3/
# dpkg -i /usr/src/build/linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3_colinux.1_i386.deb
(Reading database ... 16823 files and directories currently installed.)
Preparing to replace linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3 colinux.1 (using linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3_colinux.1_i386.deb) ...
Done.
Unpacking replacement linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3 ...
Setting up linux-image-2.6.22.18-vs2.2.0.6-co-0.7.3 (colinux.1) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.
Not updating initrd symbolic links since we are being updated/reinstalled
(colinux.1 was configured last, according to dpkg)
Not updating image symbolic links since we are being updated/reinstalled
(colinux.1 was configured last, according to dpkg)
WinSCPを使って以下の2つのファイルをWindowsにコピー。
- /usr/src/build/linux-2.6.22.18-source/vmlinux-2.6.22.18-vs2.2.0.6-co-0.7.3
- /boot/initrd.img-2.6.22.18-vs2.2.0.6-co-0.7.3
coLinuxの設定ファイルでkernelとinitrdに上記をそれぞれ設定してcoLinuxを起動してみたら無事ブートしてログインできました。
あとはutil-vserverパッケージをインストールしておく。
# aptitude install util-vserver