2.1. ディスク構造

ブートコンセプトを設計する時、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 ブートセクターは、以下のような場所に置くことができます。

LILO は以下の場所には置くことはできません。

LILO は無効な場所にブートセクターを何とか置くことを試みようとしますが、 決してそれを信じてはいけません。

Notes

[1]

殆どの FDISK などのプログラムは拡張パーティションからブートされるとは 思っていないので、拡張パーティションをアクティブにすることを拒否します。 LILO は、この制限のない activate という小さなプログラムを同梱しています。 Linux fdisk もまた拡張パーティションのアクティブ化をサポートしています。

[2]

LILO を、-b オプションや、BOOT 変数を使って、このような場所に強制的に 置くことは可能です。しかし論理パーティションからのブートをサポートした マスターブートレコードに置くようなプログラムは殆どないでしょう。