実際にFedora Core 5(以下、FC5)でのinitrdを見てみよう。
FC5で使われているinitrdはcpio+gzipで作成されている。cpioはold ASCII形式となっているので「-c
」スイッチをつけて作成、展開を行う。
実際にFC上で以下のように実行するとinitrdを展開できる。cddirはお好きなように。
# mkdir bootroot; cd bootroot; zcat initrd | cpio -i -c
実際に展開されたツリーを眺めてみると、非常に小振りなLinuxシステムを構成していることが分かるだろう。
このinitrdの中に詰め込まれているファイルの中でも、最も注目してほしいのがルートに存在している「init」というファイルである。古いシステムだと「linuxrc」なので、どちらか見つかった方を参照してもらいたい。
このinitの正体は、initrdでやるべきことが収められているシェルスクリプトである。
FC5のinitでは、ファイルの先頭に
#!/bin/nash
と書かれているのを確認できる。
nashというのはRed Hatのシェルスクリプト実行専用のシェルで、主にinitrdのためのものである。もちろんnash自身も/bin
に含まれている。
initの中身を追いかけてみるとおおよそ次のような作業を行っている。
-
/dev
や/proc
といったシステムディレクトリの作成とマウント - デバイスの作成
- ドライバモジュールのロード
- USBドライバが安定して接続機器が見えるようになるまで数十秒のウェイト
- ルートファイルシステムのマウント
- pivot_root(switchroot)
PS3用のFC5では、5番目のファイルシステムマウント部分で、/dev/sda1
というHDD上のパーティションに決めうちでマウントしている。ここからもinitrdの編集なしにCDブートシステムを作成できないことが分かる。
以上から、CDブートLinuxのために行う修正は
- CD/DVDのファイルシステムモジュールを組み込む(iso9660/udf)
- 内蔵CD/DVDドライブのディスクをマウントする(
/dev/sdc1
) - 初期化作業があったらpivot_rootの前に追加する
といったところになる。
なお、initrd内で決めうちとなっていることからもわかるように、FC5のインストールは内蔵HDD前提となっており、USB外付けのHDDやフラッシュメモリには行えないようになっている。
しかし、その問題もkbootとinitrdの動作を把握することで回避可能であることが理解してもらえるだろう。