1. 背景與前言
随着技術的不斷提高,電子産品的內建度變得越來越高,硬碟是這幾年中的一個突出産品,近年來,硬碟容量不斷提升,從500G到1TB,目前已經能以很便宜的價格買到3TB的硬碟。
分區就是把一塊大的實體硬碟分成一個一個的邏輯盤,這樣便于文檔歸類,減少壞道損失。
傳統的分區格式我們稱其為MBR分區,傳統的MBR分區格式有一個2TB的限制:當個分區大小不能超過2TB。
以前在企業和伺服器領域,一個分區達到2T的情況很正常,是以GPT分區其實很早就已經出現了,隻是個人使用者用不到而已。
現在,很多人自己就能話很少的錢達到組建幾TB的磁盤陣列,是以現在個人使用者的作業系統也開始使用GPT分區了。
網絡上介紹MBR分區的文章很多,本文不做贅述。但對于GPT分區,至少我前段時間查資料發現深入講解的文章還不算多。
本文就GPT分區格式進行簡單的講解。
本文部分資料來源于維基百科:http://en.wikipedia.org/wiki/GUID_Partition_Table
2. 術語及縮寫
術語/縮寫 | 解釋 |
GPT | GUID Partition Table |
MBR | Master Boot Record |
LBA | Logic Block Address |
3. GPT分區資料格式
3.1 LBA0
LBA0就是儲存設備的第0個邏輯存儲塊。
邏輯存儲塊,是與實體存儲塊進行區分的,因為目前的工藝水準導緻不論NAND還是機械硬碟都存在壞塊的情況,在使用儲存設備時,遇到損壞的存儲塊就會被驅動程式或固件自動跳過,是以壞塊對于驅動程式以上的應用程式來說是透明的,他們感受不到壞塊,也不關注壞塊,他們對儲存設備的存儲塊進行的編号稱為 邏輯塊位址(也可以叫: 邏輯塊編号)。
GPT分區為了相容傳統的MBR分區,其第一個邏輯塊資料格式與MBR分區一緻,即:第一個邏輯塊就是MBR(主引導記錄)。
但為了與傳統的MBR分區進行區分,GPT分區的分區類型為EE,在傳統的MBR中,EE類型的分區表示保護類型,GPT以此來防止其資料被無意間篡改。
GPT分區的資料格式如下圖所示:

