/* * boot process of FreeBSD/i386 * by uratan! 2011.11.21 */
FreeBSD/i386 (8.2-RELEASE) で、HDD から標準的にブートする場合には 以下の boot strap を経由します。
配置 略称 名称・機能 ファイル 備考 / ソース / 他 disk先頭
(LBA 0)mbr standard MBR
起動slice先頭を読んで実行/boot/mbr
(仮置き)fdisk -B にて書き込むべし
/usr/src/sys/boot/i386/mbr/boot0 FreeBSD Boot Manager
(mbr代替、起動sliceを対話選択)/boot/boot0
(仮置き)fdisk -B にて書き込むべし
/usr/src/sys/boot/i386/boot0/FreeBSD
slice先頭boot1
+
boot2引き続く boot2 を読んで実行 /boot/boot1
(仮置き)bsdlabel -B にて書き込むべし
/usr/src/sys/boot/i386/boot2/
(man 8 boot)/boot/loader を読んで実行
対話的インターフェースあり/boot/boot2
(仮置き)ufs上 loader /boot/kernel/kernel を読んで実行 /boot/loader ファイル上書きで差し替わる
/usr/src/sys/boot/i386/loader/
(man 8 loader)
ここで、
- boot1, boot2, loader をもって 3stage boot strap と呼ぶようです。
- /usr/src/sys/boot/i386/ にて make install すると /boot/ 以下に ファイルがコピーされますが、上の表のように単に仮置きされているだけ のものも多いです。
- bsdlabel -B では boot1 と boot2 を繋いだ(だけの) /boot/boot というファイルを指定します。
- fdisk -B、bsdlabel -B は使用しているディスクには書き込めません。 CD などからブートして書き換える必要があります。
console に出力されるメッセージとブートプロセスの対比を示します。
(*1) の prompt の時に何かキーを押すと 以下の通り boot2 の 対話処理に入れます。
+-------------------------------------- |Verifying DMI Pool Data ...... |Boot from CD : <== ここまで BIOS による出力 |- <== boot2 による prompt (*1) +-------------------------------------- ↓ ↓ ↓ +-------------------------------------- |Verifying DMI Pool Data ...... |Boot from CD : | |BTX loader 1.00 BTX version is 1.02 <== タイムアウトで /boot/loader が起動 |Consoles: internal video/keyboard |BIOS drive C: is disk0 |BIOS 638kB/981952kB available memory | |FreeBSD/x86 bootstrap loader, Revision 1.1 |(root@almeida.cse.buffalo.edu, Fri Feb 18 01:25:00 UTC 2011) |Loading /boot/defaults/loader.conf |/boot/kernel/kernel text=0x8e7781 * +-------------------------------------- ↓ ↓ ↓ +-------------------------------------- | <== /boot/beastie.4th に至ってこれが | Welcome to FreeBSD! | FFFFF eee eee | F r rr e e e e | 1. Boot FreeBSD [default] FFFF rr eeeee eeeee | 2. Boot FreeBSD with ACPI disabled F r e e | 3. Boot FreeBSD in Safe Mode F r eeee eeee | 4. Boot FreeBSD in single user mode | 5. Boot FreeBSD with verbose logging BBBBB SSSSS DDDDD | 6. Escape to loader prompt B B S D D | 7. Reboot BBBBB SSSS D D | B B S D D | BBBBB SSSSS DDDDD | | Select option, [Enter] for default | or [Space] to pause timer N +--------------------------------------
この '-' は prompt だと思っていましたが、boot1 が boot2 を読み込む時に出る
グルグル('-'→'\'→'|'→'/')の単なる残骸のようです。
+-------------------------------------- |Verifying DMI Pool Data ...... |Boot from CD : |- <== boot2 に対してキー打鍵 +-------------------------------------- ↓ ↓ ↓ +-------------------------------------- |Verifying DMI Pool Data ...... |Boot from CD : |- |FreeBSD/x86 boot |Default: 0:ad(0,a)/boot/loader |boot: _ <== コマンド待ちに +--------------------------------------
参考として、CD からブートした場合は以下の通りです。
+-------------------------------------- | |Verifying DMI Pool Data ...... |Boot from CD : <== ここまで BIOS による |CD Loader 1.2 <== cdboot ? | |Building the boot loader arguments |Looking up /BOOT/LOADER... Found |Relocating the loader and the BTX |Starting the BTX loader | |BTX loader 1.00 BTX version is 1.02 <== loader ? |Consoles: internal video/keyboard |BIOS CD is cd0 |BIOS drive C: is disk0 |BIOS 638kB/981952kB available memory | |FreeBSD/x86 bootstrap loader, Revision 1.1 |(root@almeida.cse.buffalo.edu, Fri Feb 18 01:25:00 UTC 2011) |Loading /boot/defaults/loader.conf |* +--------------------------------------
/boot/loader の make には kernel source 以外にも /usr/src/lib/libstand/ にある *.h が必要です。
これは library (slib.*) に含まれます。 make 手順は以下の通り。このレイヤーでは Makefile に依存関係が完全に記述してないらしく、 毎度 make clean したほうが無難なようです。
[1] extract kernel sources(ssys), and libraries (slib) # mount /cdrom # cd /cdrom/8.2-RELEASE/src/ # ./install.sh sys # ./install.sh lib [2] make zfs and ficl libraries # cd /usr/src/sys/boot/zfs # make # cd /usr/src/sys/boot/ficl # make [3] make boot codes # cd /usr/src/sys/boot/i386 # make clean # make [4] install # cd /usr/src/sys/boot/i386 # make install
また上の make install では、/boot/ の(仮置き)ファイルのみが更新されます。 /boot/loader はこれで差し代わるのですが、boot0, boot1+boot2 に関しては 実際の HDD のブートレコード領域は書き換わりません。 CD などからブートしての fdisk -B / bsdlabel -B などの操作が別途必要です。 (bsdlabel -B では boot1 と boot2 を繋いだ(だけの) /boot/boot というファイルを指定します)