MBR(Master Boot Recode)の構造

MBRはHDDの先頭セクタ(cylinder 0, head 0, sector 1の位置)に512byte書込まれていて、各パーティションの先頭セクタに存在するPBRを読出すための小さなプログラムと各パーティションのディスク情報が含まれています。

各パーティションの先頭セクタに存在するPBRがOSに依存するのに対して、MBRはOSに依存しない構成になっているます。人によってはLILOやGNU GRUBまたは自作のローダーが書込まれマルチブート可能な環境になっているかも知れません。

MBRの構造

MBR領域はPCの電源がONされたときにBIOSによってメモリー上の0000:7C00番地に読込まれます。この領域は、次のような構造になっています。

MBRの構造
MBRの構造

Master Bootstrap Loader

先頭から446Byteの領域は、パーティションの先頭セクタにあるPBRをロードするためのプログラムが書かれています。このプログラムの名称は統一されていない為、複数の名前が存在し非常に紛わしい事になっています。私が知っているだけでも下記の呼び名が存在しています。

ここでは、Master Bootstrap Loaderを統一名称として採用することにします。

パーティションテーブル[Partition Table]

次の、64bytesの領域はパーティションテーブル[Partition Table]と呼ばれ、HDDのパーティション(区画、領域)に関する情報を格納しています。これらは、それぞれ16bytesの領域で4つのパーティション情報を格納することが出来ます。

各パーティションテーブルは下記の情報を格納しています。

Partition Tableの構造
名称サイズ詳細
ブートフラグ1byteこのフラグはこのパーティションがブート可能かを示す。
0x0h:ブート不可 0x80hブート可
パーティションの開始位置3bytesCHSアドレスでのパーティション開始位置
パーティションタイプ1bytesどのOS・ファイルシステムで使われているかを示す。
パーティションタイプ一覧
パーティションの終了位置3bytesCHSアドレスでのパーティション終了位置
パーティションの開始位置4bytesLBAアドレスでのパーティション開始位置
パーティションの総セクター数4bytesLBAアドレスでのパーティション総セクター数

パーティションの位置情報はCSHLBAの値がセットされています。

BOOT Signature

最後の領域は、BOOT Signatureと呼ばれるもので、必ずマジックナンバーと呼ばれる固定値(0xAA55)が入っています。この値が入っていないとマスターブートレコード自体が無効なものとして扱われ、ブートストラップローダは実行されません。つまりこのマスターブートレコードが正当なものであることを保証する署名の役割があります。

OpenBSDのMBR

MBRはOpenBSDのインストール時に(もちろん、運用後にも)、fdiskコマンドによって変更・書込みを行う事が出来ます。

・MBRの抜き出し方
suでスーパーユーザーになり、次のコマンドを実行する事により、openbsd.mbrと言うファイルにMBRが出力される。
# dd if=/dev/wd0c of=openbsd.mbr bs=512 count=1
	

下に示したダンプは、私が使用している環境の(Maxtor 4R160L0 16-sector PIO, LBA48, 156334MB, 320173056 sectors)HDDに書込まれているMBRです。

自宅マシンの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パーティション テーブルをもう少し詳しく分析したものが下記の表になります。

Partition Table4の構成
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形式の値は、ちょっと複雑で次のようなビットアサインになっています。

CHS値のビットアサイン
--- head (8bits)   sector (6bits) cylinder (10bit)
16進数 F E F F F F
2進数 1111 1110 1111 1111 1111 1111
終了位置(CHS) FE 3 3F FF

またLBAの値は、リトルエンディアン形式で格納されています。したがって、テーブルの値と実際の値は異なり、table値を逆に読んだものが実際の値となります。これらをまとめると、次のような値になります。

OpenBSDがあるPartition Table4の値
---- 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

パーティション開始位置(CHS)

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)

CHS形式の場合、アクセスできる最大値は8.5GBに制限されます。このHDDは8.5GB以上の容量を持っているので、CHSによるパーティション終了位置の情報は意味をなしません。

理由はわからないのですが、普通に考えると8.5GB以上場合、CHSの値は最大値を取ると思うのですが、何故かHead値は255でなく254がセットされています。これを計算すると(255*63*1024*512)= 約7.8MBがOpenBSDパーティションの終了位置となります。

Last modified: Wed Jan 23 16:29:27 2008 JST