圖 1 GPT分區資料格式
在GPT分區中,每一個資料讀寫單元成為LBA(邏輯塊位址),一個“邏輯塊”相當于傳統MBR分區中的一個“扇區”,之是以會有差別,是因為GPT除了要支援傳統硬碟,還需要支援以NAND FLASH為材料的SSD硬碟,這些硬碟的一個讀寫單元是2KB或4KB,是以GPT分區中幹脆用LBA來表示一個基礎讀寫塊,當GPT分區用在傳統硬碟上時,通常,LBA就等于扇區号,有些實體硬碟支援2KB對齊,此時LBA所表示的一個邏輯塊就是2KB的空間。
為了友善,我們後面仍然将邏輯塊稱為扇區。
在圖1中可以看出:
- 第0扇區:和傳統MBR分區一樣,仍然為主引導記錄
- 第1扇區:我們稱之為“主分區頭”
- 第2~33扇區:共計32個扇區,我們稱之為“主分區節點”
- 最後一個扇區(-1扇區):我們稱之為“備份分區頭”,它就是“主分區頭”的一個Copy
- 從-2~-33扇區:共計32個扇區,我們稱之為“備份分區節點”,它就是“主分區節點”的一個Copy
- 第34~-34扇區:正常的GPT分區内容,檔案系統(如:FAT,NTFS,EXT等)就是建構在這裡面。
下面看一個GPT分區的第0個扇區,即MBR執行個體:
圖 2 GPT分區的第0個邏輯塊-MBR
圖2中隻截取了第一個扇區(位址範圍:0x0000~0x01FF)的最末部分,圖中,反色顯示的部分在MBR的資料格式中是用于定義4個主分區的,在圖2中,可以明确的看出來:隻定義了一個主分區,且其類型為0xEE:
用WinHex工具分析此MBR結果如下:
圖 3 WinHex分析GPT的第0個扇區
圖3中,WinHex分析結果也顯示第一個分區的類型是EE。
bootloader(或BIOS)根據這個EE就能知道這是一個GPT分區表。
3.2 LBA1
參考圖1,GPT分區的LBA1中存放的内容我們稱為“主分區頭(Primary GPT Header)”,主分區頭的資料格式如下:
表格 1 GPT主分區頭資料格式
位元組偏移 | 長度 | 内容 |
8位元組 | 簽名("EFI PART", 45 46 49 20 50 41 52 54) | |
8 | 4位元組 | 修訂版本号(在1.0版中,值是 00 00 01 00) |
12 | 4位元組 | 分區頭的大小(機關是位元組,通常是92位元組,即 5C 00 00 00) |
16 | 4位元組 | 分區頭(第0-91位元組)的CRC32校驗,計算前需先将此内容寫0 |
20 | 4位元組 | 保留,必須是 0 |
24 | 8位元組 | 目前LBA(這個分區表頭的位置) |
32 | 8位元組 | 備份LBA(另一個分區表頭的位置) |
40 | 8位元組 | 第一個可用于分區的LBA(主分區表的最後一個LBA + 1) |
48 | 8位元組 | 最後一個可用于分區的LBA(備份分區表的第一個LBA − 1) |
56 | 16位元組 | 硬碟GUID(在類UNIX系統中也叫UUID) |
72 | 8位元組 | 分區表項的起始LBA(在主分區表中是2) |
80 | 4位元組 | 分區表項的數量 |
84 | 4位元組 | 一個分區表項的大小(通常是128) |
88 | 4位元組 | CRC32 of partition array |
92 | * | 保留,剩餘的位元組必須是0(對于512B/LBA的硬碟就是420個位元組) |
下面是一個主分區頭的執行個體:
圖 4 GPT分區頭執行個體
在圖4的執行個體中,可以看出,與上面的表1中定義的資料格式是一一對應的。
從圖4可以得知,此GPT分區的分區表項是從LBA2開始的:
一共有28個分區:
每個分區表項的大小是128位元組:
3.3 LBA2~LBA33
LBA2到LBA33,一共32個邏輯塊,是用于存儲分區表項的,每一個分區表項就描述了一個分區,分區表項的資料格式如下:
表格 2 GPT分區表項資料格式
起始位元組 | 長度 | 内容 |
16位元組 | 分區類型GUID | |
16 | 16位元組 | 分區GUID |
32 | 8位元組 | 起始LBA(小端序) |
40 | 8位元組 | 末尾LBA |
48 | 8位元組 | 屬性标簽(如:bit60表示“隻讀”) |
56 | 72位元組 | 分區名(可以包括36個UTF-16(小端序)字元) |
可以看出,GPT分區的分區類型,分區辨別,都是用GUID進行區分的(GUID在Linux上通常叫UUID),如果你不了解GUID,請自行請教維基百科。
下面是我截取的兩個分區表項的執行個體:
圖 5 GPT分區表項執行個體
将圖5對照表2,即可知道這兩個分區的具體資訊:
分區1:
- 分區範圍:LBA[0x20000] ~ LBA[0x4abdf],共計87536KB
- 分區名:modem
分區2:
- 分區範圍:LBA[0x60000] ~ LBA[0x600FF],共計128KB
- 分區名:sbl1
分區類型的GUID通常約定如下:
表格 3 分區類型的GUID約定
作業系統 | 分區類型 | GUID[1] |
(None) | 未使用 | 00000000-0000-0000-0000-000000000000 |
MBR分區表 | 024DEE41-33E7-11D3-9D69-0008C781F39F | |
EFI系統分區 | C12A7328-F81F-11D2-BA4B-00A0C93EC93B | |
BIOS引導分區 | 21686148-6449-6E6F-744E-656564454649 | |
Windows | 微軟保留分區 | E3C9E316-0B5C-4DB8-817D-F92DF00215AE |
基本資料分區[2] | EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 | |
邏輯軟碟管理工具中繼資料分區 | 5808C8AA-7E8F-42E0-85D2-E1E90434CFB3 | |
邏輯軟碟管理工具資料分區 | AF9B60A0-1431-4F62-BC68-3311714A69AD | |
Windows恢複環境 | DE94BBA4-06D1-4D40-A16A-BFD50179D6AC | |
IBM GPFS分區 | 37AFFC90-EF7D-4e96-91C3-2D7AE055B174 | |
HP-UX | 資料分區 | 75894C1E-3AEB-11D3-B7C1-7B03A0000000 |
服務分區 | E2A1E728-32E3-11D6-A682-7B03A0000000 | |
Linux | 資料分區[2] | EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 |
RAID分區 | A19D880F-05FC-4D3B-A006-743F0F84911E | |
交換分區 | 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F | |
邏輯卷管理器(LVM)分區 | E6D6D379-F507-44C2-A23C-238F2A3DF928 | |
保留 | 8DA63339-0007-60C0-C436-083AC8230908 | |
FreeBSD | 啟動分區 | 83BD6B9D-7F41-11DC-BE0B-001560B84F0F |
資料分區 | 516E7CB4-6ECF-11D6-8FF8-00022D09712B | |
交換分區 | 516E7CB5-6ECF-11D6-8FF8-00022D09712B | |
UFS分區 | 516E7CB6-6ECF-11D6-8FF8-00022D09712B | |
en:Vinum-volume-manager分區 | 516E7CB8-6ECF-11D6-8FF8-00022D09712B | |
ZFS分區 | 516E7CBA-6ECF-11D6-8FF8-00022D09712B | |
Mac OS X | HFS(HFS+)分區 | 48465300-0000-11AA-AA11-00306543ECAC |
蘋果公司UFS | 55465300-0000-11AA-AA11-00306543ECAC | |
ZFS[3] | 6A898CC3-1DD2-11B2-99A6-080020736631 | |
蘋果RAID分區 | 52414944-0000-11AA-AA11-00306543ECAC | |
蘋果RAID分區,下線 | 52414944-5F4F-11AA-AA11-00306543ECAC | |
蘋果啟動分區 | 426F6F74-0000-11AA-AA11-00306543ECAC | |
Apple Label | 4C616265-6C00-11AA-AA11-00306543ECAC | |
Apple TV 恢複分區 | 5265636F-7665-11AA-AA11-00306543ECAC | |
Solaris | 啟動分區 | 6A82CB45-1DD2-11B2-99A6-080020736631 |
根分區 | 6A85CF4D-1DD2-11B2-99A6-080020736631 | |
交換分區 | 6A87C46F-1DD2-11B2-99A6-080020736631 | |
備份分區 | 6A8B642B-1DD2-11B2-99A6-080020736631 | |
/usr分區[3] | 6A898CC3-1DD2-11B2-99A6-080020736631 | |
/var 分區 | 6A8EF2E9-1DD2-11B2-99A6-080020736631 | |
/home 分區 | 6A90BA39-1DD2-11B2-99A6-080020736631 | |
備用扇區 | 6A9283A5-1DD2-11B2-99A6-080020736631 | |
保留分區 | 6A945A3B-1DD2-11B2-99A6-080020736631 | |
6A9630D1-1DD2-11B2-99A6-080020736631 | ||
6A980767-1DD2-11B2-99A6-080020736631 | ||
6A96237F-1DD2-11B2-99A6-080020736631 | ||
6A8D2AC7-1DD2-11B2-99A6-080020736631 | ||
NetBSD[4] | 交換分區 | 49F48D32-B10E-11DC-B99B-0019D1879648 |
FFS分區 | 49F48D5A-B10E-11DC-B99B-0019D1879648 | |
LFS分區 | 49F48D82-B10E-11DC-B99B-0019D1879648 | |
RAID分區 | 49F48DAA-B10E-11DC-B99B-0019D1879648 | |
concatenated分區 | 2DB519C4-B10F-11DC-B99B-0019D1879648 | |
加密分區 | 2DB519EC-B10F-11DC-B99B-0019D1879648 |
[1] 本表中的GUID使用小端序表示。例如,EFI系統分區的GUID在這裡寫成C12A7328-F81F-11D2-BA4B-00A0C93EC93B但實際上它對應的16位元組的序列是 28 732A C1 1F F8 D2 11 BA 4B 00 A0 C9 3E C9 3B ——隻有前3部分的位元組序被交換了。
[2] Linux和Windows的資料分區使用相同的GUID。
[3] Solaris系統中/usr分區的GUID在Mac OS X上被用作普通的ZFS分區。
[4] 具體定義見src/sys/sys/disklabel_gpt.h。NetBSD的GUID在單獨定義之前曾經使用過FreeBSD的GUID。
實際上,GUID的約定主要是為了BIOS友善識别分區類型,在嵌入式系統中,這主要由bootloader來約定。
GPT分區表項中,有一個分區屬性的區域,此區域主要是指明此分區的屬性,如隻讀,隐藏,啟動等,通常的約定如下:
表格 4 GPT分區屬性标簽定義
Bit | Content |
System partition (disk partitioning utilities must preserve the partition as is) | |
2 | Legacy BIOS bootable (equivalent to active flag (typically bit 7 set) at offset +0h in partition entries of the MBR partition table)[6] |
60 | Read-only |
62 | Hidden |
63 | Do not automount (i.e., do not assign drive letter) |
分區屬性标簽是位結構的,即:一位表示一個開關
3.4 備份分區頭與備份分區表項
備份分區頭實際上與主分區頭的内容完全一樣,隻是它存儲在最後一個邏輯塊(LBA-1)
備份分區表項的内容與分區表項的内容也是完全一緻的,隻是它存放的位置是LBA-33到LBA-2的區域。
備份分區頭與備份分區表項存在的主要意義就是資料恢複。