PC UNIXの起動と起動ファイルの解読 |
YAMAMORI Takenori ●yamamori |
Linuxで,MBRにLILOが直接書き込まれている場合は,このLILOが直接Linuxカーネルを 読み込みます.しかし通常は,fdiskパーティションの先頭セクタに 各OSに対応した「次段階のブートローダ」が書き込まれており, MBR上のブートローダは,この「次段階のブートローダ」にいったん制御を移し, それからカーネルを読み込むのが普通です.
LinuxでもFreeBSDでも,UNIX系OSはカーネルの起動によって始まりますが, BIOSが直接カーネルを読み込むようなことはしません. その一番の理由は,カーネルのファイルサイズは通常1〜2Mバイト程度あり, そのままでは起動ディスクのブートセクタに収まらないことにあります.
また,ブートローダという段階を設けることにより, カーネルに対してオプションを付加することができたり, 別のカーネルファイルを指定することができたり, あるいは複数のOSを切替えて起動するブートマネージャ的な役割を持たせることも 可能になるなどの利点も得られます.
ところで,ブートローダ自身についても,ある程度複雑な処理を行なわせよう とするとそのファイルサイズが大きくなってしまい, 直接ブートセクタには収まらなくなります. そこで,ブートローダを読み込むための別のブートローダを用いるというように, ブートローダが複数段階に分かれている場合もあります(FreeBSDなど).
ブートローダのプロンプト上では,そのままデフォルトでのブートのほか, カーネルのファイル名やカーネルオプションを指定してのブートも可能です. この段階で入力されたオプションは,ブートローダ自身やカーネルによって 解釈されるほか,その先の/sbin/initにも渡されます. このため,ここで「boot -s」(FreeBSDなどの場合)と入力して シングルユーザモードで起動したり, 「linux 1」(Linuxの場合)と入力してランレベル1で起動したりすることもできます.
ブートローダはカーネルを読み込みます.ところが,ブートローダが動作している 時点では,当然,まだOSが立ち上がっていません. ブートローダが読み込むべきカーネルはハードディスクの中にあるものの, ハードディスクにアクセスするためのデバイスドライバがまだ読み込まれていません. そして,そのデバイスドライバもハードディスクの中にあります. まさに「鍵は鍵箱の中」状態です. この状態から抜け出すために,ブートローダはPCのBIOSコールを使って ハードディスクにアクセスし,カーネルを読み込みます.
この時,LILOでLinuxカーネルを読み込む場合は, ext2などのLinuxのファイルシステムを通さずに, ハードディスクの物理的なセクタを直接アクセスするという, ちょっと原始的な方法をとっています. (vmlinuzファイルを触った場合,LILOの再インストールが必要なのはこのためです) 一方,FreeBSDでは,少なくともカーネルの読み込みの段階では, ufsなどのファイルシステムに基づいてカーネルを読み込みます.