12.3. MBR、起動ステージ 1、2 および 3

12.3.1. MBR、/boot/boot0

FreeBSD の MBR は /boot/boot0 にあります。これは MBR のコピーであり、 本当の MBR はディスク上の特別な部分、 つまり FreeBSD 領域の外に置く必要があります。

boot0 は非常に単純なプログラムです。 これは、MBR にあるプログラムは 512 バイトの大きさでなければならないという制限があるためです。 FreeBSD の MBR をインストールし、 かつハードディスク上に複数のオペレーティングシステムをインストールした場合、 起動時にこれと同じような画面が出るでしょう。

Example 12-1. boot0 のスクリーンショット

F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1

Default: F2

他のオペレーティングシステム、特に Windows® は、 既存の MBR を自らの MBR で上書きしてしまうことで知られています。 もしそうなってしまったら、 もしくは既存の MBR を FreeBSD の MBR で置き換えたいのなら、 次のコマンドを使ってください。

# fdisk -B -b /boot/boot0 device

device は起動するデバイス名で、 たとえば 1 番目の IDE ディスクは ad0、 2 番目の IDE コントローラに接続されている 1 番目の IDE ディスクは ad2、 1 番目の SCSI ディスクは da0 などとなります。

しかしながら、もしあなたが Linux ユーザで、 LILO で起動プロセスを制御したいのなら、 FreeBSD 用に /etc/lilo.conf を編集して、 FreeBSD のインストールの際 マスターブートレコードを変更しない (Leave The Master Boot Record Untouched) を選択します。 FreeBSD のブートマネジャをインストールしたのであれば、 Linux を起動し直して LILO の設定ファイル /etc/lilo.conf を変更し、 次のオプションを加えることができます:

other=/dev/hdXY
table=/dev/hdb
loader=/boot/chain.b
label=FreeBSD

こうすれば、LILO から FreeBSD と Linux を起動することができます。 この例では、ドライブ番号とパーティションを示すために XY を使っています。 SCSI ドライブを使っているのであれば、 /dev/hdXY/dev/sdXY のように読み替えてください。 XY の指定方法は同じです。 loader=/boot/chain.b は同じドライブ上に両方のオペレーティングシステムを置いてあるのであれば不要です。 これで /sbin/lilo -v を実行すると システムに新しい変更が反映されるので、 画面のメッセージを見て確認します。

12.3.2. 起動ステージ 1 /boot/boot1 と起動ステージ 2 /boot/boot2

概念上、第 1 ステージと第 2 ステージは ハードディスクの同じ領域上の同一のプログラムの部分部分です。 スペースの制約のため 2 つに分割されていますが、 いつも一緒にインストールします。

第 1 ステージと第 2 ステージは起動スライス (slice) の起動セクタにあります。 起動セクタとは、 MBR 上にある boot0 もしくは他のプログラムが、起動のプロセスを続けるために 必要なプログラムがあると想定している場所です。 /boot ディレクトリにあるファイルは実際に使われるファイルのコピーで、 実際のファイルは FreeBSD ファイルシステムの外部に格納されています。

boot1 も非常に単純なプログラムです。 これは boot0 同様に、 512 バイトの大きさでなければならないという制限があるためです。 boot1 は boot2 を検索し、 実行するため、そのスライスの情報を保持する FreeBSD のディスクラベル (disklabel) に関する最低限の情報を持っています。

boot2 はもう少し高機能です。 これは FreeBSDのファイルシステム上でファイルを見つける能力を持ち、 実行するカーネルやローダを指定するための 簡単なインタフェイスを提供します。

ローダ (loader) はさらに高機能なもので、 使いやすく簡単な起動設定が行なえる手段を提供します。 boot2 は通常それを起動します。 以前の boot2 には、 カーネルを直接起動する機能しかありませんでした。

Example 12-2. boot2 のスクリーンショット

>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:

もし仮にインストールされた boot1boot2 を変更したいのであれば、 disklabel(8) を使ってください。

# disklabel -B diskslice

diskslice は起動するディスクとスライスで、 たとえば最初の IDE ディスクの 1 番目のスライスは ad0s1 となります。

Dangerously Dedicated Modedisklabel(8) を使うとき、 ad0 のようにディスク名だけを指定すると、 スライスを持たない危険な専用ディスクを作成してしまいます。 たぶん間違いなく、そうしたいわけではないでしょうから、 必ず Return キーを押す前に disklabel(8) コマンドを二重にチェックしてください。

