1. 程式人生 > >GPT分割槽資料格式分析(圖已補上)

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等)就是構建在這裡面。
下面看一個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主分割槽頭資料格式

位元組偏移

長度

內容

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

HP-UX

資料分割槽

75894C1E-3AEB-11D3-B7C1-7B03A0000000

服務分割槽

E2A1E728-32E3-11D6-A682-7B03A0000000

Linux

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

UFS分割槽

516E7CB6-6ECF-11D6-8FF8-00022D09712B

ZFS分割槽

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

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

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的區域。
備份分割槽頭與備份分割槽表項存在的主要意義就是資料恢復。