This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.
ブートストラップ(bootstrap) とは, コンピュータがデバイスのプローブと初期化および, どのプログラムを実行させるべきであるかを判断する一連の処理のことです.
これはシステムの動作を決定する特殊な ROM チップを利用して実現され, 通常, システムの一慣性とメモリの検査, デバイスの設定, どのような設定がなされたかをプログラムに伝える機構の提供などをを行なう 他のチップに処理が渡されます.
通常のパーソナルコンピュータの場合, ブートストラップの監視をする BIOS と, 設定を保持する CMOS が利用されます. これらはディスクを扱う事ができ, オペレーティングシステムを起動するプログラムが, ディスクのどこにあるかを認識しています.
この章はブートストラップの第一段階については触れず, ディスク上のプログラムへ制御が移された後に何が起こるのかについて注目します.
FreeBSD はデフォルトで三段階のブートストラップを行ないます. 基本的に順に互いを呼び出す三つのプログラム(二つの ブートブロックと ローダ)を必要とします. これらは前のプログラムを土台にしており, より高い洗練性を提供します.
そして, 利用するデバイスの検出され, 初期化の間にカーネルが起動されます. カーネルのブートプロセスが終ると, 制御はユーザープロセスの init へ移されます. ディスクが利用可能であることを確かめると, ファイルシステムのマウント, ネットワークで利用するネットワークカードのセットアップ, そして一般的な FreeBSD システムで初期時に起動される, すべてのプロセスの起動といったユーザーレベルでのリソース設定を行ないます.
ブートブロックは(通常)ローダを見つけ, 実行する役割を持っています. したがって, ファイルシステム上のプログラムを見つけ, 実行し, その動作に関して多少の設定が可能である必要があります.
実際には boot0 と呼ばれるブートブロックが先行しており, マスターブートレコード(MBR; Master Boot Record)にあります. これは, システムのブートストラップが起動時に探して実行するディスクの特殊な部分で, 単にブートできる可能性のあるスライスのリストを表示します.
MBR に置くプログラムは 512 バイト以上にできないことから boot0 はとても単純です.
こんな感じの出力をします.
boot1 はブートスライスのブートセクタにあります. ブートセクタには boot0 があり, MBR にある他のすべてのプログラムが, ブートプロセスを続けるために必要なプログラムを探し, 実行するための部分となっています.
boot1 も同様に 512 バイト以上にできないことから, とても単純で, boot2 を見つけ, 実行するための情報を保持する FreeBSD の disklabel について最低限のことを認識しているに過ぎません.
boot2 はもう少し精巧で, FreeBSDのファイルシステム上でファイルを見つけるのに十分な能力を持ち, カーネルかローダを指定するための簡単なインターフェイスを提供する事ができます.
ローダははるかに高機能あり, 簡易的なブート設定の手段を提供するため, boot2 は通常それを起動します. しかし, 以前はカーネルを直接起動することを要求されていました.
ローダは三段階ブートストラップの最終段階で, 通常, ファイルシステム上に /boot/loader として存在します.
Note: /boot/boot0, /boot/boot1, /boot/boot2 とがありますが, これらは実際に MBR, ブートセクタ, あるいはディスクラベルにあるものとは異なります.
ローダは, より複雑なコマンド群を持つ強力なインタープリタを使った 簡易組み込みコマンド群を利用することで, ユーザフレンドリな設定の手段となるように設計されています.
初期化の際, ローダはコンソールとディスクの検出を行ない, どのディスクからブートしているかを調べます. そしてしかるべき変数を設定してからインタープリタを起動し, 簡易コマンドを解釈します.
ローダは次に /boot/loader.rc を読み込みます. デフォルトで /boot/defaults/loader.conf を読み込むことで適当な初期値を変数に与え, ローカルな変数値設定のために /boot/loader.conf を読み込みます. loader.rc はそれらの変数に従い適当なモジュールをロードしカーネルを選択します.
最後に, デフォルトではローダは 10 秒のキー入力待ち時間を用意し, 入力がなければカーネルを起動します. 入力があった場合, ユーザには先に述べた簡易コマンドが使えるプロンプトが出されます. そこでユーザは変数を調整したり, すべてのモジュールをアンロードしたり, モジュールをロードしたりすることができ, それから最終的にブートやリブートへ移ります.
この処理に関するより技術的な説明は loader(8) にあります.
簡易コマンドセットの構成は, 次のようになっています.
seconds で与えられた時間内に入力がなければ, カーネルのブートへと進みます. カウントダウンを表示し, デフォルトは 10 秒間です.
即座にカーネルのブートへと進みます. もし指定されていれば, 与えられたオプションとカーネルの名前を使います.
/boot/loader.help から読み込まれたヘルプメセッジを表示します. 与えられた topic が index ならば, 有効な topic を表示します.
与えられたファイル名のファイルを処理します. ファイルは読み込まれ, 行単位で解釈されます. エラーは即座に include コマンドの実行を停止します.
与えられたファイル名のカーネル, カーネルモジュール, あるいは指定されたtypeのファイルをロードします. ファイル名以降の引数はファイルへと渡されます.
与えられた path にあるファイル, あるいは path が指定されていなければルートディレクトリを表示します. -l が指定されていればファイルサイズも表示されます.
モジュールをロード可能なデバイスをすべて表示します. もし -v が指定されていれば, より詳細な出力がされます.
ロードされたモジュールを表示します. もし -v が指定されていれば, より詳細な内容が出力されます.
LINES 毎に停止しながら指定されたファイルを表示します.
即座にシステムをリブートします.
ローダの環境変数を設定します.
ローダのいくつかの実践的な使用例です.
通常のカーネルをシングルユーザモードでブートします.
boot -s
通常のカーネルとモジュールをアンロードし, 古い(もしくは別の)カーネルをロードします.
unload
load kernel.oldインストールディスクに入っていた generic カーネルを参照するためには kernel.GENERIC, あるいは直前にインストールされていたカーネル(例えば, カーネルを自分で設定したり, アップグレードしたりして)を参照するには kernel.old が使えます.
カーネルの設定スクリプト(通常, カーネルブート時に設定される内容を自動化するスクリプト)をロードします.
load -t userconfig_script
/boot/kernel.confカーネルはローダ(通常は) かboot2 (ローダを迂回して)によってロードされるとブートフラグを調べ, もしあればそれに応じて動作を調整します.
良く使われるブートフラグです.
カーネル初期化中, ルートファイルシステムとしてマウントするデバイスを尋ねます.
CDROM からブートします.
ブート時のカーネルコンフィグレーションを行なう UserConfig を実行します.
シングルユーザモードでブートします.
カーネル起動時に, より詳細な情報を表示します.
Note: ブートフラグはこの他にもあり, それらについては boot(8)をお読みください.
カーネルがブートされると, 制御はユーザプロセスである initへ移されます. これは, /sbin/init, もしくは loader の init_path 変数で指定される場所にあります.
自動リブート動作では, システム上で利用できるファイルシステムの一慣性を確認します. もし問題があり, fsck がその不一致を修復できなければ, init は管理者に直接に処置させるため, システムをシングルユーザモードへと移行させます.
このモードには一連の自動リブート動作, もしくはユーザが -s を指定してブートするか loader で boot_single 変数を設定することによって移行できます.
マルチユーザモードから shutdownをリブートオプション (-r) や halt オプション(-h)なしで呼び出すことでも移行できます.
/etc/ttys でシステムコンソール console が insecure に設定されていれば, システムはシングルユーザモードを始める前に root パスワードの入力を求めます.
Example 23-3. /etc/ttys の insecure コンソール
# name getty type status comments
#
# This entry needed for asking password when init goes to single-user mode
# If you want to be asked for password, change "secure" to "insecure" here
#
# 訳)
# このエントリはinitがシングルユーザモードへ移行する際にパスワードを要
# 求させるために必要です. もし, パスワードの要求を望むならば"secure"を
# "insecure"へとここで変更してください.
console none unknown off insecureNote: insecure コンソールとは, コンソールが物理的に安全でないと見なされ, root パスワードを知る人だけがシングルユーザモードを使えるようにするという意味であり, コンソールを安全でない状態で使いたいという意味ではありません. よって, 安全性を求めるならば secure でなく insecure を選んでください.
init がファイルシステムが正常であると判断するか, ユーザがシングルユーザモードを終了したならば, システムはマルチユーザモードへ移行し, リソースの設定を始めます.
リソース設定システムはデフォルト設定を /etc/defaults/rc.conf から, システム独自の詳細を /etc/rc.conf から読み込み, /etc/fstab に記述されるシステムファイルシステムのマウント, ネットワークサービスの開始, さまざまなシステムデーモンの開始, そして最後にローカルにインストールされたパッケージの起動スクリプトの実行へと進みます.
rc(8) は, スクリプトそのものについて調べることと同様に, リソース設定システムの優れた参考資料です.
shutdown からのシャットダウンでは, init がスクリプト /etc/rc.shutdown の実行を試みます. そして, 全てのプロセスへ terminate シグナルを送り, 続いてうまく終了できなかったプロセスへ kill シグナルを送ります.