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

 
  YAMAMORI Takenori ●yamamori

●手動ブートテスト

この時点で,現在のハードディスクをCD-ROMに見立てて, リードオンリーでマウントしてブートできることを確認します. ブートには先ほど作成したash-cdrom.imgを一部修正したイメージを使います. 多少手順が前後しますが,initrd.imgの中のlinuxrcの,mountコマンドの オプションの「-t iso9660」の部分を「-t ext2」などのように 実際のハードディスクのファイルシステムに合わせて修正した起動ディスクを別に作り, これを,ddコマンドでフロッピーディスクに書き込んでください.(※注)

※注
フロッピーディスクからの起動は少々遅いため, 筆者は実際には BpBatch(http://www.bpbatch.org/)を使って 起動ディスクイメージをネットワークブートしてテストしました. さらに,筆者はテスト用にSCSIハードディスクを使用したため, ash-cdrom.imgとは別に,SCSI関係のモジュールをinitrd.img内に組み込んだ 起動ディスクイメージを作成してテストしました.

フロッピーディスクから起動して,最初に表示される「boot:」のプロンプトには 次のように入力してください. (root=の部分は実際のハードディスクによって変えてください)

boot: linux root=/dev/hda4 init=/bin/sh

うまくいけばハードディスクがリードオンリー状態でマウントされたところで /bin/shが起動するはずです.ハードディスクがマウントされていれば, lsコマンドほか,通常のコマンドが一通り使えます.

もしうまくいかなかった場合は,initrd上のashが起動するので, 適宜nashも利用しながら原因を探ってください. その場合はlsコマンドすら使えない状態になるので, 代わりに「echo *」を使います.


○手作業でtmpfsを展開

次に,下図のようにコマンド入力して,手作業でtmpfsをマウントし, tmpfs.tar.gzを展開し,tmpfs上にpivot_rootします. ここで,tmpfsのマウントや展開に必要なmount, tar, gzipなどのコマンドは すべてリードオンリーのハードディスク上のものを利用していることになります. なお,pivot_rootについては コラム「pivot_rootとは」を参照してください. 旧rootをumountできたら,いよいよ/sbin/initのexecです.これでOSが起動し, そのままS99gameスクリプトの記述どおりtuxracerが立ち上がるはずです.

●図 手作業でのtmpfsのマウント・展開

# 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が起動し,アプリケーションが立ち上がる …
※注1
tmpfs上に作成できるファイルシステム容量の最大値は,デフォルトではシステムの 物理メモリの半分の容量になります.もし不足する場合は,mountコマンドに 「-o size=バイト数」のオプションを付加して容量を変更してください.
※注2
tarの展開時に「-v」オプションを付けると,コンソールに多量の文字列が出力され, これによってファイルの展開が遅くなってしまいます.

○pre-initスクリプトの作成

手作業でコマンド入力した以上の手順を/pre-initというシェルスクリプトに 書きます.(下のリスト)手順の途中,execで新しいシェルに制御が移っているため, この部分の記述やシングルクォートに注意してください.

●リスト /pre-init

#!/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

○pre-initスクリプトでのブートテスト

ここで再度起動テストを行ないます.「boot:」のプロンプトで, 今度はroot=/dev/hda4のみ指定し,syslinux.cfgに記述したデフォルトの init=/pre-initの状態で起動します. これで/pre-initスクリプトが正常に動作すれば,tmpfsのマウントや tmpfs.tar.gzの展開が自動的に行なわれ,無事 tuxracer が起動するはずです.


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


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