ブートローダーは,一般にMBR(Master Book Record)などのハードディスクの先頭のセクタに保存され,OSのブートイメージ本体(Linuxの場合にはカーネル本体であるvmlinuzファイルの内容)を読み込んで実行する。
最初にx86システムをスタートアップすると,BIOSは,起動メディアがこれらのリムーバブル装置にない場合,BIOSはOSの格納場所とロードする場所の指定をハードディスクドライブの先頭のいくつかのセクターから探します。これらの先頭のセクター“ MBR ”は,事前に選択されているOSの起動プロセス,OSオプションのGRUBメニュー,特殊オプションを実行するためのGRUBコマンド行インターフェイスのいずれかを開始します。
GRUBのロードとそれに続くOSのロードプロセスはオペレーションの複数のステージで実行されます。4.2.1. ステージ1と呼ばれるプライマリブートローダーのロード。
プライマリブートローダーはMBRに割り当てられた512バイトよりも小さいスペースに格納する必要があります。したがってMBRには十分な容量がないため,プライマリブートローダーはセカンダリブートローダーのロードだけを行います。
4.2.2. ステージ2と呼ばれるセカンダリブートローダーのロード。
セカンダリブートローダーは,特定のOSをロードできる拡張機能を実行できるようにします。GRUBの場合は,メニューの表示かコマンドの入力を可能にするコードです。
4.2.3. 指定したパーティションへのLinuxカーネルなどのOSのロード。
OSを起動するための適切な命令をGRUBが受け取ると,コマンド行か設定ファイルから必要なブートファイルを検索してマシンの制御をOSに受け渡します。
4.2.4. ステージ1-5
ステージ1のブートローダーファイルからアクセスできないファイルシステムを使用しているパーティションにステージ2のブートローダーファイルが存在する場合,ステージ1のブートローダーに,ステージ2のブートローダーファイルの読み込みを可能にするステージ1-5ファイルからの追加命令をロードさせることができます。
Linuxで従来から利用されてきたブートローダーは,LILO(LInux LOader)でした。LILOは,ハードディスク上の特定のセクタからカーネルのブートイメージであるvmlinuzファイルを読み込んで実行される。この際に重要となるのは,LILOはvmlinuzファイルの保存場所をディレクトリ構造ではなく,セクタ位置(絶対的な場所)として認識する点です。このためカーネルを再構築するなどしてvmlinuzファイルを作り直した場合には,カーネルの位置をLILOに反映させるため,/sbin/liloコマンドを実行することによって,vmlinuzファイルの新しいセクタがLILOに伝えなければなりません。
もし,/sbin/liloコマンドの実行を忘れてマシンを再起動させてしまうと,vmlinuzファイルの位置が分からず起動に失敗します。
LILOは,前述したようにセクタを対象としてブートイメージの位置を把握する。すなわち,LILOはファイルシステムのフォーマットを認識しているわけではありません。それに対しGRUB(GRand Unified Bootloader)は,ファイルシステムを解釈し,ファイルシステム上のディレクトリパスでブートイメージを探し出すことが可能である。このため,GRUBが対応しているファイルシステム内の任意のファイルを実行することができる。現在,GRUBが対応しているファイルシステムを次に示す。4.4.1. GRUBが対応しているファイルシステム
BSD FFS
DOS FAT16 and FAT32
Minix   fs
Linux ext2fs
Reiser FS
ext3ファイルシステムは対応していないが,ext3ファイルシステムはext2ファイルシステムと互換性があるため,GRUBからの利用でも問題ない。 しかし,OSのすべてがファイルとしてブートイメージを格納しているわけではない。 たとえばWindows95,Windows98,Windows 2000などのOSは,ブートイメージというよりも独自のブートローダーを使用している。
このようなOSを利用する場合には,GRUBが持つ「チェインロード」と呼ばれる機能を使えばよい。チェインロード機能は,ハードディスク上の特定のセクタから読み込んだプログラムを直接実行する機能で,独自のブートローダーを使っているOSでもGRUBを利用できる。つまり,GRUBは汎用的なブートローダーであり,多種多様なサポートすることができるようになっている。
GRUBは,汎用的なブートローダーとしてだけでなくシェル機能を備え,GRUB上からファイルの中身を確認したり,起動するブートイメージを切り替えたりすることができる。そのため,万一起動しなくなった場合に別のブートイメージから起動するといった修復操作もしやすい。
さらに,シリアルケーブルで接続した別のコンピュータからログインして操作ができるほか,BOOTPプロトコルによるネットワークブートにも対応している。ブートイメージをハードディスク上から読み込んで実行するだけではなく,GRUB自体で各種操作ができるという,一種のユーザーインタフェース環境にもなっているのだ。この点がLILOとの大きな違いとなっている。
GRUBをインストールしてデフォルトのブートローダーに設定する方法。
シェルプロンプトから,コマンド/sbin/grub-install <location>を実行します。
<location>は,GRUBのインストール先を示します。例えば以下のようになります。[1.]# /sbin/grub-install /dev/had
最後にシステムをリブートします。
GRUBのグラフィカルブートローダーメニューが表示されます。
ただし,GRUBはブートローダーという性質上,万一設定を間違えると最悪の場合にはLinuxすら起動しなくなってしまう恐れがある。Windowsとのマルチブート環境であれば,なおさら注意が必要なので, GRUBによる起動フロッピーを作成しておけば,万が一ハードディスク上のGRUBで編集が失敗しても,起動フロッピーから起動して修復することができる。
作成するには幾つかの方法がある。中でも,grub-installコマンドを使うのが簡単である。
まずは次のようにしてフロッピーディスクをマウントし,ext3ファイルシステムでフォーマットしよう。ここでは,フロッピーディスクを/mnt/floppyにマウントしている。[1.]# /sbin/mke2fs /dev/fd0
[2.]# mount -t ext2 /dev/fd0 /mnt/floppy
[3.]# /sbin/grub-install—root-directory=/mnt/floppy ‘(fd0)’
[4.]# umount /mnt/floppy
4.8.2. grub-installコマンドでGRUBをインストール
フロッピーディスクの中にはbootディレクトリ,さらにその下にはgrubディレクトリが作成されてGRUBに関係するファイル一式がコピーされる。最後にアンマウントすれば,起動フロッピーディスクの作成が完了。 なお,この状態の起動フロッピーディスクはメニュー項目のファイルmenu.lstファイル(grub.conf)がコピーされていない。このため,起動時の画面にもメニュー項目は表示されず,直接GRUBのコマンドラインが実行される。ここでは必要なコマンドを入力し,手動で修復するなりOSを起動するといった操作になる。例えば,helpと入力すると利用できるコマンドの簡単なヘルプが表示される。メニュー項目を追加する方法としては,あらかじめ,grub.confをmenu.lstという名でコピーしておこう。
4.8.3. メニュー項目の設定ファイル(menu.lst)
ハードディスクが2台あり,1台目にWindowsXP,2台目にLinuxがインストールされている,ファイルの構成例。
[1.]# default=0
[2.]# timeout=10
[3.]# splashimage=(hd0,0)/grub/splash.xpm.gz
[4.]# title Windows
[5.]# root (hd0,0)
[6.]# makeactive
[7.]# chainloader +1
[8.]# title Red Hat Linux (2.4.7-10)
[9.]# root (hd1,0) #起動するデバイスを指定
[10.]# kernel /vmlinuz-2.4.7-10 ro root=/dev/sda2 #カーネルのファイル名を指定
[11.]# initrd /initrd-2.4.7-10.img # Linuxのカーネルイメージ指定
(起動するOSがLinuxの場合のみ,
利用するRAMディスクを提供するイメージファイルを設定する。)4.8.4. GRUBをハードディスクにインストール
[1.]# grub> root (fd0)
[2.]# grub> setup (hd0)
これで問題なくセットアップできればよいが,うまくいかない場合(1台目のハードディスクがNTFS)には,次の2行のように、2番目のハードディスクにセットアップしなければならない。[3.]# grub>root (fd0)
[4.]# grub>setup (hd1)
そして,1台目のハードディスク(hd0)のMBRに,stage 1_5,stage2を2台目のハードディスクの第1パーティション((hd1,1))に存在するものを利用するよう指定する。そのためには,次のようにinstallコマンドを用いればよい。[5.]# install (hd1)+1 d (hd0) (hd1,0)/grub/stage2 p (hd1,0)/grub/menu.lst
installコマンドは,先頭から順に「stage1_5の場所」hd1の先頭の次のセクタ(+1のセクタ)を利用し,「文字d」,「stage_1の場所」,「stage2の場所」hd1の1番目(0)にある/grub/stage2,「文字p」,「メニューファイルの場所」hd1の1番目(0)にある/grub/menu.lstを指定する。
第4章 おわり