ブートディスクは基本的にはシステムのミニチュアであり,必要なものが全て 揃った Linux システムを1枚のフロッピーディスクに収めたものです.このミ ニチュアシステムは,完全なフルサイズの Linux システムの機能の多くを実 行できなければなりません.したがって,ブートフロッピーを作る前には Linux のブートのプロセスの基本を理解しておくべきです.ここで基礎知識を 説明しますが,これを理解できていれば本書の残りの部分もわかると思います. ただし,詳しい部分や変更可能なオプションについては省略している部分も多 くあります.
全ての PC システムのブート処理では,まず ROM のコード(特に
BIOS)が実行されます.このコードはブートドライブのシリンダ 0,セ
クタ 0 にあるセクタを読み込んで実行します.ブートドライブは普通
はフロッピーディスクドライブ (DOS ではA:
,Linux では
/dev/fd0) です.BIOS は次にこのセクタを実行しよ
うとします.ブート可能なディスクのシリンダ 0,セクタ 0 には,
たいてい以下のどちらかが入っています:
Linux カーネルがフロッピーに生書きされている(raw デバイスとして書き込 まれている)場合,フロッピーの最初のセクタは Linux カーネルそのものにな ります.この最初のセクタはブートデバイスからカーネルの残りの部分をロー ドしてブート処理を続けます.
カーネルのロードが完全に終了すると,ロードされたカーネルは基本デバイス を初期化します.次にデバイスのどれかをルートファイルシステム としてロード・マウントします.ルートファイルシステムはごく普通の ファイルシステムで、``/'' としてマウントされます。 カーネルにはルートファイルシステムの場所を指示してやらなければなり ません.この場所にロードできるイメージが無ければ,カーネルは停止してし まいます.
状況によっては -- フロッピーからブートする場合にはしばしば -- ルートファ イルシステムは RAM ディスク にロードされます.これはシステム からディスクのようにアクセスできる RAM です.システムを RAM ディスクにロー ドする理由は 2 つあります.まず RAM はフロッピーディスクよりも桁違いに速 く,システムを速く操作できるからです.またカーネルは 圧縮されたファイルシステム をフロッピーから読み込んで, これを RAM ディスクに展開することができるからです.これを使えばフロッピー にずっと多くのファイルを入れることができます.
ルートファイルシステムがロード,マウントされると,次のようなメッセージ が表示されます:
VFS: Mounted root (ext2 filesystem) readonly.
次にシステムはルートファイルシステム(の /bin
または
/sbin
ディレクトリ)でinit
プログラムを見つけ,これを実行し
ます.init
は設定ファイル/etc/inittabを読み込み,
sysinit
と書いてある行を探し,そこで指定されているスクリプトを実
行します.sysinit
スクリプトは通常は /etc/rc や
/etc/init.d/boot 等です.このスクリプトはいろいろなシェル
コマンドが書かれたものであり,以下のような基本的なシステムサービスの設
定を行います:
fsck
を実行.fstab
に記述されたディスクのマウント.
システムの初期化をモジュール化するため,このスクリプトから別のスクリプ トを複数個起動することもよく行われます.例えば標準的な SysVinit の構造 では,/etc/rc.d/ ディレクトリに複雑なサブディレクトリがあ り,それぞれのサブディレクトリにはシステムサービスの起動と停止の方法を 指定しているファイルがあります.ですが,ブートディスクの sysinit スク リプトは普通はとてもシンプルなものになるでしょう.
sysinit スクリプトが終了すると,制御は init
に返されます.
init
は続いてデフォルトの実行レベルに入ります(これは
inittab
の initdefault
の項目で指定します).実行レベルの行で
は普通は getty
のようなプログラムを指定します.ここで指
定したプログラムはコンソールや tty 経由の通信を処理します.おなじみの
``login:
'' というプロンプトを出しているのも getty
プログラム
です.getty
プログラムは続いて login
プログラムを
実行し,これがログイン認証やユーザセッションの設定を行います.
これまで説明した基本的なブート処理を理解していれば,ブートに必要となる 色々な種類のディスクを定義することができます.ここではディスクを4つに 分類します.特に断らない限り,これ以降の議論では「ディスク」という言葉 はフロッピーディスクを指すものとします.ただし,議論の大部分はハードディ スクにも同様に適用できるだろうと思います.
ブート可能なカーネルを含むディスク.このディスクを使えば カーネルをブートすることができます.この時,他のディスクにあるルートファ イルシステムを使うこともできます.通常ブートディスクに入っているカーネ ルには,ルートファイルシステムの場所を教えてやらなければなりません.
ブートディスクは他のフロッピーにあるルートファイルシステムをロードする
ことが多いですが,ハードディスク上のルートファイルシステムをロードする
ようにブートディスクを設定することもできます.この方法は新しいカーネル
のテストをする時によく使います(実は,``make zdisk
'' とすれば,
カーネルのソースコードから自動的にこのようなブートディスクを作成するこ
とができます).
Linux のシステムを動作させるために必要なファイルが入って いるファイルシステムを持つディスクです.カーネルやブートローダは 含まれなくてもかまいません.
一旦カーネルがブートすれば,他のディスクなしに,ルートディスクだけ でシステムを動作させることができます.普通はルートディスクは自動的に RAM ディスクにコピーされます.こうすればずっと速くルートディスクにアクセス できますし,ディスクドライブが空くのでユーティリティディスクを利用する こともできます.
カーネルと ルートファイルシステムが両方入っているディスクです.言い換えれば,ハー ドディスク無しで Linux システムの起動と実行を行うために必要なものが全 て入っているディスクです.このようなディスクの利点はコンパクトである -- 1 枚のディスクの中に必要なもの全てが納められている -- こ とです.しかし昨今では色々なもののサイズが大きくなってきていますので, 1 枚のディスクに必要なもの全てを収めることは(圧縮を使っても)難しくなり つつあります.
ファイルシステムを含みますが,ルートファイル システムとしてマウントするために作られたのではないディスク. ユーティ リティディスクは付加的なデータディスクです.このタイプのディスクはルー トディスクに入り切らない復旧用のユーティリティなどを別に入れておくため に使います.
一般に「ブートディスクの作成」という時は,ブート(カーネル)とルート(ファ イル)の部分を両方作成することを指します.これらは同じディスクになるこ と(1 枚のブート/ルートディスク)も,別のディスクになること(ブートディス ク + ルートディスク)もあります.レスキューディスクの用途には,別々のブー トディスクとルートディスクを組み合わせて使えばとてモ柔軟に運用できるで しょう.そして,入りきらない分に対してユーティリティディスクを別に用意 するとよいでしょう.