トップ > コンピューティング環境 > ブートセレクタとブートローダの話

[前ページ][次ページ]


ブートセレクタとブートローダの話

Author: Takeshi Fujiyoshi
Last update: 2010/07/04

目次

用語

MBR (Master Boot Record)
ハードディスクの先頭セクタ。 パーティション情報とブートセレクタまたはブートローダが格納される。
PBR (Partition Boot Record)
パーティションごとの先頭セクタ。 OSごとのブートローダ(カーネルローダ)が格納されたりされなかったり。
ブートセレクタ
起動するOSをユーザに選択させるプログラム。
ブートローダ
OSのカーネルをハードディスクからメモリにロードして実行するプログラム。

NetBSD/i386 の話

NetBSD/i386 はブートセレクタとブートローダを両方持っている。

ブートセレクタ

NetBSD/i386 標準のブートセレクタは MBR に格納される。 あらかじめ設定されたメニューを画面に表示し、 ユーザが数字キーで指定したパーティションの PBR をロードして 実行するだけのシンプルなものである。

こんな画面:

Fn: diskn
1: Windows
2: NetBSD

メニューの文字列は MBR の中に埋め込まれるため、 GRUB など他のブートセレクタを MBR にインストールすると消えてしまう。

ブートセレクタの書き込み

ブートセレクタの書き込みには fdisk コマンドを使用する。

  1. fdisk を実行:

    # fdisk -u wd0
    (wd0 は対象とするストレージのデバイス名。/dev/rwd0d でも同じ)
    
  2. 何か聞かれるが、単に ENTER を押して先に進む:

    Do you want to change our idea of what BIOS thinks? [n]
    
  3. パーティション情報が表示される

    例: 筆者の環境:

    Partition table:
    0: Compaq diagnostics (sysid 18)
        start 63, size 10233342 (4997 MB, Cyls 0/1/1-636)
            beg: cylinder    0, head   1, sector  1
            end: cylinder  636, head 254, sector 63
            PBR appears to be bootable
    1: NTFS, OS/2 HPFS, QNX2 or Advanced UNIX (sysid 7)
        start 10233405, size 94365810 (46077 MB, Cyls 637-6510), Active
            beg: cylinder  637, head   0, sector  1
            end: cylinder 1023, head 254, sector 63
            PBR appears to be bootable
    2: NetBSD (sysid 169)
        start 104599215, size 104454630 (51003 MB, Cyls 6511-13012)
            beg: cylinder 1023, head   0, sector  1
            end: cylinder 1023, head 254, sector 63
            PBR appears to be bootable
    3: Ext. partition - LBA (sysid 15)
        start 209053845, size 72710190 (35503 MB, Cyls 13013-17538)
    Extended partition table:
    E0: Linux swap or Prime or Solaris (sysid 130)
        start 209053908, size 2056257 (1004 MB, Cyls 13013-13140)
            PBR is not bootable: All bytes are identical (0x00)
    E1: Linux native (sysid 131)
        start 211110228, size 59392242 (29000 MB, Cyls 13141-16837)
            PBR is not bootable: All bytes are identical (0x00)
    E2: Linux native (sysid 131)
        start 270502533, size 10249407 (5005 MB, Cyls 16838-17475)
            PBR is not bootable: All bytes are identical (0x00)
    First active partition: 1
    Drive serial number: 296270392 (0x11a8ba38)
    
  1. ブートセレクタのメニュー設定

    ブートセレクタに組み込みたいパーティションごとに以下を行なう。

    1. パーティション番号を入力 (基本パーティションは 0,1,2,3、拡張パーティションは E0, E1, ...)
    2. sysid、start、size を聞かれるが単にENTER (変更なし)
    3. bootmenu を聞かれるのでメニューに表示したい文字列を入力

    初回だけ、ブートセレクタをインストールするかどうかなど聞かれるので 全部 y を入力。 表示されるパーティション情報の中に bootmenu が追加されているはずである。

    メモ: bootmenu の削除は空白文字+ENTER

  2. MBR を書き込む

    パーティション番号を入力するところで単に ENTER すると 新しいパーティションテーブルを書込むか聞かれるので、 y を入力するとMBR が更新され、fdisk コマンドが終了する。

