blank
FreeBSD のブートの仕組

[ブートの流れ]

ここでは PC/AT アーキテクチャで FreeBSD をブートするときのブート の流れについて説明します。基本的には FreeBSD というより PC/AT アー キテクチャのブートシーケンスになっていますので、Linux 等の OS で もほぼ同様の流れになります。

boot sequence

図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
    
    とします。