diff --git a/ja_JP.eucJP/books/handbook/boot/chapter.sgml b/ja_JP.eucJP/books/handbook/boot/chapter.sgml index 8c73fab6dc..61413513f5 100644 --- a/ja_JP.eucJP/books/handbook/boot/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/boot/chapter.sgml @@ -1,867 +1,869 @@ FreeBSD の起動のプロセス この章では 起動 ブートストラップ (bootstrap) 計算機を起動しオペレーティングシステムをロードするプロセスは、 ブートストラッププロセス、 もしくは単に 起動 と呼ばれます。 FreeBSD の起動プロセスを使えば、 システムをスタートするときに起きることを かなり柔軟にカスタマイズすることができます。 同じ計算機にインストールされた 別のオペレーティングシステムを選択することもできますし、 同じオペレーティングシステムの違うバージョンを選択することも、 インストールされた別のカーネルを選択することさえできます。 この章では、指定できる設定オプションと FreeBSD の起動プロセスのカスタマイズ方法について詳しく述べます。 この章では FreeBSD カーネルがスタートし、デバイスを検出し、 &man.init.8; を起動するまでに起きることすべてを扱います。 どの最中のことだかはっきりしていない人のために補足すると、 テキストの色が明るい白から灰色に変わるまでに起きていることです。 この章を読むと、以下のことが分かります。 どのように FreeBSD のブートストラップシステムが構成され、 そしてそれらが互いにどう関係しているのか 起動プロセスを制御するために FreeBSD のブートストラップの各要素に付加できるオプション &man.device.hints.5; の基本的な記述方法 x86 限定 この章では Intel x86 システム上で動作する FreeBSD の起動プロセスだけを扱います。 起動時の問題 計算機の電源を入れ、オペレーティングシステムをスタートさせるのには、 おもしろいジレンマがあります。 定義により、計算機は オペレーティングシステムがスタートするまで何もする方法を知りません。 ディスクからプログラムを動かすのも含みます。 では、計算機はオペレーティングシステムなしに ディスクからプログラムを実行することができず、 オペレーティングシステムのプログラムがディスク上にあるのなら、 どうやってオペレーティングシステムをスタートさせるのでしょう? この問題はほらふき男爵の冒険という本の中に 書かれている問題ととてもよく似ています。 登場人物がマンホールの下に半分落っこちて、 靴紐 (ブートストラップ) をつかんで自分を引っぱり、持ち上げるのです。 計算機の黎明期には、ブートストラップ という用語でオペレーティングシステムをロードする 機構のことを指していたのですが、 いまは短く 起動 (ブート) と言います。 x86 ハードウェアでは、基本入出力システム (Basic Input/Output System: BIOS) にオペレーティングシステムをロードする責任があります。 オペレーティングシステムをロードするために、 BIOS がハードディスク上のマスターブートレコード (Master Boot Record: MBR) を探します。 MBR はハードディスク上の特定の場所になければなりません。 BIOS には MBR をロードし起動するのに十分な知識があり、 オペレーティングシステムをロードするために必要な作業の残りは MBR が実行できることを仮定しています。 BIOS 基本入出力システム (Basic Input/Output System) ディスク上にオペレーティングシステムを一つだけ インストールしているなら、標準の MBR で十分です。 この MBR はディスク上の最初の起動可能なスライスを探し、 そのスライスにあるコードを起動して 残りのオペレーティングシステムをロードします。 ディスク上にオペレーティングシステムを複数インストールしているなら、 別の MBR — 複数のオペレーティングシステムのリストを表示できて、 起動するオペレーティングシステムを選択できるような MBR — をインストールすることができます。 FreeBSD はそのような MBR とともに配布されており、 この MBR をインストールすることもできます。 他のオペレーティングシステムのベンダも 標準 MBR に代わる MBR を提供しています。 FreeBSD ブートストラップシステムの残りは 3 段階に分かれます。 第 1 ステージは MBR によって起動されるもので、 MBR は計算機を特定の状態にするために必要なことだけ知っていて、 第 2 ステージを起動します。 第 2 ステージでは、第 3 ステージを起動する前に、 もうちょっとやることができます。 第 3 ステージでオペレーティングシステムのロード作業を完了します。 起動作業がこれらの 3 段階に分かれているのは、 PC の規格がステージ 1 とステージ 2 で実行できるプログラムのサイズに制限を課しているからです。 これらの作業をつなぎ合わせることによって、 FreeBSD はより柔軟なローダ (loader) を提供しているのです。 カーネル (kernel) init その後カーネルが起動し、デバイスの検出と初期化を開始します。 そしてカーネルの起動が終わると、制御はユーザープロセスの &man.init.8; へ移されます。&man.init.8; はまず ディスクが利用可能であることを確かめ、 ファイルシステムのマウント、 ネットワークで利用するネットワークカードのセットアップ、 そして通常 FreeBSD システムで初期時に起動されるすべてのプロセスの起動、 といったユーザーレベルでのリソース (資源) 設定を行ないます。 MBR、起動ステージ 1、2 および 3 MBR、<filename>/boot/boot0</filename> マスターブートレコード (MBR) FreeBSD の MBR は /boot/boot0 にあります。これは MBR のコピーであり、 本当の MBR はディスク上の特別な部分、 つまり FreeBSD 領域の外に置く必要があります。 boot0 は非常に単純なプログラムです。 これは、MBR にあるプログラムは 512 バイトの大きさでなければならないという制限があるためです。 FreeBSD の MBR をインストールし、 かつハードディスク上に複数のオペレーティングシステムをインストールした場合、 起動時にこれと同じような画面が出るでしょう。 <filename>boot0</filename> のスクリーンショット F1 DOS F2 FreeBSD F3 Linux F4 ?? F5 Drive 1 Default: F2 他のオペレーティングシステム、特に &windows; 95 は、 既存の MBR を自らの MBR で上書きしてしまうことで知られています。 もしそうなってしまったら、 もしくは既存の MBR を FreeBSD の MBR で置き換えたいのなら、 次のコマンドを使ってください。 &prompt.root; 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 のインストールの際 を選択します。 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 の指定方法は同じです。 は同じドライブ上に両方のオペレーティングシステムを置いてあるのであれば不要です。 これで /sbin/lilo -v を実行すると システムに新しい変更が反映されるので、 画面のメッセージを見て確認します。 起動ステージ 1 <filename>/boot/boot1</filename> と起動ステージ 2 <filename>/boot/boot2</filename> 概念上、第 1 ステージと第 2 ステージは ハードディスクの同じ領域上の同一のプログラムの部分部分です。 スペースの制約のため 2 つに分割されていますが、 いつも一緒にインストールします。 第 1 ステージと第 2 ステージは起動スライス (slice) の起動セクタにあります。 起動セクタとは、 MBR 上にある boot0 もしくは他のプログラムが、起動のプロセスを続けるために 必要なプログラムがあると想定している場所です。 /boot ディレクトリにあるファイルは実際に使われるファイルのコピーで、 実際のファイルは FreeBSD ファイルシステムの外部に格納されています。 boot1 も非常に単純なプログラムです。 これは boot0 同様に、 512 バイトの大きさでなければならないという制限があるためです。 boot1 は boot2 を検索し、 実行するため、そのスライスの情報を保持する FreeBSD のディスクラベル (disklabel) に関する最低限の情報を持っています。 boot2 はもう少し高機能です。 これは FreeBSDのファイルシステム上でファイルを見つける能力を持ち、 実行するカーネルやローダを指定するための 簡単なインタフェイスを提供します。 ローダ (loader) はさらに高機能なもので、 使いやすく簡単な起動設定が行なえる手段を提供します。 boot2 は通常それを起動します。 以前の boot2 には、 カーネルを直接起動する機能しかありませんでした。 <filename>boot2</filename> のスクリーンショット >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/kernel boot: もし仮にインストールされた boot1boot2 を変更したいのであれば、 &man.disklabel.8; を使ってください。 &prompt.root; disklabel -B diskslice diskslice は起動するディスクとスライスで、 たとえば最初の IDE ディスクの 1 番目のスライスは ad0s1 となります。 Dangerously Dedicated Mode &man.disklabel.8; を使うとき、 ad0 のようにディスク名だけを指定すると、 スライスを持たない危険な専用ディスクを作成してしまいます。 たぶん間違いなく、そうしたいわけではないでしょうから、 必ず Return キーを押す前に &man.disklabel.8; コマンドを二重にチェックしてください。 起動ステージ 3 <filename>/boot/loader</filename> ブートローダ (boot-loader) ローダは三段階の起動プロセスの最終段階です。 ローダは通常、ファイルシステム上の /boot/loader として存在しています。 ローダは、よりさまざまなコマンド群をサポートした 強力なインタプリタによって提供される簡易組み込みコマンド群を利用することで、 ユーザが利用しやすい設定手段となるように設計されています。 ローダプログラムの処理の流れ ローダは初期化の際にコンソールとディスクの検出を行ない、 どのディスクから起動しているかを調べます。 そして必要な変数を設定してからインタプリタを起動し、 スクリプトからコマンドを送ったり手でコマンドを入力したりできます。 ローダ ローダの設定 ローダは次に /boot/loader.rc を読み込み、通常、変数の標準値を定義した /boot/defaults/loader.conf と、そのマシンにローカルな変数を定義した /boot/loader.conf を読み込みます。 loader.rc はそれらの変数にもとづき、 選択されたモジュールとカーネルをロードします。 ローダは最後に、標準設定で 10 秒のキー入力待ち時間を用意し、 入力がなければカーネルを起動します。 入力があった場合、簡易コマンド群が使えるプロンプトが表示され、 ユーザは変数を調整したり、 すべてのモジュールをアンロードしたり、 モジュールをロードしたりすることができます。 その後、最終的な起動や再起動へ移行します。 ローダの組み込みコマンド もっともよく使われるローダのコマンドを以下に示します。 利用可能なコマンドをすべて知りたい場合、 &man.loader.8; を参照してください。 autoboot seconds seconds で与えられた時間内に入力がなければ、 カーネルの起動へと進みます。 カウントダウンを表示し、標準設定では 10 秒間です。 boot -options kernelname すぐにカーネルの起動へ進みます。 オプション、カーネル名が指定されている場合は、 それらが使われます。 boot-conf すべてのモジュールの設定を、 起動時と同じように変数にもとづいて自動的に行ないます。 このコマンドは、まず unload を行なって、 変数—普通 kernel など—を変更した場合にのみ有効に働きます。 help topic /boot/loader.help を読み込み、ヘルプメッセージを表示します。 topicindex 指定された場合、 利用可能な topic を表示します。 include filename 指定されたファイル名のファイルを処理します。 ローダはファイルを読み込み、行単位で解釈します。 エラーが発生した場合、 include コマンドの実行はその時点で停止します。 load type filename 指定されたファイル名のカーネル、 カーネルモジュール、あるいは type に指定された種類のファイルをロードします。 ファイル名以降に指定された引数はファイルへと渡されます。 ls path 指定された path にあるファイルを表示します。 path が指定されていなければ、ルートディレクトリを表示します。 が指定されていればファイルサイズも表示されます。 lsdev モジュールがロード可能なすべてのデバイスを表示します。 もし が指定されていれば、 より詳細な出力がされます。 lsmod ロード済みのモジュールを表示します。 が指定されていれば、 より詳細な内容が出力されます。 more filename LINES 単位でスクロールを停止しながら指定されたファイルを表示します。 reboot すぐにシステムを再起動します。 set variable set variable=value ローダの環境変数を設定します。 unload すべてのロード済みモジュールを削除します。 ローダの使用例 次にあげるのは、ローダの実践的な使用例です。 シングルユーザモード 普段使っているカーネルをシングルユーザモードで起動します。 boot -s 普段使っているカーネルとモジュールをアンロードし、 古い (もしくは別の) カーネルをロードします。 kernel.old unload load kernel.old kernel.GENERIC とすると、 インストールディスクに入っていた generic カーネルを指定することができます。 また、直前にインストールされていたカーネル (たとえば、 カーネルを自分で設定したり、 アップグレードしたりした場合) を指定するには kernel.old とします。 普段のカーネルで使っているモジュールを 指定したカーネルでロードする場合は、下のようにします。 unload set kernel="kernel.old" boot-conf カーネルの設定スクリプト (通常、 カーネル起動時に設定される内容を自動化するスクリプト) をロードします。 load -t userconfig_script /boot/kernel.conf カーネル起動時の応答 カーネル (kernel) 起動時の応答 カーネルがローダ (通常は) かboot2 (ローダを迂回して) によってロードされると、 起動フラグを調べます。 もし起動フラグがあれば、それに応じて動作を調整します。 カーネル起動フラグ カーネル (kernel) 起動フラグ 良く使われる起動フラグは次のとおりです。 カーネル初期化中に、 ルートファイルシステムとしてマウントするデバイスを尋ねます。 CDROM から起動します。 起動時にカーネルコンフィグレーションを行なう UserConfig を実行します。 シングルユーザモードで起動します。 カーネル起動時により詳細な情報を表示します。 起動フラグはこの他にもあります。 それらについては &man.boot.8; を参照してください。 Tom Rhodes 寄稿: device.hints Device Hints これは FreeBSD 5.0 以降の機能です。 これ以前のバージョンには存在しません。 起動プロセスの間に &man.loader.8; は &man.device.hints.5; を読み込みます。 このファイルにはカーネル起動の環境変数が格納されており、 これらの環境変数は device hints と呼ばれることがあります。 device hints はデバイスを設定するために デバイスドライバが使用します。 - 環境変数は 起動ステージ 3 ローダ - でも設定できます。変数は + device hints は ステージ 3 ブートローダ + でも設定できます。device hints は set コマンドを用いて追加することが、 unset コマンドを用いて削除することができます。 show コマンドを用いて一覧を見ることもできます。 /boot/device.hints に設定されている変数は このときに上書きすることができます。 - ローダで設定した環境変数の効果は一時的なものであるため、 + ローダで設定した device hints の効果は一時的なものであるため、 次回起動するときには無効になります。 システムが起動すると、&man.kenv.1; コマンドでカーネル環境変数を ダンプすることができます。 /boot/device.hints は 1 行につき一つの変数を設定でき、 行頭の # はその行がコメントであることを示しています。 書式は次の通りです。 hint.driver.unit.keyword="value" - 起動ステージ 3 ローダ で設定するときの書式は次の通りです。 + ステージ 3 ブートローダ で設定するときの書式は次の通りです。 set hint.driver.unit.keyword=value driver はデバイスドライバの名前、 unit はデバイスドライバのユニット番号、 keyword はヒントキーワードです。 キーワードは次の設定を指定します: at: デバイスがどのバスに接続されているか指定します。 port: 使用する I/O ポートの開始アドレスを指定します。 irq: 使用する IRQ を指定します。 drq: 使用する DMA チャネルを指定します。 maddr: 使用する物理メモリアドレスを指定します。 flags: - さまざまなフラグを設定します。 + デバイスに対してさまざまなフラグを設定します。 disabled: 1 が設定されていると、そのデバイスは無効になります。 デバイスドライバはこのリスト以外の変数を設定できるかもしれませんし、 このリスト以外の変数を必要とするかもしれません。 したがって、デバイスドライバのマニュアルを読むことをおすすめします。 より多くの情報を知りたければ、&man.device.hints.5;, &man.kenv.1;, &man.loader.conf.5;, &man.loader.8; などのマニュアルを参照してください。 init init: プロセス制御の初期化 カーネルの起動が完了すると、&man.init.8; というユーザプロセスに制御が移されます。 これは /sbin/init、 もしくは loaderinit_path 変数で指定される場所にあります。 自動再起動 (automatic reboot)の動作 自動再起動では、 システム上で利用できるファイルシステムの一慣性を確認します。 もしそれに問題があって &man.fsck.8; がその不一致を修復できなければ、 管理者に直接対処させるため &man.init.8; はシステムをシングルユーザモードへと移行させます。 シングルユーザモード シングルユーザモード コンソール (console) このモードには、 自動再起動の処理中か、 ユーザが起動時に オプションを指定した場合、 あるいは loaderboot_single 変数を設定することによって移行します。 また、 マルチユーザモードから 再起動オプション () や停止 (halt) オプション () なしで &man.shutdown.8; を呼び出すとこのモードに移行します。 /etc/ttys でシステムコンソール consoleinsecure に設定されている場合、 システムはシングルユーザモードに移行する前に root のパスワードを入力するように求めます。 <filename>/etc/ttys</filename> の insecure コンソール # name getty type status comments # # If console is marked "insecure", then init will ask for the root password # when going to single-user mode. # # 訳) console に "insecure" という印をつけると、シングルユーザモードへ移行する # 際に init が root のパスワードを要求するようになります。 # console none unknown off insecure insecure コンソールとは、 あなた自身、コンソールが物理的に安全でないと考えていて、 root のパスワードを知る人だけがシングルユーザモードを 使えるようにしたいという意味であり、 コンソールを安全でない状態で使いたいという意味ではありません。 そのため、安全性を求めるならば secure でなく insecure を選んでください。 マルチユーザモード マルチユーザモード &man.init.8; がファイルシステムが正常であると判断するか、 ユーザがシングルユーザモードを終了すると、 システムはマルチユーザモードへ移行し、 リソースの設定を始めます。 リソース設定 (rc) rc ファイル群 リソース設定システムはデフォルト設定を /etc/defaults/rc.conf から、 そのシステム独自の細かな設定を /etc/rc.conf から読み込みます。 そして /etc/fstab に記述されるシステムファイルシステムをマウントし、 ネットワークサービスの開始、 さまざまなシステムデーモンの開始、 そして最後に、ローカルにインストールされた package の起動スクリプトの実行へと進みます。 リソース設定システムのに関する参考資料は、&man.rc.8; にあります。 これはスクリプトそのものを調べることと同じくらい優れたものです。 シャットダウン動作 shutdown &man.shutdown.8; を用いてシステムを意図的にシャットダウンした場合、 &man.init.8; は /etc/rc.shutdown というスクリプトの実行を試みます。 そして、すべてのプロセスへ TERM シグナルを送り、続いてうまく終了できなかったプロセスへ KILL シグナルを送ります。 電源管理機能を持ったシステムで稼働している FreeBSD では shutdown -p now コマンドによって、 直ちに電源を落とすことができます。FreeBSD を再起動するには、 shutdown -r now を実行するだけです。 &man.shutdown.8; を実行するには、root であるか、operator グループのメンバ - であることが必要です。&man.halt.8; や &man.reboot.8; コマンドを - 利用できることもできますが、より多くの情報を知るために、 + でなければなりません。&man.halt.8; や &man.reboot.8; コマンドを + 利用することもできますが、より多くの情報を知るために、 それらと &man.shutdown.8; のマニュアルページを参照してください。 - 電源管理機能は FreeBSD 5.X の &man.acpi.4; か + 電源管理機能は FreeBSD 5.X の &man.acpi.4; + がカーネルに組み込まれているか、 + モジュールが読み込まれていることを必要とし、 FreeBSD 4.X の &man.apm.4; を必要とします。