見出し画像

【IT】パーティションテーブルの種類

ハードディスクのパーティション管理概要

パーティションテーブルの仕様を理解しない状態でボリューム設計をしても正しい設計ができないので、きちんと理解しよう。
MBRでは2TiBまでの領域しか管理できないが、GPTでは8ZiBまでの領域が取り扱える。しかし歴史的経緯からくる制約は異なるため、きちんと理解して設計するが必要だ。

ハードディスクの管理方法

ハードディスクにデータを保管するのにディスクのどこのデータにアクセスするのかを指定するのに、当初は「CHSアドレス」を指定していた。CHSはCylinder、Head、Sectorの頭文字で、ディスク上のどの円周上(Cylinder)の、どの円盤(Head)の、どこの回転位置(Sector)かを数字で指定して示していた。

Cylinder Head Sector(CHS)アドレス


しかし、CHSアドレスで示すことができるのは8GiBまでという限界があり、この壁が現実化してきた段階でLogical Block Address(LBA)と呼ばれる方法に移行した。LBAでは物理的な格納方式とは無関係に先頭セクターを0とした連番を付けてアクセスする。アドレスを管理するビット長の分だけセクター数を管理でき、512Bytesセクターを48ビットLBAで管理した場合、128PiB(=512×2^48)が最大サイズとなる。

パーティションテーブルの存在意義

大きなストレージ領域が利用可能な場合、そのサイズは必ずしもシステムが必要とするちょうどいいサイズではないため、分割して使用できるようにすると便利である。
それを実現するためにパーティションテーブルにより領域を論理的に分割し、分割した領域(=パーティション)に必要なファイルシステムを作成して利用できるようにした。
コンピュータの種類によってパーティションテーブルの種類は異なるのだが、現在主流であるパソコンで用いられている方式について説明する。


Master Boot Record (MBR)

Master Boot Record(MBR)は、IBM PC互換機(いわゆるパソコン)で用いられているパーティションテーブルの方式である。IBM PC互換機では電源投入後、BIOS(Basic Input Output System)と呼ばれる基本プログラムが起動する。
BIOSはハードウエアの初期化を行った後、OSを読み込む必要がある。
MBRに格納されている446バイトのBootstrap Loaderが、同じくMBR内にあるパーティション情報を使用して、DOSやWindowsなどの各種OSローダーを起動して制御をスイッチする。下記の図はMBRである先頭1セクターの構造を示した図である。

MBRを使う上で知っておくべきポイント

  • ストレージ領域の先頭のセクターに配置されている。

  • 古い仕組みであるため、最大でも約2TiBまでしか管理できない

  • 基本パーティションは最大4つ作成できる。

  • Bootableな基本パーティションからOSを起動する。

  • 基本パーティションのうち1つを拡張パーティションにできる。

  • 拡張パーティションの中に複数の論理ドライブを作成できる。

  • 拡張パーティション内の論理ドライブからのOS起動不可

MBRと基本パーティション

BIOSは第1セクターを読んでその内容を実行するしかできないので、1セクターを読み出し、先頭に格納されているBootstrap Loaderを実行する。Bootstrap Loader本体は446バイトなので、447バイト目移行に格納されているパーティション管理データを元にOSローダーの位置を特定する。
447バイト目が16バイトごとに4つのパーティション情報が格納できる領域がある。一つのパーティション情報の領域を使用して構成されたものが基本パーティションと呼ぶ。歴史がある上に元が英語なので基本パーティションを基本区画、プライマリパーティション等の様々な名前で呼ばれるが同じものである。
4つのパーティション情報が格納できる領域があるので、当然基本パーティションは4つまでしか作成できない。

MBRの構造

基本パーティションの区画情報は、Bootableフラグ、CHSアドレスでの開始セクター、パーティションのタイプ、CHSアドレスでの終了セクター、LBAでの開始セクターとセクター数といった情報で構成されている。通常Bootableフラグが0x80である基本パーティションは一つだけであり、Bootableフラグが0x80であるときにBootableなパーティションとなる。BootstrapローダはそのBootableな「パーティションの先頭セクター(Partition Boot Record、PBR)」を読み込んで実行する。
PBRにはOSをロードするための専用のプログラムが配置され、制御を切り替えながらOS本体をロードし、OSによる制御に切り替える。
基本パーティションの区画情報におけるCHSアドレスの領域は昔は意味があったのだが、CHSアドレスだけではストレージ領域を表現できなくなったため、現在はLBA方式を使用しますと宣言していることを示す固定値が登録されている。

拡張パーティション

基本パーティションのうちの一つを拡張パーティションにできる。拡張パーティションではOS起動はできない代わりに必要なだけ論理ドライブが作成できる。
拡張パーティションの先頭にはEPBR(Extended Partition Boot Record)またはEBR(Extended Boot Record)と呼ばれる区画があり、最初の論理ドライブの位置を示すデータが格納されている。拡張パーティションの論理ドライブの後ろに空きがあれば、入れ子で拡張パーティションと論理ドライブが作成でき、これを繰り返すことで領域がある限り論理ドライブを作成できる。

MBRによる基本パーティションと拡張パーティション、論理ドライブの関係

パーティションタイプ

MBRおよびEPBRには、基本パーティションまたは論理ドライブに作成されているファイルシステムが何であるかを記録したパーティションタイプと呼ばれる1バイトの領域があり、フォーマット形式の識別のヒントである。
具体的にはどのような値がどういうパーティションであるかについての対応表は英語版Wikipediaが有名サイト内で最も充実しているため、そちらを参照してほしい。
なお、拡張パーティションである宣言もパーティションタイプにて宣言する形となっており、多くの場合は0x0Fが設定されている。

