ブートコンセプトを設計する時、PC がディスクを如何に巧妙に構成しているかを 理解することは重要です。最も単純なケースはフロッピーディスクです。それは、 ブートセクターと(FAT やスーパーブロックなどの)いくつかの管理データとデータ 領域から構成されています。管理データは、ことブートに関する限りでは、あまり 関係はありませんから、話を簡単にするため、データ領域と一緒に扱います。
+---------------------------+
|ブートセクター| |
|--------------+ |
| |
| データ領域 |
| |
| |
+---------------------------+ |
Linux ではディスク全体は(/dev/fd0 のような)一つのデバイスとして表現します。
MS-DOS のブートセクターは以下のような構造をしています−
+--------------------------------+
0x000 |プログラムコードへのジャンプ命令|
|--------------------------------|
0x003 | |
| ディスクパラメータ |
| |
|--------------------------------|
0x02C/0x03E | |
| プログラムコード |
| |
| |
|--------------------------------|
0x1FE | マジックナンバー (0xAA55) |
+--------------------------------+ |
LILO も殆ど同じブートセクターを使っていますが、ディスクパラメータの部分は 含んでいません。このことは Minix や Ext2 などその他類似のファイルシステム にとっては問題ありません。これらはブートセクターを見ないからです。しかし MS-DOS ファイルシステムに LILO のブートセクターを置くと、MS-DOS がアクセス 不能になってしまいます。
ハードディスクはフロッピーディスクよりも複雑に構成されています。そこには パーティションと呼ばれる、いくつかのデータ領域が含まれています。MS-DOS の ハードディスクには、基本パーティションと呼ばれるパーティションが最大 4 つ まで存在します。より多くのパーティションが必要な場合は、一つの基本 パーティションを、いくつかの論理パーティションを含む、拡張パーティション として使います。
ハードディスクの最初のセクターにはパーティションテーブルがあります。また 拡張パーティションと「それぞれの」論理パーティションにもパーティション テーブルが存在します。
+--------------------------------------------+
| パーティションテーブル /dev/hda |
| +------------------------------------------|
| | パーティション 1 /dev/hda1 |
| | |
| |------------------------------------------|
| | パーティション 2 /dev/hda2 |
| | |
+--------------------------------------------+ |
ディスク全体には、/dev/hda、/dev/hdb、/dev/sda、などといった呼称でアクセス することができます。基本パーティションは、/dev/hda1 ... /dev/hda4 です。
+--------------------------------------------+
| パーティションテーブル /dev/hda |
| +------------------------------------------|
| | パーティション 1 /dev/hda1 |
| | |
| |------------------------------------------|
| | パーティション 2 /dev/hda2 |
| | |
| |------------------------------------------|
| | 拡張パーティション /dev/hda3 |
| | +----------------------------------------|
| | | 拡張パーティションテーブル |
| | |----------------------------------------|
| | | パーティション 3 /dev/hda5 |
| | | |
| | |----------------------------------------|
| | | 拡張パーティションテーブル |
| | |----------------------------------------|
| | | パーティション 4 /dev/hda6 |
| | | |
+--------------------------------------------+ |
このハードディスクには 2 つの基本パーティションと 2 つの論理パーティションを 含む拡張パーティションがあります。論理パーティションは、/dev/hda5 ... として アクセスできます。
論理パーティションのパーティションテーブルには、あるデバイスの先頭ブロックと してアクセスできないことに注意してください。ただし、メインのパーティション テーブル、全てのブートセクター、及び拡張パーティションのパーティションテーブル にはアクセスできます。
パーティションテーブルは、パーティションブートセクターに格納されます。通常、 ディスク全体のパーティションブートセクターだけは、一種のブートセクターとして 使います。それはまた、よくマスターブートレコード(MBR)を呼ばれ、以下のような 構造になっています−
+---------------------------+
0x000 | |
| プログラムコード |
| |
| |
|---------------------------|
0x1BE | パーティションテーブル |
| |
|---------------------------|
0x1FE | マジックナンバー (0xAA55) |
+---------------------------+ |
LILO のブートセクターは、パーティションブートセクターとして使用できるように 設計されています。(つまりパーティションテーブル用のスペースを確保してます) そのため、LILO ブートセクターは、以下のような場所に置くことができます。
Linux フロッピーディスクのブートセクター。 (/dev/fd0, ...)
第1ハードディスクの MBR。(/dev/hda, /dev/sda, ...)
第1ハードディスクの Linux ファイルシステムの基本パーティションの ブートセクター。(/dev/hda1, ...)
第1ハードディスクの拡張パーティションのパーティションブートセクター。 (/dev/hda1, ...) [1]
LILO は以下の場所には置くことはできません。
Linux 以外のフロッピーディスクや基本パーティションのブートセクター。
Linux のスワップパーティション。
拡張パーティション内の論理パーティションのブートセクター。 [2]
第 2 ハードディスク上。(現在の第1ハードディスクが外されたり、壊れた 場合のバックアップ用のインストールの場合はこの限りではありませんし、 他のブートローダを使って他のデバイスからブートすることは可能です。
LILO は無効な場所にブートセクターを何とか置くことを試みようとしますが、 決してそれを信じてはいけません。
| [1] | 殆どの FDISK などのプログラムは拡張パーティションからブートされるとは 思っていないので、拡張パーティションをアクティブにすることを拒否します。 LILO は、この制限のない activate という小さなプログラムを同梱しています。 Linux fdisk もまた拡張パーティションのアクティブ化をサポートしています。 |
| [2] | LILO を、-b オプションや、BOOT 変数を使って、このような場所に強制的に 置くことは可能です。しかし論理パーティションからのブートをサポートした マスターブートレコードに置くようなプログラムは殆どないでしょう。 |