天天看點

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

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分區的資料格式如下圖所示:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. 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執行個體:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

圖 2 GPT分區的第0個邏輯塊-MBR

圖2中隻截取了第一個扇區(位址範圍:0x0000~0x01FF)的最末部分,圖中,反色顯示的部分在MBR的資料格式中是用于定義4個主分區的,在圖2中,可以明确的看出來:隻定義了一個主分區,且其類型為0xEE:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

用WinHex工具分析此MBR結果如下:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

圖 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個位元組)

下面是一個主分區頭的執行個體:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

圖 4 GPT分區頭執行個體

在圖4的執行個體中,可以看出,與上面的表1中定義的資料格式是一一對應的。

從圖4可以得知,此GPT分區的分區表項是從LBA2開始的:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

一共有28個分區:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

每個分區表項的大小是128位元組:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

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,請自行請教維基百科。

下面是我截取的兩個分區表項的執行個體:

GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式
GPT分區資料格式分析(圖已補上)1. 背景與前言2. 術語及縮寫3. GPT分區資料格式

圖 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的區域。

備份分區頭與備份分區表項存在的主要意義就是資料恢複。

繼續閱讀