ブートセレクタの細かい設定

タイムアウトとデフォルトパーティションの設定:

# fdisk -B wd0   (または /dev/rwd0d)

Boot selector configuration:
Timeout value (0 to 3600 seconds, -1 => never): [-1..3600 default: 10] -1
Select the default boot option. Options are:

0: The first active partition
1: Windows
2: NetBSD
3: Harddisk 0
Default boot option: [0..3 default: 0] 0

We haven't written the MBR back to disk yet.  This is your last chance.
Should we write new partition table? [n] y

拡張パーティション対応のブートセレクタを使う:

# fdisk -B -c /usr/mdec/mbr_ext wd0
Update the bootcode from /usr/mdec/mbr_ext? [n] y

あとは同じ

ブートローダ

NetBSD/i386 のブートローダは、パーティション・ブートコード、 プライマリ・ブートコード、セカンダリ・ブートコードから構成される。

パーティション・ブートコード
NetBSD パーティションの PBR (セクタ0)に格納される。 このプログラムはプライマリ・ブートコードをロードして実行する。
プリマリ・ブートコード
NetBSD パーティションのセクタ2〜セクタ14に格納される。 このプログラムはセカンダリ・ブートコードをロードして実行する。
セカンダリ・ブートコード
NetBSD のファイルシステム上にファイル(通常は /boot)として格納される。 このプログラムはあらかじめ設定されたメニューを画面に表示し、 ユーザの操作に従って NetBSD カーネルをロードして実行する。

こんな画面:

>> NetBSD/x86 BIOS Boot, Revision 5.4 (from NetBSD 5.99.29)
>> Memory: 639/1035392 k

     1. Boot normally
     2. Boot single user
     3. Disable ACPI
     4. Disable ACPI and SMP
     5. Drop to boot prompt

Choose an option; RETURN for default; SPACE to stop countdown.
Option 1 will be chosen in 5

ブートローダの書き込み

ブートローダの書き込みには installboot コマンドを使用する。 手順は installboot(8) のマニュアルに書いてある通り。

  1. セカンダリ・ブートコード /usr/mdec/boot をルートディレクトリにコピー:

    # cp /usr/mdec/boot /
    
  2. パーティション・ブートコードとプライマリ・ブートコードを書き込む

    1. ルートパーティションのファイルシステムが FFSv1 のとき:

      # installboot /dev/rwd0a /usr/mdec/bootxx_ffsv1
      
    2. ルートパーティションのファイルシステムが FFSv2 のとき:

      # installboot /dev/rwd0a /usr/mdec/bootxx_ffsv2
      

    FFSv1 か FFSv2 のどちらなのかは dumpfs(8) で確認できる。

ブートローダの設定

ブートローダの動作は /boot.cfg により制御できる。

/boot.cfg の初期状態の内容:

menu=Boot normally:boot netbsd
menu=Boot single user:boot netbsd -s
menu=Disable ACPI:boot netbsd -2
menu=Disable ACPI and SMP:boot netbsd -12
menu=Drop to boot prompt:prompt
default=1
timeout=5
clear=1

詳しくは boot.cfg(5) のマニュアルを参照のこと。

GRUB の話

GRUB はブートセレクタとブートローダの両方の機能を含んでいる。

ブート方式の種類

GRUB が OS を起動する方法は大きく分けて二種類ある。

チェインロード方式
GRUB は対象 OS のパーティションの PBR をロードして実行する。 この場合、カーネルのロードと実行は OS のブートローダが行なう。 この方式では、対象 OS は自身のブートローダを持っていなければならない。
直接ロード方式
GRUB 自身が対象 OS のカーネルをメモリにロードして実行する。 この方式では、GRUB が対象 OS のファイルシステムとカーネルの ファイル形式の両方に対応していなければならない。

たぶん殆どの OS ではチェインロード方式を使うのが自然である。 直接ロード方式の利点はあまり思い付かない。

インストール

