CD-ROMだけで動作するオリジナルLinuxを作ろう |
||
YAMAMORI Takenori ●yamamori |
先に作成しておいた通常のLinuxの起動用フロッピーディスクイメージを利用して, CD-ROMブートシステム用の起動ディスクイメージを作成します.
次のように,起動用フロッピーのイメージを吸い出してループバックマウントし, さらにこの中のinitrdを展開してこれもループバックマウントします. 起動ディスクイメージは,後述のようにashとCD-ROMのモジュールを含むという意味で ash-cdrom.imgというファイル名にします. これで,/mnt/bootfdおよび/mnt/initrdの下で作業ができるようになります.
# dd if=/dev/fd0 of=/tmp/ash-cdrom.img bs=1440k count=1 # mkdir /mnt/bootfd # mount -o loop -t vfat /tmp/ash-cdrom.img /mnt/bootfd # zcat /mnt/bootfd/initrd.img > /tmp/initrd-ash-cdrom # mkdir /mnt/initrd # mount -o loop /tmp/initrd-ash-cdrom /mnt/initrd
initrdの中にash.staticを/bin/ashとしてコピーします. さらにinitrd内で,「/bin/sh -> ash」というシンボリックリンクも作成してください. initrdの容量内に何とか入るはずです. このashは,CD-ROMをマウントできなかったり,後述のpivot_rootが うまく行なえないなどで,システムが正常に起動しなかった場合に, カーネルオプションでinit=/bin/shを指定して起動することができるように, 念のために含めておくというものです.
さらに,あらかじめ調べておいた,CD-ROMをマウントする際に必要なモジュールを initrd内の/libの下にコピーします.RedHat Linux 7.3の標準カーネルの場合は, cdrom.o, ide-cd.o, nls_iso8859-1.oの3つのモジュールが必要です. これらのモジュールは,すでに移動した/a/lib/modules以下から探してください. なお,initrdの/lib以下にSCSIやネットワーク関係の別のモジュールが存在する場合は, 本システムでは使用しないため,適宜削除してください.
initrdの/ディレクトリにあるlinuxrcスクリプトに,下のリストのように, 先ほどコピーしたCD-ROMをマウントするためのモジュールをinsmodする行を 追加して修正します. さらに,mountコマンドのファイルシステムタイプをiso9660に変更します.
#!/bin/nash echo "Loading cdrom module" insmod /lib/cdrom.o ← CD-ROMのマウントに必要なモジュールを記述 echo "Loading ide-cd module" insmod /lib/ide-cd.o ← CD-ROMのマウントに必要なモジュールを記述 echo "Loading nls_iso8859-1 module" insmod /lib/nls_iso8859-1.o ← CD-ROMのマウントに必要なモジュールを記述 echo Mounting /proc filesystem mount -t proc /proc /proc echo Creating root device mkrootdev /dev/root echo 0x0100 > /proc/sys/kernel/real-root-dev echo Mounting root filesystem mount --ro -t iso9660 /dev/root /sysroot ← タイプをiso9660に変更 umount /proc pivot_root /sysroot /sysroot/initrd |
linuxrcはnashのスクリプトになっています.この中では, カーネルオプションの「root=」などでルートデバイスとして指定された デバイスファイルを,nashの内部コマンドのmkrootdevを使って /dev/rootという名前で作り,それを/sysrootにマウントしています. さらに,linuxrcの中でreal-root-devをinitrd自身(0x0100)に変更しているため, linuxrcの実行が終了しても,カーネルレベルではrootファイルシステムの 再マウントは行なわれません.その代わりに,linuxrcの最下行でpivot_rootを実行し, rootファイルシステムを真のrootファイルシステムに切替えています.本システムでは ここでCD-ROMがrootファイルシステムとしてマウントされることになります.
これでinitrd内部の作業は完了です.initrdは,次のようにumountしたあと gzipで圧縮して起動ディスクイメージの中のinitrd.imgに上書きします.
# umount /mnt/initrd # gzip -9 < /tmp/initrd-ash-cdrom > /mnt/bootfd/initrd.img
今度は/mnt/bootfd以下での作業です. 下のリストのようにsyslinux.cfgファイルを修正してください. このファイルの書式はlilo.confに似ているため,内容は見ればわかると思います. root=/dev/hdcのオプションはCD-ROMドライブがIDEのセカンダリ・マスタに つながっている場合で,これは実際のデバイスに合わせてください. さらに,init=/pre-initでinitコマンドを指定している点に注意してください. この/pre-initは,シェルスクリプトとしてあとで作成します.
default linux prompt 1 display boot.msg timeout 50 label linux kernel vmlinuz append initrd=initrd.img root=/dev/hdc init=/pre-init |
これで起動ディスクイメージが完成しました.次のようにumountしてから /pre-bootに移動して保存します.この段階で/pre-bootには ash-cdrom.imgとtmpfs.tar.gzが存在するはずです.
# umount /mnt/bootfd # mv /tmp/ash-cdrom.img /pre-boot/ash-cdrom.img