CD-ROMだけで動作するオリジナルLinuxを作ろう |
||
YAMAMORI Takenori ●yamamori |
この時点で,現在のハードディスクをCD-ROMに見立てて, リードオンリーでマウントしてブートできることを確認します. ブートには先ほど作成したash-cdrom.imgを一部修正したイメージを使います. 多少手順が前後しますが,initrd.imgの中のlinuxrcの,mountコマンドの オプションの「-t iso9660」の部分を「-t ext2」などのように 実際のハードディスクのファイルシステムに合わせて修正した起動ディスクを別に作り, これを,ddコマンドでフロッピーディスクに書き込んでください.(※注)
フロッピーディスクから起動して,最初に表示される「boot:」のプロンプトには 次のように入力してください. (root=の部分は実際のハードディスクによって変えてください)
boot: linux root=/dev/hda4 init=/bin/sh
うまくいけばハードディスクがリードオンリー状態でマウントされたところで /bin/shが起動するはずです.ハードディスクがマウントされていれば, lsコマンドほか,通常のコマンドが一通り使えます.
もしうまくいかなかった場合は,initrd上のashが起動するので, 適宜nashも利用しながら原因を探ってください. その場合はlsコマンドすら使えない状態になるので, 代わりに「echo *」を使います.
次に,下図のようにコマンド入力して,手作業でtmpfsをマウントし, tmpfs.tar.gzを展開し,tmpfs上にpivot_rootします. ここで,tmpfsのマウントや展開に必要なmount, tar, gzipなどのコマンドは すべてリードオンリーのハードディスク上のものを利用していることになります. なお,pivot_rootについては コラム「pivot_rootとは」を参照してください. 旧rootをumountできたら,いよいよ/sbin/initのexecです.これでOSが起動し, そのままS99gameスクリプトの記述どおりtuxracerが立ち上がるはずです.
# umount /initrd # mount -t tmpfs tmpfs /mnt/tmp ← tmpfsをマウント(※注1) # cd /mnt/tmp # tar zxpf /pre-boot/tmpfs.tar.gz ← 展開時にvオプションは付けない(※注2) # /sbin/pivot_root /mnt/tmp /mnt/tmp/mnt/tmp ← pivot_rootする # exec /bin/sh < /dev/console > /dev/console 2>&1 ← 旧rootをumountするため # umount /mnt/tmp ← 旧root(CD-ROM)をumount # exec /sbin/init … OSが起動し,アプリケーションが立ち上がる … |
手作業でコマンド入力した以上の手順を/pre-initというシェルスクリプトに 書きます.(下のリスト)手順の途中,execで新しいシェルに制御が移っているため, この部分の記述やシングルクォートに注意してください.
#!/bin/sh -x umount /initrd mount -t tmpfs tmpfs /mnt/tmp cd /mnt/tmp tar zxpf /pre-boot/tmpfs.tar.gz /sbin/pivot_root /mnt/tmp /mnt/tmp/mnt/tmp exec /bin/sh -c ' umount /mnt/tmp exec /sbin/init ' < /dev/console > /dev/console 2>&1 |
ここで再度起動テストを行ないます.「boot:」のプロンプトで, 今度はroot=/dev/hda4のみ指定し,syslinux.cfgに記述したデフォルトの init=/pre-initの状態で起動します. これで/pre-initスクリプトが正常に動作すれば,tmpfsのマウントや tmpfs.tar.gzの展開が自動的に行なわれ,無事 tuxracer が起動するはずです.