NetBSD では pkgsrc/sysutils/grub から make install でインストールできる (2010/6/23 現在のバージョンは 0.97)。 Linux については知らないが、きっとパッケージがあるんだろう。

コンフィグファイルの作成

コンフィグファイル /grub/menu.lst を作成する。

例: 筆者の環境:

default 0

title Windows
  root (hd0,1)
  chainloader +1

title NetBSD
  root (hd0,2)
  chainloader +1

title Debian GNU/Linux
  root (hd0,6)
  kernel /vmlinuz

title reboot
  reboot

title Poweroff
  halt

パーティションの PBR をロードして実行する場合は chainloader コマンドを 使用する。一方、ファイルシステムからカーネルを直接ロードして実行する 場合は kernel コマンドを使用する。

Linux では後者(直接ロード)が一般的な様子だが(知らないけど)、 GRUB がそのファイルシステムに対応していないと使えない。 筆者が試した GRUB 0.97 は Ext2 ファイルシステムには対応しているけど Ext3 ファイルシステムには対応していないようだった。 GRUB2 という新しいやつは対応しているとかいう話。

GRUB の書き込み

コンフィグファイル /grub/menu.lst を作成したあと、 grub-install を実行する。

NetBSD の場合:

# grub-install /dev/rwd0d

これにより、/grub 以下に必要なファイルが格納され、 MBR に ステージ1 のプログラムが書き込まれる。

GRUB の実行

マシンを再起動すると GRUB が起動してメニューが表示される。

メニュー画面で 'c' をタイプするとコマンドラインに落ちるので、 直接コマンドを入力して起動パラメータを指定して起動することも可能。 設定を間違えて起動できないときは必要。

例:

メニューで c をタイプ -> コマンドラインに落ちる

grub> root (hd0,2)
 Filesystem type unkown, partition type 0xa9
grub> chainloader +1
grub> boot

これでハードディスク0のパーティション2の PBR が実行される。

メモ: (hd0,2,a) のように BSD ディスクラベルのパーティションまで 直接指定することも可能。 wd0a がパーティションの先頭ではなかったり a パーティション以外に ブートコードが格納されていることは稀だと思うけど一応。

プログラムの構成

grub-install でインストールされる GRUB のプログラムは、 ステージ1、ステージ1.5、ステージ2 から構成される。

ステージ1
MBR または PBR に格納される。 このプログラムは ステージ1.5 または ステージ2 をロードして実行する。 ファイルシステムの構造は理解せず、 ステージ1.5 または ステージ2 の場所をブロックリスト形式で保持している。
ステージ1.5
ファイルシステム上にファイルとして格納される。 ファイル名は e2fs_stage1_5、fat_stage1_5、ffs_stage1_5 など ファイルシステムごとに個別に存在する。 これらのプログラムはファイルシステムの構造を理解し、 ファイルシステムからステージ2をロードして実行する。
ステージ2
GRUB のコアプログラム。全てのファイルシステムサポートを含んでいる。 ファイルシステム上に stage2 というファイル名で格納される。

思うこと

GRUB のドキュメントには 「複数のローダを管理しなくても良いからチェインロード方式よりも 直接ロード方式の方が好ましい」と書かれているが、 1台の PC に複数の OS を入れて切り替えて運用してるような人が ローダの管理が面倒だなんて思うだろうか。

直接ロード方式をサポートするためには多種のファイルシステムに対応する 必要があるため、プログラム肥大化 → MBR に入らない → パーティション内に配置 → 特定 OS 環境に依存し、あまり良いとは言えない。 それに比べると、ブートセレクタ+チェインロード方式では ファイルシステムに依存するコードは各ファイルシステム自身に含まれるため プログラムが小さくなり独立性も高い。

GRUB のような汎用ローダが役に立つ場面はあると思う。 例えば、OS 標準のローダが壊れたり設定ミスで起動しなくなったとき 非常用として使えると安心だ。 あるいは、OS やブートローダ自体を開発する場合に既に使えるローダが あるのは便利かも知れない。


トップ > コンピューティング環境 > ブートセレクタとブートローダの話

[前ページ][次ページ]