CD-ROMだけで動作するオリジナルLinuxを作ろう

 
  YAMAMORI Takenori ●yamamori

●CD-ROMブートシステム用起動用ディスクの作成

先に作成しておいた通常の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の追加

initrdの中にash.staticを/bin/ashとしてコピーします. さらにinitrd内で,「/bin/sh -> ash」というシンボリックリンクも作成してください. initrdの容量内に何とか入るはずです. このashは,CD-ROMをマウントできなかったり,後述のpivot_rootが うまく行なえないなどで,システムが正常に起動しなかった場合に, カーネルオプションでinit=/bin/shを指定して起動することができるように, 念のために含めておくというものです.

・CD-ROM関係のモジュールの追加

さらに,あらかじめ調べておいた,CD-ROMをマウントする際に必要なモジュールを initrd内の/libの下にコピーします.RedHat Linux 7.3の標準カーネルの場合は, cdrom.o, ide-cd.o, nls_iso8859-1.oの3つのモジュールが必要です. これらのモジュールは,すでに移動した/a/lib/modules以下から探してください. なお,initrdの/lib以下にSCSIやネットワーク関係の別のモジュールが存在する場合は, 本システムでは使用しないため,適宜削除してください.

○linuxrcの作成

initrdの/ディレクトリにあるlinuxrcスクリプトに,下のリストのように, 先ほどコピーしたCD-ROMをマウントするためのモジュールをinsmodする行を 追加して修正します. さらに,mountコマンドのファイルシステムタイプをiso9660に変更します.

●リスト linuxrc

#!/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内部の作業は完了です.initrdは,次のようにumountしたあと gzipで圧縮して起動ディスクイメージの中のinitrd.imgに上書きします.

  # umount /mnt/initrd
  # gzip -9 < /tmp/initrd-ash-cdrom > /mnt/bootfd/initrd.img
○syslinux.cfgの修正

今度は/mnt/bootfd以下での作業です. 下のリストのようにsyslinux.cfgファイルを修正してください. このファイルの書式はlilo.confに似ているため,内容は見ればわかると思います. root=/dev/hdcのオプションはCD-ROMドライブがIDEのセカンダリ・マスタに つながっている場合で,これは実際のデバイスに合わせてください. さらに,init=/pre-initでinitコマンドを指定している点に注意してください. この/pre-initは,シェルスクリプトとしてあとで作成します.

●リスト syslinux.cfg

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

To『CD-ROMだけで動作するオリジナルLinuxを作ろう』[index]


このページは、技術評論社 Software Design 2002年12月号、『CD-ROMだけで動作するオリジナルLinuxを作ろう』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 [Home]
yamamori