FreeBSD ハンドブック
Prev | Chapter 12 FreeBSD の起動のプロセス | Next

# 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:

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

    # disklabel -B diskslice

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

> Dangerously Dedicated Mode: disklabel(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` を読み込み、ヘルプメッセージを表示します。 `topic` に `index` が指定された場合、 利用可能な `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

Prev | Home | Next
起動時の問題 | Up | カーネル起動時の応答

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

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