Linux道場入門編
第5回ブートローダ
今回はブートローダのお話です。ブートローダとはOSを起動するためのソフトウェアのことで、通常OSとセットになっているためブートローダだけを意識することはあまりないかもしれません。特にWindowsのようなOSは、OS一式を1ベンダが開発をしているため、ブートローダを意識することはあまりないかと思います。しかし、PC上でのOSの起動には、必ずブートローダを利用するという仕組みが必要であり、ブートローダというS/Wなしに、現在のストレージデバイスから巨大なS/WであるOSが起動する仕組みは作れないでしょう。今回はそのあたりの仕組みも含めてお話します。
PCの起動
基本的にコンピュータが起動するフローには、物理的(H/W)なアプローチから論理的(S/W)なアプローチに切り替わるタイミングというものがあります。その切り替わるタイミングというのはコンピュータの役割や物理的な構成によって異なるため、一概には同様とはいえませんが、ここではPCを例にとってその起動シーケンスの考えてみます。PCの起動シーケンスは大きく以下のようになります。
- 電源投入
↓ - BIOSによるデバイス初期化
↓ - ブートデバイスの決定
↓ - ブートストラップローダのロード
↓ - ブートローダの実行
↓ - OSの起動
PCの電源を投入すると、マザーボードのフラッシュROMに書き込まれたBIOS(Basic Input/Output System)というソフトウェアが起動します。このBIOSの初期化プログラムが、PCに接続されている各種デバイスの初期化を行います。この過程を POST(Power On Self Test)といいます。POSTの段階で最初に初期化が行われるのはビデオカードです。
このビデオカードの初期化が終わるとよく目にするBIOSの初期化状況を表示する画面になります。
各種デバイスの初期化が終了すると、BIOSは次の段階に入り、起動するためのドライブを探します。起動ドライブとなるのは通常FDD、HDD、 CD-ROMなどです。BIOSは起動ドライブを見つけるとそのデバイスをファーストブートドライブとして起動を試みます。最初にブートドライブとして何のデバイスが認識されるかはBIOSの設定次第ですが、ここではHDDの起動を中心に見ていきます。HDDの接続については、前回の「第四回 LinuxとH/W(PC)」でお話しましたが、IDEインターフェイスのHDDでは接続の場所によってブートの優先度が自動的に決まります。(優先度の最も高いのはプライマリのマスタです)こういったブートドライブとなりうるデバイスの中の最も優先順位が高いデバイスを、BIOSはブートドライブとして決定することになります。
ブートドライブが決定すると、BIOSはそのブートドライブの先頭セクタのロードという段階に移ります。HDDでは先頭セクタのことを MBR(Master Boot Record)といい、MBRは1台のHDDに1つしか存在しません。BIOSはこのMBRをメモリ上にロードし、MBR領域にあるプログラムに制御を移します。このMBR領域にあるプログラムを、一般的にブートストラップローダと呼びます。
ブートストラップローダは、実行のなかでパーティションテーブルから起動フラグのあるパーティションを探します。パーティションテーブルとは、複数のパーティションに関する情報が保存されているMBR内の1つの領域です。この起動フラグのあるパーティションにブートストラップローダから制御が移行します。そのとき、ブートストラップローダから呼び出されるのが各基本パーティションにあるブートセクタになります。ブートセクタは各基本パーティションの先頭セクタのことを指し、PBR(Partition Boot Record)とも呼ばれます。
PBRに制御が移行すると、そのPBRのプログラムコードが動作することになります。このPBRにあるプログラムコードが IPL(Initial Program Loader)と呼ばれるもので、OSを起動させるためのブートローダの残りの機能を呼び出す機能を持ちます。
- ※ブートローダの残りの機能はブートローダの2ndステージとも呼ばれます。
MBRやPBRは512バイトと非常に小さな領域しかもっていません。そのなかの一部であるIPLのデータサイズはさらに小さなものになります。この小さなデータサイズにOSを起動させるためのブートローダのプログラムを全て格納することは困難です。そのためIPLはブートローダの一部のプログラムコードを持ち、ブートローダの残りに機能はPBRの後続セクタに置くかたちになっています。IPLから呼び出されたブートローダが後続のOSのファイルを読み込んでいき、最終的にOSが起動していくことになります。
- ※LinuxのブートローダをMBR領域に格納した場合は、そのMBR領域のプログラムがパーティションのブートローダを起動する形になっています。
Linuxのブートローダ
現状ではLinuxのデフォルトのブートローダにはLILO(LInux LOader)とGRUB(GRand Unified Bootloader)が採用されています。LILO、GRUBなどのブートローダの役目はOSの本体である、カーネルをロードすることにあります。この 2つはブートローダという点においては同じ物ですが、それぞれカーネルのロードまでの工程が異なります。
- LILO(LInux LOader)
- LILOは古くからLinuxで利用されてきたブートローダです。特徴としてはカーネルの位置情報をLILO自身内部に情報として持ち、その情報からカーネルをロードするというものです。LILOは後述するファイルシステムを認識しないため、カーネルの位置をHDDの物理的な位置情報で判断しています。この物理的な位置情報をブロックリストといいます。
LILOはこのブロックリストを自身の内部に保持しており、ブロックリストを参照してカーネルをロードします。そのためLILOは「ブロックリスト参照型」のブートローダといわれます。 - GRUB(GRand Unified Bootloader)
- GRUBは高性能ブートローダでLILOとはことなる仕組みをもちます。GRUBの特徴の1つにファイルシステムを認識できることがあげられますが、これはLILOとはことなりカーネルの位置をファイルパスで指定することができることを意味しています。このようなタイプを「ファイルシステム認識型」といいます。
こういったLILOやGRUBの動作を経て、カーネルがロードされることになるわけですが、このカーネルがロードされてからがOS自身の起動シーケンスであり、カーネルの制御下でOSとして機能するための様々な処理が行われます。
コラム執筆/末永 貴一
株式会社エイチアイ研究開発部 部長
ヒューマンインターフェイスの研究開発、コンテンツの開発を行う株式会社エイチアイで次世代技術の研究開発を行う業務を担当している。 オープン系のシステム開発事業、教育事業を経て、自社独自の組込み機器向け3DリアルタイムレンダリングエンジンであるミドルウェアのMascotCapsuleを中心とした開発に従事した。数年前にLinuxを知ってからはサーバ構築、開発、教育、執筆などさまざまな場面で関わるようになり、現在では組込み開発でもLinuxを利用することもある。