[ブートの流れ]
ここでは PC/AT アーキテクチャで FreeBSD をブートするときのブート
の流れについて説明します。基本的には FreeBSD というより PC/AT アー
キテクチャのブートシーケンスになっていますので、Linux 等の OS で
もほぼ同様の流れになります。
図1. ブートの流れ
- [Step1] ハードディスクからのブート
リセット/電源投入直後はハードウェアのテストの後、BIOSの
設定に従い 1番最初に接続されているハードディスクMBR (マスタブートレコード)から 1 段目
のブートプログラムを読み込みます。FreeBSD ではこのプログ
ラムはboot1(Booteasy) に相当します。
MS-DOS, Windows9xなどの標準のブートプログラムでは、アクティ
ブとマークされたパーティション(FreeBSD用語でのスライス)の
最初の部分を読みにいくという動きをします。
これは、FDISK /MBRとすることによりインストールでき、また
Windows9xの再インストールなどを行なうと(自動的に)インストー
ルされます。
FreeBSDの標準の boot1(Booteasy) はアクティブスライ
ス以外にも、自由にスライスを選択することができます。正確
には指定したスライスのブートプログラムである
boot2(2段目のブートプ ログラム)を読み出します。
- [Step2] スライス内のブート
/ パーティションとしてインストールしたスライスの最初には、
2段目のブートプログラムである boot2が入っています。
FreeBSD で Boot:と出しているのがこれです。
boot2 は Boot:に対して入れられた文字列に応じて、カー
ネルを読み込みます。
boot2 はディスクへのアクセスに BIOS コールを利用し
ます。このため、BIOS が認識できないディスク/スライスから
はカーネルを読み出すことができません。また、このブートプ
ログラムはサイズを小さくするために UFS の機能の一部のみ理
解するようになっており、多重リンクになったカーネルなどは
呼び出すことができません。
- [Step3] カーネルのブート
[Step2] で読み込まれたカーネルが起動します。これでブート
シーケンスは終了です。
FreeBSD カーネルはファイルシステムをアクセスする際はにカー
ネル内のコードを使い、BIOSコールは使いません。
[参考]
- ブートプログラム
/usr/src/sys/i386/boot/biosboot/にソースがあり、実
体は /usr/mdec/にある boot1, boot2
です。これらは disklabelコマンドによりスライス中にインス
トールできます。
- IDE/SCSI 併用時のブート
IDE/SCSI の両方のディスクを併用している場合、そのままでは SCSI
ディスクからのブートはできません。なぜなら、boot2 が BIOS
経由でディスクをアクセスする場合、そのままでは IDE と
SCSI のディスクの区別がつかないからです。
例えば、IDE * 2 台、SCSI * 1 台が実装されている場合(FreeBSD
的に言えば、wd0, wd1, sd0 が存在する場合)、sd0 は 3 台目のディス
クとしてアクセスされます。具体的には boot2 は
2:wd(2,a)/kernel
または
2:sd(2,a)/kernel
をデフォルトのカーネル名として提示してきます。
ここで、2:sd(2,a)/kernelというのは、BIOSの3台目(0, 1, 2)
からカーネルを読み込み、ルートファイルシステムをsd2aにして
くれという意味になります。カーネルが動き出してルートファイル
システムをマウントしに行く場合には、wd(IDEディスク)とsd
(SCSIディスク)は独立でsd0aを見る必要があるので、このまま
では問題がおきます(sd2aがマウントできないと言われます)。
この問題を解決するために、SCSI ディスクが存在することを
boot2 に教えるために、boot2 を再構築します。
具体的には
2:sd(2,a)/kernel
の代わりに
2:sd(0,a)/kernel
をデフォルトで出すように変更します。
具体的には、/usr/src/sys/i386/boot/biosboot/Makefileで、
BOOT_HD_BIAS=1 というのがコメントアウトされています。
この部分を、BOOT_HD_BIAS=2として生かし、リコンパイル、インストー
ルしました。具体的には、
# cd /usr/src/sys/i386/boot/biosboot
# vi Makefile
(BOOT_HD_BIAS を変更)
# make
# make install
# disklabel -B sd0
とします。
|