PS3で利用するブートローダはkbootとも呼ばれている。PS3 Linux Distributor's Starter Kit(PS3 Linux Addon CD、以下Addon CD )にはカーネルソースと共に、kbootの全ソースコードが入っているが、これを眺めるとkbootは以下の図のような構成になっていることが分かる。
otheros.bldというバイナリファイルは、Linuxカーネルとinitrdをひとまとめにしたものである。
通常、カーネルとinitrdは別々のファイルになっており、起動時にはカーネルがロードされた後initrdが読み込まれるが、kbootではカーネルのロードとともにinitrdがくっついてきてそれを利用する。PS3向けのLinuxカーネルパッチにはこのメモリポインタ指定によるinitrdの実行が含まれているところが興味深い。
このように、kbootの正体はLinuxカーネルそのものである。
だが、このカーネルはLinuxシステムを構築するためではなく、あくまでもう1つのカーネルを起動するためだけに存在している。
ブートローダとして起動すべきカーネルを読み込んだ後は、kexecと呼ばれる仕組みを用いてその新しいカーネルを起動する。kexecについては個別に調べてもらいたいところだが、要するに現在起動しているカーネルを、新たに読み込んだカーネルで上書きして起動し直すといった動作を行っている。
だから、PS3Linuxを起動する際、ペンギンが2回出てきて同じようなことをやっているように見える。初回はkbootのカーネルが起動している場面で、2回目はkbootが読み込んだカーネルが起動している場面である。
なぜにわざわざカーネルそのものをブートローダにしているのかというといろいろ理由は考えられるが、Linuxがサポートしているドライバとファイルシステムを使ってディスクのどこにシステムがあるのかを探せるといったあたりが有利なためではないだろうか。
/etc/kboot.conf
さて、Fedora Coreインストールのために使われるotheros.bldはAddon CDに含まれるものであるが、このkbootが次にどこからカーネルを読み出して起動するかは/etc/kboot.conf
という設定ファイルにて指定される。
この/etc/kboot.conf
自体はどこにあるものを読んでくるかというと、次の3パターンのうち先に見つけたものとなる。
- CD/DVD/BD-ROMディスク(UDFまたはISO9660)
- EXT2フォーマットされ、BOOTMCというラベルのついているUSBストレージまたはメモリカード
- 内蔵HDD(
/dev/sda
)
その後はkboot.confに記述された場所からカーネルを読み込み起動するが、カーネルの読み込み自体はストレージだけでなくネットワーク経由のダウンロードでも可能である。また、kboot.confが存在せずともカーネルの位置をキーボードから直接指定することで任意場所から読み込ませることが可能となっている。
そのようなことからkbootが立ち上がった後のシステム構成は割と柔軟になっている。
ここで注目してほしいのは、kboot.confを読み込む手順で最も優先順位が高いところにCD/DVDが存在しているところである。
つまり、現状のkbootはCDからの起動にも対応しているため、今回は改変せずにそのまま利用することが可能だ。
CDブートLinuxの作成でkbootに対して行うことは、CD上に/etc/kboot.conf
を用意してやることと、起動するカーネルとinitrdをkboot.conf内に記述してやることとなる。
この時カーネルとinitrdの位置はCD上のファイルシステムになるので、CD上にカーネルとinitrdを置いてやる必要があるだろう。