背景
fdiskコマンドとかで何気なくパーティションをいじくっている中で、
パーティションテーブルを持っているMBRくんおことを全然知らないと思って調査してみた備忘録。
調査
MBR(マスターブートレコード)
HDDなどの記憶媒体の最初のセクタ(512bytes)に存在する特殊なレコード。
OSの読み込みだったり、ディスクパーティションの情報だったり、
重要な情報がこの512Bytesの中に入っている。
MBRの構成がどうなっているのか
MBRは1セクタ分の容量 = 512Byteで構成されており、
BIOS形式のMBRの場合、具体的には下記の情報が含まれる
Byte Offset | 容量 | 内容 | 備考 |
---|---|---|---|
00~445 | 446Bytes | ブートストラップローダ | |
446~461 | 16Bytes | 1st パーティションテーブル | |
462~477 | 16Bytes | 2nd パーティションテーブル | |
478~493 | 16Bytes | 3rd パーティションテーブル | |
494~509 | 16Bytes | 4th パーティションテーブル | |
510~511 | 1Bytes | ブートシグニチャ | MBRの有効性を示す特定値 |
【想像】なぜ標準パーティションが4つしか持てないのか
BIOS形式のディスクって標準パーティションが4つしか持てないのは、
MBRレコードの中にパーティションを示す領域を16byte * 4 = 64byte分しか用意できなかったからかな?
この設計が現代まで生きているので、標準パーティションは4つまでしか作れないということかな・・・
ブートストラップローダの構造
ものすごく端折って言ってしまえば、OS起動用のパーティションを作成し読み込むための関数が設置されている。
具体的には、下記のような動作を行っているらしい。
- パーティションテーブルの検査
- 4つのテーブルエントリーを先頭から順に検査し、起動可能な(起動フラグの立った)基本領域がないか探す。
- 見つかったら、その領域の先頭位置をテーブルから取得する。 BIOSにその位置を示して、当該先頭セクターをメモリーにロードしてもらう。
- ロードした先頭セクターに制御を移す。
引用:http://nobusan.jp/computer/boot/bootstrap.html
②の起動フラグの立った基本領域というのは、後述するパーティションテーブルのブートフラグのことと考えられる。
あくまでMBRのブートストラップローダは、OS起動用パーティションを見つけて読み込むことだけを目的としていて、
OSの起動自体は、起動用パーティションのPBR(PartitionBootRecord)が実施するものと思う。
パーティションテーブルの構造
パーティションテーブルは16Byteで構成されており、構造は下記のようになっている
容量 | 内容 | 備考 |
---|---|---|
1byte | ブートフラグ | 起動パーティションとして利用可能かを示す値(0x80 → 可 / 0x00 → 不可) |
3byte | 開始セクタ(CHS) | 使用されていない |
1byte | パーティション識別子(システムID) | ファイルシステムを値で指定する(参考) |
3byte | 最終セクタ(CHS) | 使用されていない |
4byte | 開始セクタ(LBA) | |
4byte | パーティションの総セクタ数(LBA) |
【疑問点】CHSって何?なぜ使用されていない?
CHSは「Cylinder Head Sector」の略で、シリンダー(C)・ヘッド(H)・セクター(S)の三つの頭文字で作られている。
古いハードディスクの読み書き場所の指定に使われていた方式?らしい。
恐らくは、古い形式の要素であるため、現在は使用されていない、いうことだと考えられる。
【疑問点】LBAって何?
LBAは「Logical Block Address」の略。
ディスクの各セクタに「論理ブロック」と呼ばれる通し番号を振り、
この番号を指定することで、任意のセクタにアクセスするロジック。
CHSはディスクアクセスの際に複数の情報だったが、こっちのほうがシンプルで使いやすいのかな。
CHSが使用されていない、ということは、基本的にはこちらが利用されているものと考えられる
【想像】MBRの2TBの壁の正体
BIOS形式のMBRで作成できるパーティションの最大サイズは2TBという話は有名で、
これの正体はパーティションテーブルの末尾4Byteに示す「パーティションの総セクタ数」に関係があると思う。
4Byteは-2,147,483,648~2,147,483,647の値を表現することが可能なので、最大で4,294,967,296の値を表現することができる。
つまり、パーティションの総セクタ数としてして利用できるのも4,294,967,296個までということになる。
1セクタが512Byteだから、
4,294,967,296 × 512 = 2,199,023,255,552
となり、おおよそ2TBまでがパーティションで利用できる容量の最大値ということになる。
【想像】ディスク容量を指定するときに512Byteの倍数で指定する理由
これもパーティションテーブルの末尾に示す、「パーティションの総セクタ数」に関係がある
容量は1Byte単位で指定するわけじゃなくて、あくまで利用するセクタ数で判断されるため、
1セクタ=512Byteだから、Byte指定する場合は512の倍数にしないといけない、ということ。
##ブートシグニチャについて
MBRの最後の1byteに書き込まれているマジックナンバー的なもの。
「0xAA55」が書き込まれていなければ、無効なMBRとして判断される。