カーネルのコンパイル

coLinuxで標準でついてくるカーネルはsmbfsも組み込まれているので、 ほとんどの場合そのままつかっても問題ありません。しかし、標準のカーネルに足りない機能があり場合は、 カーネルを再コンパイルする必要があります。

ここでの作業は全てcoLinux内でrootとなって行います (本当はrootでなくても良いところがあるのですが)。

必要なパッケージのインストール

まず最初に、 カーネルのコンパイルに必要なDebianのパッケージをインストールします。

必要となるのは、 Debianのカーネルパッケージ作成にkernel-packageパッケージです。 また、カーネルのコンフィグレーションをテキストコンソールで行う場合には、 ibncurses-devパッケージが必要になります。 次のコマンドでこれらのパッケージをインストールしておきましょう。 私の場合は15MBほどパッケージをダウンロードすることになりました。

# aptitude update
# aptitude install kernel-package libncurses-dev initramfs-tools

kernel-packageはgrubというブートローダを前提としておりますが、 coLinuxでは使用しませんので、設定ファイル/etc/kernel-img.confを編集して、 postinst_hookという行とpostrm_hookという行をコメントアウト(行の先頭に#を挿入)します。

また後ほど必要になるので、unzip, zip, bison, flexも インストールしておきます。

# aptitude install unzip zip bison flex

colinuxのソースファイルのダウンロード

http://www.colinux.org/snapshots/から、colinuxのパッチが含まれたファイル(devel-colinux-20080226.tar.gz)を取得します。 取得したらこのファイルを展開しておきます。

# cd /usr/src
# wget http://www.colinux.org/snapshots/devel-colinux-20080226.tar.gz
# tar xfvz devel-colinux-20080226.tar.gz

なお、以降の処理はかなりHDDを消費します。 colinuxのディスクに十分な空き容量(500MB以上)があることを 確認してください。 空き容量がない場合は、 「coLinuxのインストール ハードディスクの増量」を 見てディスクを増量しておきましょう。

カーネルの仮ビルド

ダウンロードしたソースファイルにはカーネルソースをダウンロードする スクリプトも含まれています。
まず、下記の様に環境設定をします。

# cd /usr/src/devel-colinux-20080226
# ./configure
Setting colinux_os=winnt
Setting prefix=/usr/src/mingw32
Setting downloaddir=/usr/src/download
Checking wget ... found
Checking Python interpreter ... (2.4.4) found
Checking patch ... found
Checking make ... found
Checking gcc for kernel ... (4.1.2) found
Checking as binutils for kernel ... (2.17.0) found
Checking depmod ... (module-init-tools 3.3-pre2) found
Checking unzip ... found
Checking zip ... found
Checking bison ... found
Checking texinfo ... found
Checking flex ... found
Checking gettext ... found
Create bin/user-build.cfg
Configure DONE

Ready for "make download && make && make package && make installer"
Run "make help" for more instructions, and read doc/building.

次にカーネルをビルドします。 本来なら自分でカーネルの設定をしてからビルドをしたいところですが、 colinux対応のカーネルにするには多数のパッチファイルを当てなければ なりません。

そこで、一度coLinuxのビルドシステムでビルドしてから、 カスタマイズします。 この場合、パッチファイルはcoLinuxのビルドシステムが処理してくれるので、 パッチのあて忘れの心配がありません。

カーネルをビルドするには以下の様にします。

# make kernel
log: /usr/src/log/build-colinux-4817.log
err: /usr/src/log/build-colinux-4817.err
Check kernel and modules: vmlinux or modules don't exist, build it now
Downloading linux-2.6.22.18.tar.bz2
--23:44:11--  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.18.tar.bz2
           => `linux-2.6.22.18.tar.bz2'
Resolving www.kernel.org... 204.152.191.37, 204.152.191.5
Connecting to www.kernel.org|204.152.191.37|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45,103,645 (43M) [application/x-bzip2]

100%[====================================>] 45,103,645   338.30K/s    ETA 00:00

23:46:23 (333.93 KB/s) - `linux-2.6.22.18.tar.bz2' saved [45103645/45103645]

Extracting Kernel 2.6.22.18
reading base-2.6.22.diff
patching file CREDITS
patching file Makefile
patching file arch/i386/Kconfig
patching file arch/i386/Kconfig.cpu
patching file arch/i386/kernel/Makefile
patching file arch/i386/kernel/cooperative.c
patching file arch/i386/kernel/cpu/common.c
patching file arch/i386/kernel/entry.S
patching file arch/i386/kernel/head.S
patching file arch/i386/kernel/i387.c
patching file arch/i386/kernel/process.c
patching file arch/i386/kernel/setup.c
patching file arch/i386/kernel/traps.c
patching file arch/i386/kernel/vmlinux.lds.S
patching file arch/i386/mm/fault.c
patching file arch/i386/mm/init.c
patching file arch/i386/mm/ioremap.c
patching file include/asm-i386/bug.h
patching file include/asm-i386/cooperative.h
patching file include/asm-i386/cooperative_internal.h
patching file include/asm-i386/dma.h
patching file include/asm-i386/fixmap.h
patching file include/asm-i386/io.h
patching file include/asm-i386/mach-default/irq_vectors.h
patching file include/asm-i386/mach-default/irq_vectors_limits.h
patching file include/asm-i386/mc146818rtc.h
patching file include/asm-i386/mmzone.h
patching file include/asm-i386/page.h
patching file include/asm-i386/pgalloc.h
patching file include/asm-i386/pgtable-2level.h
patching file include/asm-i386/pgtable.h
patching file include/asm-i386/processor.h
patching file include/linux/cooperative.h
patching file include/linux/cooperative_internal.h
patching file kernel/Makefile
patching file kernel/cooperative.c
patching file kernel/panic.c
patching file kernel/printk.c
patching file mm/bootmem.c
patching file mm/page_alloc.c
patching file mm/vmscan.c
patching file drivers/char/mem.c
patching file include/linux/elf.h
patching file arch/i386/kernel/cpu/bugs.c
patching file arch/i386/kernel/reboot_cooperative.c
patching file arch/i386/mach-default/setup.c
patching file arch/i386/kernel/i8259_cooperative.c
patching file arch/i386/kernel/ioport_cooperative.c
patching file lib/iomap.c
patching file drivers/char/Kconfig
patching file drivers/crypto/Kconfig
patching file drivers/usb/Kconfig
reading timer-2.6.22.diff
patching file arch/i386/kernel/timer_cooperative.c
patching file arch/i386/kernel/cpu/common.c
patching file arch/i386/lib/delay.c
patching file arch/i386/mach-default/setup.c
patching file include/asm-i386/delay.h
patching file include/asm-i386/mach-default/do_timer.h
patching file include/asm-i386/timex.h
reading coconsole-core.diff
patching file drivers/video/console/cocon.c
reading coconsole-2.6.22.diff
patching file drivers/video/console/Kconfig
patching file include/linux/console.h
patching file drivers/video/console/Makefile
patching file drivers/video/console/cocon.c
reading serial-core.diff
patching file drivers/char/coserial.c
reading serial-2.6.22.diff
patching file drivers/char/Makefile
patching file drivers/char/coserial.c
patching file drivers/char/Kconfig
reading conet-pci-core.diff
patching file drivers/net/conet.c
reading conet-2.6.22.diff
patching file drivers/net/Kconfig
patching file drivers/net/Makefile
reading cobd-core.diff
patching file drivers/block/cobd.c
reading cobd-2.6.22.diff
patching file include/linux/major.h
patching file drivers/block/Kconfig
patching file drivers/block/Makefile
patching file drivers/block/cobd.c
reading kbd-core.diff
patching file drivers/input/serio/cokbd.c
reading kbd-2.6.22.diff
patching file drivers/input/keyboard/Kconfig
patching file drivers/input/keyboard/atkbd.c
patching file drivers/input/serio/Kconfig
patching file drivers/input/serio/Makefile
patching file drivers/input/serio/cokbd.c
reading mouse-core.diff
patching file drivers/input/mouse/comouse.c
reading mouse-2.6.22.diff
patching file drivers/input/mouse/Kconfig
patching file drivers/input/mouse/Makefile
reading cofs-core.diff
patching file fs/cofusefs/dev.c
patching file fs/cofusefs/dir.c
patching file fs/cofusefs/file.c
patching file fs/cofusefs/fuse_i.h
patching file fs/cofusefs/inode.c
patching file fs/cofusefs/util.c
patching file include/linux/cooperative_fs.h
reading cofs-2.6.22.diff
patching file fs/Kconfig
patching file fs/Makefile
patching file fs/cofusefs/Makefile
patching file fs/cofusefs/file.c
patching file fs/cofusefs/fuse_i.h
patching file fs/cofusefs/dir.c
patching file fs/cofusefs/inode.c
reading cloop-core-2.06.diff
patching file drivers/block/cloop.c
patching file drivers/block/compressed_loop.h
reading cloop-2.6.22.diff
patching file drivers/block/Kconfig
patching file drivers/block/Makefile
reading squashfs3.2-core.diff
patching file fs/squashfs/inode.c
patching file fs/squashfs/Makefile
patching file fs/squashfs/squashfs2_0.c
patching file fs/squashfs/squashfs.h
patching file include/linux/squashfs_fs.h
patching file include/linux/squashfs_fs_i.h
patching file include/linux/squashfs_fs_sb.h
patching file init/do_mounts_rd.c
reading squashfs3.2-2.6.22.diff
patching file fs/Kconfig
patching file fs/Makefile
reading pci-core.diff
patching file arch/i386/pci/copci.c
patching file arch/i386/pci/irq_cooperative.c
patching file include/linux/cooperative_pci.h
patching file include/linux/copci.h
reading pci-2.6.22.diff
patching file arch/i386/Kconfig
patching file arch/i386/kernel/cpu/cyrix.c
patching file arch/i386/kernel/e820.c
patching file arch/i386/kernel/i8237.c
patching file arch/i386/pci/init.c
patching file arch/i386/pci/Makefile
patching file arch/i386/pci/pci.h
reading scsi-core.diff
patching file drivers/scsi/coscsi.c
patching file drivers/scsi/coscsi_rom.h
patching file include/scsi/coscsi.h
reading scsi-2.6.22.diff
patching file drivers/scsi/Kconfig
patching file drivers/scsi/Makefile
patching file drivers/scsi/sd.c
patching file drivers/scsi/sr.c
patching file include/linux/blkdev.h
reading audio-core.diff
patching file sound/pci/coaudio.c
reading audio-2.6.22.diff
patching file sound/pci/Kconfig
patching file sound/pci/Makefile
reading video-core.diff
patching file drivers/video/covideo.c
reading video-2.6.22.diff
patching file drivers/video/Kconfig
patching file drivers/video/Makefile
reading cobd-async-2.6.22.diff
patching file arch/i386/kernel/cooperative.c
patching file drivers/block/cobd.c
patching file include/asm-i386/mach-default/irq_vectors.h
patching file include/linux/cooperative.h

Configuring Kernel 2.6.22.18
Making Kernel 2.6.22.18
Making Modules 2.6.22.18
Create Modules archive
Create md5sum

カーネルのコンフィグレーション

ようやくここで自分オリジナルなカーネルの設定を行います。 上記の例の場合、カーネルをビルドするための環境一式は、 /usr/src/build/linux-2.6.22.18-sourceに入っています。

まず、ペースの設定をカーネルのソースにコピーします。

# cd /usr/src/build/linux-2.6.22.18-source
# cp /usr/src/devel-colinux-20080226/conf/linux-2.6.22.18-config .

次に、コンフィグレータ(?)を起動します。 telnet(あるいはssh)でconsole環境の人は meke menuconfigを、GUI環境の人はmake xconfigを実行します。 私は、make menuconfigです。

# make menuconfig

すると以下のような画面が現れます。 ここで、下から2番目の「Load an Alternate Configuration File」を 選択して、出てきた画面に「linux-2.6.22.18-config」を入力します。 これで基本的なcoLinuxの設定が取り込まれます。

menuconfig画面

後は、メニューから自分の必要なオプションを選択するのみです。 私は主に以下の変更をしてみました。 ちなみに、Processor TypeをAthlon(K7)にしたら、 コンパイルはできましたがそのカーネルではブートしませんでした。 Processor Typeは変えないほうが無難そうです。

  • 「File systems → DOS/FAT/NT Filesystems → Default codepage」を「932」
  • 「File systems → DOS/FAT/NT Filesystems → Default iocharset for FAT」 を「euc-jp」
  • 「File systems → Network Filesystems → Use a default NLS」 を「*」
  • 「File systems → Network Filesystems → Default Remote NLS Option」 を「cp932」
  • 「File systems → Native Language Support → Default NLS Option」を「euc-jp」

好みのオプションの選択が終わったら、 一番下の「Save Configuration to an Alternate File」を選択して、 自分の設定を適当なファイルにバックアップしておきましょう。 ここでは、「colinux-2.6.22.18-1」に保存したとします。

その後は、「Exit」を選択すると、 設定を保存する稼動するかきかれるので「Yes」を選択して終了します。

最後に保存した設定ファイルをコンパイル時の設定ファイルとして 使用されるように名前を変更しておきます。

# cp colinux-2.6.22.18-1 .config

カーネルのコンパイル

いよいよ、カーネルのコンパイルです。 ここではDebianのしきたりに従って、カーネルをパッケージ化します。 また同時に、カーヘルヘッダファイルのパッケージも作っておきます。

コンパイルには以下のコマンドを実行します。「revision=」に続く 「colinux.1」は自分の好みの文字列(この設定を識別する文字列)に変更してください。 私は、「ホスト名+そのバージョンでのパッケージ作成回数」で名前を付けています。 この場合は、ホスト名がcolinuxで、2.6.22.18のパッケージ作成が1回目という意味です。

コンパイルには結構時間がかかるのでのんびり待ちましょう。

# cd /usr/src/build/linux-2.6.22.18-source
# make-kpkg --initrd --revision=colinux.1 kernel_image kernel_headers

なお、ブートに必要な機能(ファイルシステムなど)をモジュールではなく カーネル組み込みにした場合は、「–initrd」は不要です。 また、以降のinitrd.imgに関する記述も無視してください。

コンパイルしたカーネル本体はkernel-image-2.6.22.18-co-0.8.0_colinux.1_i386.debに、 vmlinuz-2.6.22.18-co-0.8.0として含まれています。 しかし、このカーネルは圧縮されており、 そのままcoLinuxでは使用することができません。

圧縮されていないカーネルは、実はvmlinuxという名前で カーネルソースのディレクトリに作成されています。 これをvmlinux-2.6.22.18-co-0.8.0に改名しておきます。

# cd /usr/src/build/linux-2.6.22.18-source
# ls -l vmlinux
-rwxr-xr-x 1 root root 3836413 Mar  9 15:34 vmlinux
# mv vmlinux vmlinux-2.6.22.18-co-0.8.0

作成したカーネルパッケージのインストール

まず、作成したカーネルパッケージ(kernel-image-2.6.22.18-co-0.8.0_colinux.1_i386.deb)を インストールします。 ただ、インストールするカーネルのバージョンと、 現在使用しているバージョンが同じだと/lib/modules以下のディレクトリが バッティングしてしまうので、名前を変更してからインストールします。

# mv /lib/modules/2.6.22.18-co-0.8.0 /lib/module/2.6.22.18-co-0.8.0.old
# cd /usr/src/build
# dpkg -i kernel-image-2.6.22.18-co-0.8.0_colinux.1_i386.deb
Selecting previously deselected package linux-image-2.6.22.18-co-0.8.0.
(Reading database ... 28542 files and directories currently installed.)
Unpacking linux-image-2.6.22.18-co-0.8.0 (from linux-image-2.6.22.18-co-0.8.0_colinux.1_i386.deb) ...
Done.
Setting up linux-image-2.6.22.18-co-0.8.0 (colinux.1) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.

次に、/usr/src/build/linux-2.6.22.18-source/vmlinux-2.6.22.18-co-0.8.0と /boot/initrd.img-2.6.22.18-co-0.8.0をWindows側にコピーします (「coLinuxのインストール ホストPCとのデータ交換(smbfs)」と「coLinuxのインストール ホストPCとのデータ交換(cofs)」に、 Host PCフォルダをマウントする方法が書いてあります)。 コピーしたファイルはcoLinuxのフォルダ(c:\coLinux)にコピーして おきましょう。

ここで一度coLinuxを終了して、 coLinuxの設定ファイルを書き換えましょう。 書き換えるのはkernelの部分とinitrdの部分です。 いかに私の例を示します。

kernel=vmlinux-2.6.22.18-co-0.8.0
cobd0="c:\coLinux\root.img"
cobd1="c:\coLinux\swap.img"
root=/dev/cobd0
ro
initrd=initrd.img-2.6.22.18-co-0.8.0
mem=128
eth0=tuntap

以上で、カーネルのコンパイル&アップグレードは完了です。 colinux-daemon.exeを実行すれば、新しいカーネルで起動するはずです。

フォローする