マジックナンバー

MBRがMBRとして書き込まれたことであることを確認、識別するためのマジックナンバーが先頭セクターの最後2バイトに書き込まれている。具体的には511バイト目に0x55、512バイト目に0x77となっている。この値がない場合は先頭セクターはMBRではないと判定される。


GUID Partition Table (GPT)

GUID Partition Table (GPT)は、BIOSやMBRに由来する問題点を解消し、大容量のストレージ(最大8ZiB)の管理と、柔軟なパーティション構成ができるようになった。

GPTを使う上で知っておくべきポイント

  • GPTはUFEI(Unified Extensible Firmware Interface)を前提としているが、BIOSを使用するシステムでも使用できるように工夫されている。

  • GPTはストレージ領域の先頭から34セクター分の領域にあるが、破損したときのための予備が末尾34セクターにもある。

  • 128個のパーティションを定義できる。

  • GPT管理ドライブはMBRにて全領域を基本パーティションとしたパーティションタイプGPTのドライブとして登録され、古いコンピュータでの利用による誤認・破損を防止している。

  • チェックサムがあり、専用のツール以外で更新したら改ざんを検知できるなど、セキュリティが強化されている。

GPTを採用してもLBA 0にはMBRがある

GPTはUEFIを前提としつつ、BIOSが搭載されているシステムに移設されて動作しても誤認から破損しないようにMBRが先頭セクター(LBA 0)に配置されることになっている。MBRは基本パーティションとして全領域がGPTであることを示すエントリーが記載される。(ハイブリッド型の例外実装もあるが、これは公式な仕様ではないとされている。)
これによりBIOSからのアクセスがあってもからのディスクだとは認識されず、破損を予防できる。

Primary GPT HeaderがLBA 1にある

GPTヘッダーの構造

LBA 1の先頭にはGPTであることを示すシグニチャーとして「EFI PART」を示す8バイト(0x45、0x46、0x49、0x20、0x50、0x41、0x52、0x54)、それに続けて4バイトのリビジョンが書き込まれている。これによりGPTがどういう仕様で記載されているかを厳密に判別できるようになっている。
その後、GPTヘッダーが全部で何バイトあるのかを4バイトで表現され、現状は92バイトを示す「0x5B、0x00、0x00、0x00」が書き込まれている。
GPTヘッダーのCRC32チェックサムは、LBA全体ではなくGPTヘッダーとして定義された部分(つまり現状は92バイト)だけを使用して計算する。なお計算中はこの部分は0として計算し、計算後にこの領域に書き込む。
予備領域4バイトを挟んだ後は、ディスク全体について何がどこにあるかを示すLBA番号やディスクそのものを識別できるようにするためのGUIDが記録されている。パーティションエントリは事項で説明するがそれ以外は説明するような難しいものではないので詳細は図を見て欲しい。
ヘッダーの一番最後にはパーティションエントリのCRC32チェックサムがある。このチェックサムを含む形でGPTヘッダーチェックサムが計算されるため、GPTのどこかが意図せず更新されたとしても検知できるようになっている。

Partition EntryがLBA2からLBA33まである

パーティションエントリーは128バイトで構成されたデータで、1つのLBAに4つ格納され、32LBA分ある。合計128エントリ分の枠がある。そのため、GPTを使用したストレージボリュームの分割は128分割までということになる。

GPTパーティションエントリの構造

1エントリ分だけをピックアップしてみよう。
最初の2つはGUIDを登録する。最初のものがパーティションに格納されているファイルシステムのGUIDを登録する。後者はこのエントリのパーティションそのもののGUIDである。そしてパーティションの開始と終了のLBA番号、そして属性フラグが格納される。
属性フラグはビット単位で設定し、ビットごとに意味を持たせている。現在の使用では0~47ビット目までは規格として決まっており、48ビット目から63ビット目まではパーティションタイプごとに独自で定義して良いことになっている。
パーティション名はUTF-16LEで36文字分のエリアがある。UTF-16LEなのでパーティション名に漢字名を付けたり絵文字を含めたりすることも可能なのだろうが、それを実施した例は知らない。

GPTヘッダとPartition Entryの予備がある

MBRだけで構成されたストレージボリュームだと、先頭のセクターを破損すると構成情報を紛失することになってしまう。
GPTではCRC32チェックサムで破損や改ざんを検知できるようになっただけではなく、予備として最後の領域に格納することでストレージ自身の破損や改ざんから自身を保護している。
万が一、プライマリーGPTの破損や不整合があった場合はセカンダリー側のヘッダーとエントリーをコピーすることで回復をはかる。

GPTで管理されたストレージ構成例

OSロードへの仕組み(EFI Boot Service)

こにらとからBIOSはMBPに含まれるBootstrapローダーを使用してBootableなパーティションからOS起動することができたが、GPTが構成されたMBRではBootableなパーティションは記載されていないため、BIOSではGPTパーティションからOSは起動できない。
GPTパーティションからOSをBootするためには前提環境としてBIOSではなくUEFIが必要となる。UEFIにはパーティションやファイルシステムを理解してOSを起動できる「EFI Boot Service」と呼ばれるファームウエアサービスが存在し、それによりOSが起動する。


【まとめ】パーティションテーブルはどう選ぶべきか

下記の場合は「そちらを選ばねばならない」というものであるが、どちらでも良い場合は壊れにくくセキュアであるGPTを採用するようにした方が良いだろう。

MBRでパーティションを作成

  • BIOSにてOSを起動しないといけない場合

  • 古いOSを動作させる場合

GPTでパーティションを作成

2TB以上のストレージボリュームを採用する場合


この記事が気に入ったらサポートをしてみませんか?