hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2008-11-25

coLinux入りカーネルソースにLinux-VServerのカーネルパッチ当ててカーネルビルド成功



OpenVZがうまくいかなかったので、Welcome to Linux-VServer.org - Linux-VServerにトライしてみることにした。


Downloads - Linux-VServerArchivesリンクをたどり、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 | KernelTrapRe: [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





0 件のコメント:

ブログ アーカイブ