8.4. GRUB を用いたブートプロセスの設定

8.4.1. はじめに

ブートローディングというものは複雑に入り組んでいます。 そこで注意すべき点を順に説明していきます。 ご自身が現時点で利用しているブートローダーが何であるのか、あるいはブートを必要とする他のオペレーティングシステムがハードドライブに存在しているかどうかについては、よく確認しておいてください。 またコンピュータが利用不能に (ブート不能に) なってしまうことに備えて、コンピュータを「復旧 (resucue)」するブートディスクの生成も忘れないでください。

これ以降の手順にて、 GRUB に関する特別なファイル類をハードドライブ上の所定ディレクトリに書き出します。 ここではバックアップ目的で GRUB のブートフロッピーディスケットを生成しておくことを強く推奨します。 空のフロッピーディスケットを挿入して以下を実行してください。

cd /tmp
grub-mkrescue --output=grub-img.iso
dd if=grub-img.iso of=/dev/fd0 bs=1440 count=1

または、ホストシステムにある CD ライティングツールを使えば、ブート CD を作ることもできます。 その場合は grub-img.iso を空の CD に書き込みます。

GRUB ではドライブやパーティションに対して (hdn,m) といった書式の命名法を採用しています。 n はドライブ番号であり m はパーティション番号です。 いずれもゼロから数え始めます。 ただしパーティションの番号は普通は1から数え始め、拡張パーティションは5から数え始めます。 かつてのバージョンでは共にゼロから数え始めていましたが、今はそうではないので注意してください。 例えばパーティション sda1(hd0,1) となり、パーティション sdb3(hd1,3) となります。 Linux システムでの取り扱いとは違って GRUB では CD-ROM ドライブをハードドライブとしては扱いません。 例えば CD が hdb であり2番めのハードドライブが hdc であった場合、2番めのハードドライブは (hd1) と表記されます。

ディスクデバイスを GRUB がどのような名称で取り扱うかを確認する場合は以下を実行してください。

grub-mkdevicemap --device-map=device.map
cat device.map

ブートパーティションをどこにするかは各人に委ねられていて、それによって設定方法が変わります。 推奨される1つの手順としては、ブートパーティションとして独立した小さな (100MB 程度のサイズの) パーティションを設けることです。 こうしておくと、この後に LFS であろうが商用ディストリビューションであろうが、システム導入する際に同一のブートファイルを利用することが可能です。 つまりどのようなブートシステムからでもアクセスが可能となります。 この方法をとるなら、新たなパーティションをマウントした上で、現在 /boot ディレクトリにある全ファイルを (例えば前節にてビルドした Linux カーネルも) 新しいパーティションに移動させる必要があります。 そしていったんパーティションをアンマウントし、再度 /boot としてマウントしなおすことになります。 これを行った後は/etc/fstab を適切に書き換えてください。

現時点での LFS パーティションでも問題なく動作します。 ただし複数システムを取り扱うための設定は、より複雑になります。

8.4.2. 設定作業

ここまでの情報に基づいて、ルートパーティションの名称を (あるいはブートパーティションを別パーティションとするならそれも含めて) 決定します。 以下では例として、ルートパーティション (あるいは別立てのブートパーティション) が sda2 であるとします。

以下を実行して GRUB ファイル類を /boot/grub にインストールします。

grub-install --grub-setup=/bin/true /dev/sda

ここでは --grub-setup=/bin/true を指定して、マスタブートレコード (Master Boot Record; MBR) への書き込みを行わないようにしています。 書き込みを行ってしまってから元に戻すのは大変な作業になります。 そこでここでは事前にテストを行う方法をとります。

/boot/grub/grub.cfg ファイルを生成します。

grub-mkconfig -o /boot/grub/grub.cfg

