友人が Adaptec の 2930U2 を購入しようか検討している時に、「これって
Linux で動くの?」と聞かれ、すかさず /usr/src/linux/drivers/scsi/Readme.aic7xxx
を見て、「動くって書いてあるよ」と答えてしまった。しかし、私の使用しているカーネルは
2.2.10 で 友人の持っている Vine-1.1CR のカーネルバージョンは 2.0.36 であった。kernel-2.0.36
では未対応のSCSI HOSTであったのだ。
せっかく買った Adaptec-2930U2 と Vine-1.1CR が使えないと嘆いている友人の為に、Vine-1.1(Ftp版)のカーネルを
2.2.x にしたカスタムVine-1.1 CDを作ってあげる事にしました。
・Vine-1.1 のCD(もしくは、CDの内容がDISKに展開済である事)
・RedHat-6.0 の カーネルソース(kernel-2.2.5-15.src.rpm)
・RedHat-6.0 の misc/src (kernel-2.2.x 用の insmod が必要だから)
・kernel-2.2.xで、loopback device、initrd,minix fs をサポートした構築済カーネル。(これは利用中の
2.2.10 を使いました)
・CD-Rを焼く為に必要なツール(mkisofs, cdrecord)
・CD-R装置が有る物とする。(CD焼きたいんだからあたりまえ)
・ブランクCD。
・DISK上に連続した空領域が 650MB + 650MB 以上有る事。
・boot.img の kernel を 2.0.36 から 2.2.10 へ変更。
・boot.img の modules を入れ替える
・installer 用の insmod を redhat-6.0
の misc/src より拝借。
・kernel-2.2.5-15 を使う為に必要なツール類を vine の kernel-2.2.x-kit
より拝借。
・Vine のパッケージ Tree 内での修正事項。
・RedHat-6.0 の kernel-2.2.5-15 をビルド。
・kernel-2.2.5-15でリビルドが必要な物。
・CDへ焼き付け。
まず、boot.img を改造します。改造内容は kernel-2.2.10 を組み込む事と、 kernel-2.2.10 に対応した modules へ入れ替える事です。
「kernel-2.2.10の組み込み」
Vine-1.1 の boot.img を Vine-1.1/i386/images よりホームディレクトリ等へコピーする。
ループデバイスでマウントし、kernel を上書きする。
# mount /dev/scd0 /mnt/cdrom -t iso9660 -r
# cp /mnt/cdrom/Vine-1.1/i386/images/boot.img ~/.
# umount /mnt/cdrom
# mount -t vfat -o loop boot.img ./tmp
# cd ./tmp
# cp /usr/src/linux/arch/i386/boot/zImage vmlinuz
# cd ..
# umount ./tmp
「modulesの入替」
ループデバイスでマウントし、initrd.img を抜き出す。
# mount -t vfat -o loop boot.img ./tmp
# cd ./tmp
# cp initrd.img ../.
圧縮されているイメージを解凍する。
# cd ..
# umount ./tmp
# gzip -S .img -d initrd.img
ループデバイスでマウントする。
# mount -t ext2 -o loop initrd ./tmp
モジュールを再作成。
# cp /lib/modules/2.2.10/の全てを ./module へコピー(ディレクトリ階層は作らない)
# cd module
# find . -print | cpio -o --file=../modules --format=newc
~~~~~~~~~~~~~~~
これをしないとインストール時にモジュールを認識しない。
# cd ..
# gzip -9 -S .cgz modules
# cp modules.cgz initrd/modules/.
(おまけ) cpio でファイルの展開は、
# cpio -i --file=archive
Vine-1.1 のインストーラで利用している
install コマンドを kernel-2.2.x に対応させる。(insmodの変更)
redhat-6.0 の misc/src/install/modutils を Vine-1.1の物と入れ換え、install
を再ビルド。
出来上がった install コマンドを strip し、initrd.img の /sbinへ
上書きコピー
新しい initrd のイメージを作成する。
# dd if=/dev/zero of=initrd2 bs=1k count=3000
# mke2fs -F initrd2
# find initrd -print | cpio -pdmv initrd2
# gzip -9 -S .img initrd2
# mv initrd2.img initrd.img
# umount ./tmp
# mount -t vfat -o loop boot.img ./tmp
# cp initrd.img ./tmp
# umount ./tmp
これで boot.img はで来あがり。
Vine-1.1 の CD-ROM を DISK へ展開。
# cd /mnt/cdrom
# find Vine-1.1 -print | cpio -pdmv /mnt/sda3
kernel package の入れ換え。
redhat-6.0 kernelをビルド
/mnt/sda3/Vine-1.1/i386/Vine/RPMS のカーネルと入れ替える。
/Vine-1.1/i386/Vine/base/comps.* の修正。
kernel-document -> kernel-doc
vine-update-kits のパッケージに合わせ、ipchains を追加 ipfw* を削除
/mnt/sda3/Vine/Vine-1.1/i386/misc/src/install/genhdlist /mnt/sda3/Vine
実行
(これをしないとインストール時にエラーとなってしまう:わたしゃ2枚失敗しました)
修正した boot.img と Vine パッケージ Tree のテストをする為に、修正した boot.img と supp.img をFDに入、 ローカルHDからのインストールをしてみる。
# dd if=boot.img of=/dev/fd0
# dd if=supp.img of=/dev/fd0
HD よりインストール。
再起動で動作確認。
userlink は起動されているカーネルバージョンに依存しているようなので、 テスト時についでに userlink を際ビルドする。
# rpm -ivh userlink*.rpm
# vi userlink.spec
依存カーネルバージョンを修正。
# rpm -bb userlink.spec
# cp userlink*.i386.rpm Vine パッケージ Tree へ
再起動し、テストは終了。
まず iso9660 形式のファイルへ変換する。その際 ブート可能な CD イメージを作成しておく。
# mkisofs -b Vine-1.1/i386/images/boot.img -c boot.cat -R -J -o /home/isofs/vine.img /mnt/sda3/Vine
CD-R への焼き付け。
# cdrecord -v speed=4 dev=2,6,0 vine.img
おしまい。