PC UNIXの起動と起動ファイルの解読

YAMAMORI Takenori ●yamamori

●ブートローダからカーネルの読み込みまで(起動5%〜10%)

Linuxで,MBRにLILOが直接書き込まれている場合は,このLILOが直接Linuxカーネルを 読み込みます.しかし通常は,fdiskパーティションの先頭セクタに 各OSに対応した「次段階のブートローダ」が書き込まれており, MBR上のブートローダは,この「次段階のブートローダ」にいったん制御を移し, それからカーネルを読み込むのが普通です.

LinuxでもFreeBSDでも,UNIX系OSはカーネルの起動によって始まりますが, BIOSが直接カーネルを読み込むようなことはしません. その一番の理由は,カーネルのファイルサイズは通常1〜2Mバイト程度あり, そのままでは起動ディスクのブートセクタに収まらないことにあります.

※注
例外として,Linuxの圧縮カーネルファイルであるvmlinuzは, そのファイルの先頭部分が一種の自己ブートローダになっており, vmlinuzを直接フロッピーディスクにddコマンドでベタ書きして, 通常のブートローダなしでブートすること(いわゆるrdev方式)も可能です.

ただしこの場合も,BIOSが読み込むのはあくまでvmlinuzの先頭部分のブートローダ部分のみであり,カーネル本体はやはりこのブートローダによって読み込まれていることになります.

また,ブートローダという段階を設けることにより, カーネルに対してオプションを付加することができたり, 別のカーネルファイルを指定することができたり, あるいは複数のOSを切替えて起動するブートマネージャ的な役割を持たせることも 可能になるなどの利点も得られます.

ところで,ブートローダ自身についても,ある程度複雑な処理を行なわせよう とするとそのファイルサイズが大きくなってしまい, 直接ブートセクタには収まらなくなります. そこで,ブートローダを読み込むための別のブートローダを用いるというように, ブートローダが複数段階に分かれている場合もあります(FreeBSDなど).

○カーネルオプションの指定

ブートローダのプロンプト上では,そのままデフォルトでのブートのほか, カーネルのファイル名やカーネルオプションを指定してのブートも可能です. この段階で入力されたオプションは,ブートローダ自身やカーネルによって 解釈されるほか,その先の/sbin/initにも渡されます. このため,ここで「boot -s」(FreeBSDなどの場合)と入力して シングルユーザモードで起動したり, 「linux 1」(Linuxの場合)と入力してランレベル1で起動したりすることもできます.

※注
FreeBSDでは,ブートローダの途中で[Enter]以外のキーを押すことにより, okプロンプトを出すことができ,ここでbootコマンドをオプション付きで 入力できます.
○カーネルの読み込み

ブートローダはカーネルを読み込みます.ところが,ブートローダが動作している 時点では,当然,まだOSが立ち上がっていません. ブートローダが読み込むべきカーネルはハードディスクの中にあるものの, ハードディスクにアクセスするためのデバイスドライバがまだ読み込まれていません. そして,そのデバイスドライバもハードディスクの中にあります. まさに「鍵は鍵箱の中」状態です. この状態から抜け出すために,ブートローダはPCのBIOSコールを使って ハードディスクにアクセスし,カーネルを読み込みます.

この時,LILOでLinuxカーネルを読み込む場合は, ext2などのLinuxのファイルシステムを通さずに, ハードディスクの物理的なセクタを直接アクセスするという, ちょっと原始的な方法をとっています. (vmlinuzファイルを触った場合,LILOの再インストールが必要なのはこのためです) 一方,FreeBSDでは,少なくともカーネルの読み込みの段階では, ufsなどのファイルシステムに基づいてカーネルを読み込みます.


To『PC UNIXの起動と起動ファイルの解読』[index]


このページは、技術評論社 「SoftwareDesign 2001年9月号、『起動ファイルから解読するPC UNIX』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 [Home]
yamamori