GPT分割槽資料格式分析(圖已補上)
http://blog.csdn.net/diaoxuesong/article/details/9406015
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等)就是構建在這裡面。
圖 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主分割槽頭資料格式
位元組偏移 |
長度 |
內容 |
0 |
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分割槽表項資料格式
起始位元組 |
長度 |
內容 |
0 |
16位元組 |
分割槽型別GUID |
16 |
16位元組 |
分割槽GUID |
40 |
8位元組 |
末尾LBA |
48 |
8位元組 |
屬性標籤(如:bit60表示“只讀”) |
可以看出,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 |
|
C12A7328-F81F-11D2-BA4B-00A0C93EC93B |
||
21686148-6449-6E6F-744E-656564454649 |
||
微軟保留分割槽 |
E3C9E316-0B5C-4DB8-817D-F92DF00215AE |
|
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 |
||
5808C8AA-7E8F-42E0-85D2-E1E90434CFB3 |
||
邏輯軟盤管理工具資料分割槽 |
AF9B60A0-1431-4F62-BC68-3311714A69AD |
|
Windows恢復環境 |
DE94BBA4-06D1-4D40-A16A-BFD50179D6AC |
|
37AFFC90-EF7D-4e96-91C3-2D7AE055B174 |
||
資料分割槽 |
75894C1E-3AEB-11D3-B7C1-7B03A0000000 |
|
服務分割槽 |
E2A1E728-32E3-11D6-A682-7B03A0000000 |
|
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 |
||
A19D880F-05FC-4D3B-A006-743F0F84911E |
||
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F |
||
E6D6D379-F507-44C2-A23C-238F2A3DF928 |
||
保留 |
8DA63339-0007-60C0-C436-083AC8230908 |
|
啟動分割槽 |
83BD6B9D-7F41-11DC-BE0B-001560B84F0F |
|
資料分割槽 |
516E7CB4-6ECF-11D6-8FF8-00022D09712B |
|
交換分割槽 |
516E7CB5-6ECF-11D6-8FF8-00022D09712B |
|
516E7CB6-6ECF-11D6-8FF8-00022D09712B |
||
516E7CBA-6ECF-11D6-8FF8-00022D09712B |
||
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 |
|
啟動分割槽 |
6A82CB45-1DD2-11B2-99A6-080020736631 |
|
根分割槽 |
6A85CF4D-1DD2-11B2-99A6-080020736631 |
|
交換分割槽 |
6A87C46F-1DD2-11B2-99A6-080020736631 |
|
備份分割槽 |
6A8B642B-1DD2-11B2-99A6-080020736631 |
|
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 |
49F48D5A-B10E-11DC-B99B-0019D1879648 |
||
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 |
0 |
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的區域。
備份分割槽頭與備份分割槽表項存在的主要意義就是資料恢復。