ブートコンセプトを設計する時、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 変数を使って、このような場所に強制的に 置くことは可能です。しかし論理パーティションからのブートをサポートした マスターブートレコードに置くようなプログラムは殆どないでしょう。 |