目次
NetBSD/i386 はブートセレクタとブートローダを両方持っている。
NetBSD/i386 標準のブートセレクタは MBR に格納される。 あらかじめ設定されたメニューを画面に表示し、 ユーザが数字キーで指定したパーティションの PBR をロードして 実行するだけのシンプルなものである。
こんな画面:
Fn: diskn 1: Windows 2: NetBSD
メニューの文字列は MBR の中に埋め込まれるため、 GRUB など他のブートセレクタを MBR にインストールすると消えてしまう。
ブートセレクタの書き込みには fdisk コマンドを使用する。
fdisk を実行:
# fdisk -u wd0 (wd0 は対象とするストレージのデバイス名。/dev/rwd0d でも同じ)
何か聞かれるが、単に ENTER を押して先に進む:
Do you want to change our idea of what BIOS thinks? [n]
パーティション情報が表示される
例: 筆者の環境:
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)
ブートセレクタのメニュー設定
ブートセレクタに組み込みたいパーティションごとに以下を行なう。
初回だけ、ブートセレクタをインストールするかどうかなど聞かれるので 全部 y を入力。 表示されるパーティション情報の中に bootmenu が追加されているはずである。
メモ: bootmenu の削除は空白文字+ENTER
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/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) のマニュアルに書いてある通り。
セカンダリ・ブートコード /usr/mdec/boot をルートディレクトリにコピー:
# cp /usr/mdec/boot /
パーティション・ブートコードとプライマリ・ブートコードを書き込む
ルートパーティションのファイルシステムが FFSv1 のとき:
# installboot /dev/rwd0a /usr/mdec/bootxx_ffsv1
ルートパーティションのファイルシステムが 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 が 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/menu.lst を作成したあと、 grub-install を実行する。
NetBSD の場合:
# grub-install /dev/rwd0d
これにより、/grub 以下に必要なファイルが格納され、 MBR に ステージ1 のプログラムが書き込まれる。
マシンを再起動すると 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 から構成される。
GRUB のドキュメントには 「複数のローダを管理しなくても良いからチェインロード方式よりも 直接ロード方式の方が好ましい」と書かれているが、 1台の PC に複数の OS を入れて切り替えて運用してるような人が ローダの管理が面倒だなんて思うだろうか。
直接ロード方式をサポートするためには多種のファイルシステムに対応する 必要があるため、プログラム肥大化 → MBR に入らない → パーティション内に配置 → 特定 OS 環境に依存し、あまり良いとは言えない。 それに比べると、ブートセレクタ+チェインロード方式では ファイルシステムに依存するコードは各ファイルシステム自身に含まれるため プログラムが小さくなり独立性も高い。
GRUB のような汎用ローダが役に立つ場面はあると思う。 例えば、OS 標準のローダが壊れたり設定ミスで起動しなくなったとき 非常用として使えると安心だ。 あるいは、OS やブートローダ自体を開発する場合に既に使えるローダが あるのは便利かも知れない。