grub-mkconfig コマンドは /etc/grub.d/ ディレクトリにあるファイル類を利用して、上のファイルの内容を決定します。 上の設定ファイルは以下のようなものです。

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set default=0
set timeout=5
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry "GNU/Linux, Linux 2.6.37-lfs-6.8" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 915852a7-859e-45a6-9ff0-d3ebfdb5cea2
        linux   /boot/vmlinux-2.6.37-lfs-6.8 root=/dev/sda2 ro
}
menuentry "GNU/Linux, Linux 2.6.37-lfs-6.8" (recovery mode)" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 915852a7-859e-45a6-9ff0-d3ebfdb5cea2
        linux   /boot/vmlinux-2.6.37-lfs-6.8 root=/dev/sda2 ro single
}
menuentry "GNU/Linux, Linux 2.6.28-11-server" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 6b4c0339-5501-4a85-8351-e398e5252be8
        linux   /boot/vmlinuz-2.6.28-11-server root=UUID=6b4c0339-5501-4a85-8351-e398e5252be8 ro
        initrd  /boot/initrd.img-2.6.28-11-server
}
menuentry "GNU/Linux, Linux 2.6.28-11-server (recovery mode)" {
        insmod ext2
        set root=(hd0,2)
        search --no-floppy --fs-uuid --set 6b4c0339-5501-4a85-8351-e398e5252be8
        linux   /boot/vmlinuz-2.6.28-11-server root=UUID=6b4c0339-5501-4a85-8351-e398e5252be8 ro single
        initrd  /boot/initrd.img-2.6.28-11-server
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

[注記]

注記

  • このファイルを無闇に編集するのは避けるべきですが、 grub-mkconfig コマンドを再実行しない限りは、編集作業を行っても構いません。

  • search と書かれた行は LFS システムにとっては意味がありません。 そこに示されるコマンドは GRUB の内部変数をセットし、カーネルイメージを検索するためのものです。 set root コマンドの記述があれば、同等の機能が実現され、検索のオーバーヘッドを抑えることができます。

  • set rootinsmod ext2 の2つのコマンドは menuentry のセクションの外に記述することもできます。 そうすると本ファイル内のすべてのセクションに適用されるものとなります。 したがって個々のセクションは、例えば以下のように単純な記述とすることもできます。

menuentry "Linux 2.6.37-lfs-6.8" {
linux   /boot/vmlinux-2.6.37-lfs-6.8 root=/dev/sda2 ro
}

  • カーネルに対して UUID を指定する場合は、初期 RAM ディスク (initial ram disk; initrd) を必要としますが、 LFS ではこれを構築しません。

  • /boot パーティションが独立したパーティションとして設けられている場合は linux と initrd の行において /boot の記述は取り除く必要があります。

  • 上のサンプル記述では /boot に Ubuntu のカーネルファイルがインストールされている例を含んでいます。

8.4.3. 設定のテスト

GRUB のコアイメージ (core image) もマルチブートカーネル (Multiboot kernel) です。 したがって GRUB Legacy を既にインストール済であるなら、それまでの古いブートローダーを用いて新たな GRUB-1.98 をロードすることが可能です。 具体的な方法としては、今すぐ chroot 環境からいったん抜け出た上で、次節に示す方法で再度入り直し、本節の残りの作業を進めます。

/sbin/reboot
...
grub> root (hd0,1)
grub> kernel /boot/grub/core.img
grub> boot

上に示しているコマンドは GRUB Legacy であるものとして説明しています。 この時点で GRUB は (GRUB Legacy と非常に似た) プロンプトを表示します。 そこではさまざまな入力を行ったり、grub.cfg ファイルに定められているシステムを起動することもできます。

8.4.4. マスタブートレコードへの書き込み

上で示したように GRUB の設定に対するテストを終えたら、再び chroot 環境に入ります。

[警告]

警告

以下に示すコマンドを実行すると、現在のブートローダーを上書きします。 上書きするのが不適当であるならコマンドを実行しないでください。 例えばマスタブートレコード (Master Boot Record; MBR) を管理するサードパーティ製のブートマネージャソフトウェアを利用している場合などがこれに該当します。

以下により MBR を書き換えます。

grub-setup '<DEVICE>'

DEVICE の部分はブートディスクに応じて書き換えてください。 通常は '(hd0)' あるいは /dev/sda となるはずです。 (hd0) を指定する場合は、カッコの文字をバックスラッシュによりエスケープするか、シングルクォートで囲むようにしてください。 そうしておかないと、サブシェルを表わすものとして解釈されてしまうからです。

このプログラムは以下に示すデフォルト値を用います。 ここまでの手順において本書とは異なる方法をとっている場合は、適切に修正してください。

  • ブートイメージ - boot.img

  • コアイメージ - core.img

  • ディレクトリ - /boot/grub

  • デバイスマップ - device.map

  • デフォルトルート設定 - 自動推測

[注記]

注記

ルート設定は grub.cfg ファイル内にて 'set root' の指定がない場合のデフォルト値です。 これは、カーネルや他の関連ファイルが検出するパーティションとなり、 'linux' の設定行内にあるパラメータ 'root=' での設定内容とは異なります。 'root=' での設定は、カーネルが '/' としてマウントしたパーティションを意味します。 上に示した grub.cfg のサンプルでは、どちらも /dev/sda2 に設定していますが、ブートパーティションを別に用意している場合は設定値が異なることとなります。