13.3. ブートマネージャと起動ステージ

13.3.1. ブートマネージャ

MBR やブートマネージャのコードは起動プロセスの第 0 ステージと呼ばれることがあります。 この節では前述の 2 つのブートマネージャ、 boot0LILO について説明します。

boot0 ブートマネージャ. FreeBSD のインストーラや boot0cfg(8) がデフォルトでインストールする MBR は、/boot/boot0 を基にしています (boot0 は非常に単純なプログラムです。 MBR にあるプログラムは、 スライステーブルと末尾の識別子 0x55AA があるため、 446 バイトの大きさでなければならないという制限があるためです)。 ハードディスクに boot0 と複数のオペレーティングシステムをインストールした場合、 起動時に以下のような画面が出るでしょう。

例13.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 などとなります。 MBR の設定をカスタマイズしたい場合は boot0cfg(8) を使ってください。

LILO ブートマネージャ. このブートマネージャをインストールして FreeBSD を起動するようにするには、まず Linux を起動して /etc/lilo.conf コンフィグレーションファイルに以下を追加してください。

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

上記において、FreeBSD のプライマリパーティションとドライブを Linux の識別子を使って指定してください。 X を Linux のドライブ文字に、また Y を Linux のプライマリパーティション番号に置き換えてください。 SCSI ドライブを使っているのであれば、 /dev/hd/dev/sd のように読み替えてください。 同じドライブ上に両方のオペレーティングシステムが置いてあるなら、 loader=/boot/chain.b 行は不要です。 これで /sbin/lilo -v を実行するとシステムに新しい変更が反映されます。 画面のメッセージを見て確認しておきましょう。

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

概念上、第 1 ステージと第 2 ステージは ハードディスクの同じ領域上の同一のプログラムの部分部分です。 スペースの制約のため 2 つに分割されていますが、 いつも一緒にインストールされます。 インストーラまたは bsdlabel は、両者を 1 つにまとめたファイル /boot/boot をコピーします (下記参照)。

第 1 ステージと第 2 ステージは、ファイルシステムの外部、 起動スライスの最初のトラックに置かれ、 先頭が最初のセクタにきます。 boot0 またはその他のブートマネージャは、 起動プロセスを続けるために必要なプログラムがそこにあると想定しています。 使用されるセクタの数は、/boot/boot の大きさから簡単に分かります。

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

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

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

例13.2 boot2 のスクリーンショット
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:

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

# bsdlabel -B diskslice

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

Dangerously Dedicated Mode:

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

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

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

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

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

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

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

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

13.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

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

13.3.3.3. ローダの使用例

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

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

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

    unload
    load kernel.old

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

    注記:

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

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

    load -t userconfig_script /boot/kernel.conf

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。