12.3.3. 起動ステージ 3 /boot/loader

ローダは三段階の起動プロセスの最終段階です。 ローダは通常、ファイルシステム上の /boot/loader として存在しています。

ローダは、よりさまざまなコマンド群をサポートした 強力なインタプリタによって提供される簡易組み込みコマンド群を利用することで、 ユーザが利用しやすい設定手段となるように設計されています。

12.3.3.1. ローダプログラムの処理の流れ

ローダは初期化の際にコンソールとディスクの検出を行ない、 どのディスクから起動しているかを調べます。 そして必要な変数を設定してからインタプリタを起動し、 スクリプトからコマンドを送ったり手でコマンドを入力したりできます。

ローダは次に /boot/loader.rc を読み込み、通常、変数の標準値を定義した /boot/defaults/loader.conf と、そのマシンにローカルな変数を定義した /boot/loader.conf を読み込みます。 loader.rc はそれらの変数にもとづき、 選択されたモジュールとカーネルをロードします。

ローダは最後に、標準設定で 10 秒のキー入力待ち時間を用意し、 入力がなければカーネルを起動します。 入力があった場合、簡易コマンド群が使えるプロンプトが表示され、 ユーザは変数を調整したり、 すべてのモジュールをアンロードしたり、 モジュールをロードしたりすることができます。 その後、最終的な起動や再起動へ移行します。

12.3.3.2. ローダの組み込みコマンド

もっともよく使われるローダのコマンドを以下に示します。 利用可能なコマンドをすべて知りたい場合、 loader(8) を参照してください。

autoboot seconds

seconds で与えられた時間内に入力がなければ、 カーネルの起動へと進みます。 カウントダウンを表示し、標準設定では 10 秒間です。

boot [-options] [kernelname]

すぐにカーネルの起動へ進みます。 オプション、カーネル名が指定されている場合は、 それらが使われます。

boot-conf

すべてのモジュールの設定を、 起動時と同じように変数にもとづいて自動的に行ないます。 このコマンドは、まず unload を行なって、 変数--普通 kernel など--を変更した場合にのみ有効に働きます。

help [topic]

/boot/loader.help を読み込み、ヘルプメッセージを表示します。 topicindex が指定された場合、 利用可能な topic を表示します。

include filename ...

指定されたファイル名のファイルを処理します。 ローダはファイルを読み込み、行単位で解釈します。 エラーが発生した場合、 include コマンドの実行はその時点で停止します。

load [-t type] filename

指定されたファイル名のカーネル、 カーネルモジュール、あるいは type に指定された種類のファイルをロードします。 ファイル名以降に指定された引数はファイルへと渡されます。

ls [-l] [path]

指定された path にあるファイルを表示します。 path が指定されていなければ、ルートディレクトリを表示します。 -l が指定されていればファイルサイズも表示されます。

lsdev [-v]

モジュールがロード可能なすべてのデバイスを表示します。 もし -v が指定されていれば、 より詳細な出力がされます。

lsmod [-v]

ロード済みのモジュールを表示します。 -v が指定されていれば、 より詳細な内容が出力されます。

more filename

LINES 行を表示するごとに停止しながら指定されたファイルを表示します。

reboot

すぐにシステムを再起動します。

set variable, set variable=value

ローダの環境変数を設定します。

unload

すべてのロード済みモジュールを削除します。

12.3.3.3. ローダの使用例

次にあげるのは、ローダの実践的な使用例です。

  • 普段使っているカーネルをシングルユーザモードで起動します。

    boot -s
    
  • 普段使っているカーネルとモジュールをアンロードし、 古い (もしくは別の) カーネルをロードします。

    unload
    load kernel.old
    

    kernel.GENERIC とすると、 インストールディスクに入っていた generic カーネルを指定することができます。 また、直前にインストールされていたカーネル (たとえば、 カーネルを自分で設定したり、 アップグレードしたりした場合) を指定するには kernel.old とします。

    Note: 普段のカーネルで使っているモジュールを 指定したカーネルでロードする場合は、下のようにします。

    unload
    set kernel="kernel.old"
    boot-conf
    
  • カーネルの設定スクリプト (通常、 カーネル起動時に設定される内容を自動化するスクリプト) をロードします。

    load -t userconfig_script /boot/kernel.conf