MBRはHDDの先頭セクタ(cylinder 0, head 0, sector 1の位置)に512byte書込まれていて、各パーティションの先頭セクタに存在するPBRを読出すための小さなプログラムと各パーティションのディスク情報が含まれています。
各パーティションの先頭セクタに存在するPBRがOSに依存するのに対して、MBRはOSに依存しない構成になっているます。人によってはLILOやGNU GRUBまたは自作のローダーが書込まれマルチブート可能な環境になっているかも知れません。
MBRはHDDの先頭セクタ(cylinder 0, head 0, sector 1の位置)に512byte書込まれていて、各パーティションの先頭セクタに存在するPBRを読出すための小さなプログラムと各パーティションのディスク情報が含まれています。
各パーティションの先頭セクタに存在するPBRがOSに依存するのに対して、MBRはOSに依存しない構成になっているます。人によってはLILOやGNU GRUBまたは自作のローダーが書込まれマルチブート可能な環境になっているかも知れません。
MBR領域はPCの電源がONされたときにBIOSによってメモリー上の0000:7C00
番地に読込まれます。この領域は、次のような構造になっています。
先頭から446Byteの領域は、パーティションの先頭セクタにあるPBRをロードするためのプログラムが書かれています。このプログラムの名称は統一されていない為、複数の名前が存在し非常に紛わしい事になっています。私が知っているだけでも下記の呼び名が存在しています。
ここでは、Master Bootstrap Loaderを統一名称として採用することにします。
次の、64bytesの領域はパーティションテーブル[Partition Table]と呼ばれ、HDDのパーティション(区画、領域)に関する情報を格納しています。これらは、それぞれ16bytesの領域で4つのパーティション情報を格納することが出来ます。
各パーティションテーブルは下記の情報を格納しています。
名称 | サイズ | 詳細 |
---|---|---|
ブートフラグ | 1byte | このフラグはこのパーティションがブート可能かを示す。 0x0h:ブート不可 0x80hブート可 |
パーティションの開始位置 | 3bytes | CHSアドレスでのパーティション開始位置 |
パーティションタイプ | 1bytes | どのOS・ファイルシステムで使われているかを示す。 パーティションタイプ一覧 |
パーティションの終了位置 | 3bytes | CHSアドレスでのパーティション終了位置 |
パーティションの開始位置 | 4bytes | LBAアドレスでのパーティション開始位置 |
パーティションの総セクター数 | 4bytes | LBAアドレスでのパーティション総セクター数 |
最後の領域は、BOOT Signatureと呼ばれるもので、必ずマジックナンバーと呼ばれる固定値(0xAA55)が入っています。この値が入っていないとマスターブートレコード自体が無効なものとして扱われ、ブートストラップローダは実行されません。つまりこのマスターブートレコードが正当なものであることを保証する署名の役割があります。
MBRはOpenBSDのインストール時に(もちろん、運用後にも)、fdiskコマンドによって変更・書込みを行う事が出来ます。
# dd if=/dev/wd0c of=openbsd.mbr bs=512 count=1
下に示したダンプは、私が使用している環境の(Maxtor 4R160L0 16-sector PIO, LBA48, 156334MB, 320173056 sectors)HDDに書込まれているMBRです。
_OFFSET_ 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000: EA 05 00 C0 07 8C C8 8E D0 BC FC FF 8E D8 B8 A0 ................ 00000010: 07 8E C0 31 F6 31 FF B9 00 02 FC F3 A4 EA 22 00 ...1.1........". 00000020: A0 07 1E 07 0E 1F B4 02 CD 16 A8 03 74 0A B0 07 ............t... 00000040: E8 CB 00 80 0E B4 01 01 F6 C2 80 75 08 BE 36 01 ...........u..6. 00000030: E8 AF 00 B2 80 BE BE 01 B9 04 00 8A 04 3C 80 74 .............<.t 00000050: 0F 83 C6 10 E2 F5 BE 6A 01 E8 96 00 FB F4 EB FC .......j........ 00000060: 88 D0 24 0F 04 30 A2 27 01 B0 34 28 C8 A2 34 01 ..$..0.'..4(..4. 00000070: 56 BE 1A 01 F6 06 B4 01 01 75 01 46 E8 73 00 5E V........u.F.s.^ 00000080: 26 C7 06 FE 01 00 00 F6 06 B4 01 01 75 31 88 14 &...........u1.. 00000090: BB AA 55 B4 41 CD 13 8A 14 72 24 81 FB 55 AA 75 ..U.A....r$..U.u 000000A0: 1E F6 C1 01 74 19 B0 2E E8 53 00 66 8B 4C 08 66 ....t....S.f.L.f 000000B0: 89 0E 12 01 56 B4 42 BE 0A 01 CD 13 5E 73 19 B0 ....V.B.....^s.. 000000C0: 3B E8 3A 00 8A 74 01 8B 4C 02 B8 01 02 31 DB CD ;.:..t..L....1.. 000000D0: 13 73 05 BE 52 01 EB 81 BE 7D 01 E8 14 00 26 81 .s..R....}....&. 000000E0: 3E FE 01 55 AA 75 05 EA 00 7C 00 00 BE 61 01 E9 >..U.u...|...a.. 000000F0: 67 FF 50 FC AC 84 C0 74 0F E8 02 00 EB F6 50 53 g.P....t......PS 00000100: B4 0E BB 01 00 CD 10 5B 58 C3 10 00 01 00 00 00 .......[X....... 00000110: C0 07 00 00 00 00 00 00 00 00 21 55 73 69 6E 67 ..........!Using 00000120: 20 64 72 69 76 65 20 58 2C 20 70 61 72 74 69 74 drive X, partit 00000130: 69 6F 6E 20 59 00 4D 42 52 20 6F 6E 20 66 6C 6F ion Y.MBR on flo 00000140: 70 70 79 20 6F 72 20 6F 6C 64 20 42 49 4F 53 0D ppy or old BIOS. 00000150: 0A 00 0D 0A 52 65 61 64 20 65 72 72 6F 72 0D 0A ....Read error.. 00000160: 00 4E 6F 20 4F 2F 53 0D 0A 00 4E 6F 20 61 63 74 .No O/S...No act 00000170: 69 76 65 20 70 61 72 74 69 74 69 6F 6E 0D 0A 00 ive partition... 00000180: 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001B0: 00 00 00 00 00 00 4F 78 00 00 00 00 00 00 00 00 ......Ox........ 000001C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 ................ 000001F0: 01 00 A6 FE FF FF 3F 00 00 00 5A 3E 15 13 55 AA ......?...Z>..U. 000h-1BDh Master Bootstrap Loader 1BEh-1CDh Partition Table1 1CEh-1DDh Partition Table2 1DEh-1EDh Partition Table3 1EEh-1FDh Partition Table4 1FEh-1FFh Signature |
このマシンでは、HDD全てをOpenBSDに割り付けている為、パーティション テーブルには1つしか値がエントリーされていません(OpenBSDのデフォルトは、何故か第4パーティション テーブルにエントリーされるようです)。第4パーティション テーブルをもう少し詳しく分析したものが下記の表になります。
boot flag | 開始位置(CHS) | Partition Type | 終了位置(CHS) | 開始位置(LBA) | 総セクター数(LBA) |
---|---|---|---|---|---|
80 | 01 01 00 | A6 | FE FF FF | 3F 00 00 00 | 5A 3E 15 13 |
boot flag(0x80)はOpenBSDのパーティションが起動可能であることを示しています。またPartition Type(0xA6)は、このパーティションにOpenBSDがインストールされている事を示しています。
CHS形式の値は、ちょっと複雑で次のようなビットアサインになっています。
--- | head (8bits) | sector (6bits) | cylinder (10bit) | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
16進数 | F | E | F | F | F | F | ||||||||||||||||||
2進数 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
終了位置(CHS) | FE | 3 | 3F | FF |
またLBAの値は、リトルエンディアン形式で格納されています。したがって、テーブルの値と実際の値は異なり、table値を逆に読んだものが実際の値となります。これらをまとめると、次のような値になります。
---- | boot flag | Partition Type | CHS | LBA | ||||||
---|---|---|---|---|---|---|---|---|---|---|
開始位置 | 終了位置 | 開始位置 | 総セクター数 | |||||||
H | S | C | H | S | C | |||||
tabel値 | 80 | A6 | 010100 | FEFFFF | 3F000000 | 5A3E1513 | ||||
16進数 | 80 | A6 | 1 | 1 | 0 | FE | 3F | 3FF | 3F | 13153E5A |
10進数 | 128 | 166 | 1 | 1 | 0 | 254 | 63 | 1023 | 63 | 320,159,322 |
OpenBSDが存在するパーティションの開始位置は Cylinder:0 Sector:1 Head:1になっています。CSHでのMBRの位置が Cylinder:0 Sector:1 Head:0であるから次のセクタで始まる Cylinder:0 Sector:2 Head:0が正しいように思えますがこれは違がいます。
IBMの規格では、パーティションはシリンダの境界から始める事という決まり事があます。例えばヘッダ数が10あるHDDの第1パーティションの終りが Cylinder:10 Sector:1 Head:3の場合、次のパーティションは Cylinder:11 Sector:1 Head:0から始まる事になりHeadの4-9までのトラックは使用されない領域となります。
ただし最初のパーティションの場合、パーティションはシリンダの境界から始める
と無駄になるディスク容量が多くなる(HDDの容量が少なかった昔では大容量の無駄でした)ので、最初のパーティションは次のシリンダからとする決まりになっています。
CHS形式の場合、アクセスできる最大値は8.5GBに制限されます。このHDDは8.5GB以上の容量を持っているので、CHSによるパーティション終了位置の情報は意味をなしません。
理由はわからないのですが、普通に考えると8.5GB以上場合、CHSの値は最大値を取ると思うのですが、何故かHead値は255でなく254がセットされています。これを計算すると(255*63*1024*512)= 約7.8MBがOpenBSDパーティションの終了位置となります。