/*
 * boot process of FreeBSD/i386
 *   by uratan! 2011.11.21
 */

boot code の種類と配置

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)

ここで、


boot 時の console 出力例

console に出力されるメッセージとブートプロセスの対比を示します。

+--------------------------------------
|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
+--------------------------------------
		
(*1) の prompt の時に何かキーを押すと 以下の通り boot2 の 対話処理に入れます。
この '-' は 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
|*
+--------------------------------------
	

loader のコンパイルとインストール

/boot/loader の make には kernel source 以外にも /usr/src/lib/libstand/ にある *.h が必要です。
これは library (slib.*) に含まれます。 make 手順は以下の通り。

[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
		
このレイヤーでは Makefile に依存関係が完全に記述してないらしく、 毎度 make clean したほうが無難なようです。

また上の make install では、/boot/ の(仮置き)ファイルのみが更新されます。 /boot/loader はこれで差し代わるのですが、boot0, boot1+boot2 に関しては 実際の HDD のブートレコード領域は書き換わりません。 CD などからブートしての fdisk -B / bsdlabel -B などの操作が別途必要です。 (bsdlabel -B では boot1 と boot2 を繋いだ(だけの) /boot/boot というファイルを指定します)


    uratan@miomio.jp
upward