GPT 標頭:結構、備份與 CRC32

A GPT 標題 是一種描述磁碟 GUID 分割表(GUID Partition Table)的元資料結構。它用於識別磁碟、定位分割區條目陣列、定義可用的磁碟邊界,並儲存用於偵測元資料損毀的校驗和。GPT 會維護主標頭與備份標頭以確保冗餘。 了解其位元組佈局與 CRC32 欄位,有助於闡明分區資訊是如何進行驗證的,以及為何標頭受損並不一定代表底層檔案已遺失。.
目錄
什麼是 GPT 標頭?
GPT 標頭是 GUID 分割表(GPT)的一部分,而 GPT 則是 UEFI 規範所定義的磁碟分割方案。.
與較早的主開機記錄(MBR)方案不同,GPT 會保留兩份分割區元資料的副本:一份位於磁碟起始處附近,另一份則位於磁碟末尾附近。.
每個 GPT 標頭都包含用於定位和解讀其相關分區條目陣列所需的資訊,包括:
- 一個用於識別 GPT 格式的標記。.
- GPT 標頭的修訂版本與大小。.
- 原始標頭的位置以及替代標頭的位置。.
- 第一個和最後一個可用的邏輯區塊位址。.
- 一個唯一的磁碟識別碼。.
- 分區條目陣列的位置與尺寸。.
- CRC32 校驗和,用於確保元資料的完整性。.
GPT 標頭並不會直接儲存檔案名稱、資料夾結構或檔案內容。這些資訊屬於分區內的檔案系統。.
有關分區方案的概述,請參閱 GPT(GUID 磁碟分割表). 官方定義載於 UEFI 規格,第 5.3 節.
GPT 標頭位於何處?
GPT 會將其主要與備份元資料分別存放於磁碟的兩端。.
對於傳統的 GPT 磁碟:
地點 | 目錄 |
LBA 0 | 保護性 MBR |
LBA 1 | 主要 GPT 標頭 |
遵循 LBA | 主要分割區條目陣列 |
可用 LBA 範圍 | 可用於隔間的空間 |
最後一個區塊之前的 LBA | 備份分割區條目陣列 |
最後一個 LBA | 備份 GPT 標頭 |

保護性 MBR 可協助防止舊式僅支援 MBR 的工具將 GPT 磁碟視為未分配空間。.
這與 GPT 標頭本身不同。若要與傳統分割區元資料進行比較,請參閱 MBR 磁碟分割表.
邏輯扇區與位元組位址
GPT 使用邏輯區塊位址 (LBA),而非絕對位元組偏移量,來識別其結構。.
要將 LBA 轉換為位元組偏移量:
位元組偏移量 = LBA × 邏輯區塊大小
例如:
- 在邏輯區塊大小為 512 位元組的磁碟上,主要標頭始於位元組偏移量
512(0x200). - 在一個邏輯區塊大小為 4,096 位元的磁碟上,主標頭從位元偏移量
4096(0x1000).
在邏輯區塊內,標頭通常佔用 92 位元組,儘管該格式允許標頭大小可達邏輯區塊大小為限。.
92 位元的標頭不應與 512 位元的磁區混淆。512 位元標頭區塊中其餘的位元組均為保留位元組,且必須為零。.
GPT 標頭結構:欄位、偏移量與大小
GPT 標頭結構定義於 UEFI 規範 2.10,表 5.5.
以下偏移量是相對於 GPT 標頭的起始位置,而非相對於磁碟的起始位置。.
現場 | 偏移量(十六進位) | 尺寸 | 目的 |
簽名 |
| 8 位元組 | 識別 GPT 標頭 |
修訂 |
| 4 位元組 | GPT 格式修訂 |
標題大小 |
| 4 位元組 | 標頭長度(以位元組為單位) |
標頭CRC32 |
| 4 位元組 | 標頭的校驗和 |
保留 |
| 4 位元組 | 必須為零 |
MyLBA |
| 8 位元組 | 此標題的位置 |
替代 LBA |
| 8 位元組 | 另一個頁首的位置 |
FirstUsableLBA |
| 8 位元組 | 第一個可用的分割區區塊 |
最後可用 LBA |
| 8 位元組 | 最後一個可用的分割區區塊 |
磁碟 GUID |
| 16 位元組 | 唯一磁碟識別碼 |
PartitionEntryLBA |
| 8 位元組 | 相關條目陣列的起始位置 |
分區條目數 |
| 4 位元組 | 參賽名額數 |
分區條目大小 |
| 4 位元組 | 每筆資料的大小 |
PartitionEntryArrayCRC32 |
| 4 位元組 | 條目陣列的校驗和 |
已定義的欄位佔用以下偏移量 0x00 透過 0x5B, ,總計 92 位元組。來自 0x5C 已預留至邏輯區塊末尾。.
簽署與修訂
有效的 GPT 標頭以 ASCII 簽名開頭 EFI 零件.
這八個位元組分別是:
45 46 49 20 50 41 52 54
標準 GPT 修訂版 1.0 由以下小端字節表示:
00 00 01 00
這些代表數值 0x00010000. GPT 標頭的修訂版本與 UEFI 規格版本並不相同。.
常用的標頭大小為 92 位元組,編碼方式如下:
5C 00 00 00
磁碟 GUID 與位元組順序
「DiskGUID」欄位佔用 16 位元組,起始偏移量為 0x38.
它用來識別 GPT 磁碟。這與儲存於每個個別分割區條目中的唯一分割區 GUID 不同。.
在解讀原始十六進位資料時,GUID 還引入了一個重要細節:其前三個組件採用小端字節序,而最後八個字節則保留其顯示順序。.
例如,以下這個示例 GUID:
f0e1d2c3-b4a5-4c6d-8e9f-102030405060
儲存方式如下:
C3 D2 E1 F0 A5 B4 6D 4C 8E 9F 10 20 30 40 50 60
若直接從左至右讀取全部 16 個原始位元組,將會產生一個不正確的文字型 GUID。.
分割區條目陣列欄位
有三個欄位定義了分割區條目陣列:
PartitionEntryLBA標示陣列的起始位置。.分區條目數定義其條目數量。.分區條目大小定義了每個條目的大小。.
陣列的位元組長度計算方式如下:
陣列大小 = 項目數 × 項目大小
對於一個包含 128 個元素、每個元素為 128 位元組的陣列:
128 × 128 = 16,384 位元組
若邏輯區塊大小為 512 位元組:
16,384 ÷ 512 = 32 個邏輯區塊
這是分割區條目陣列的保留空間,而非實際檔案資料所佔用的空間。.
當前的 UEFI 規格將條目大小定義為 128 × 2^n 位元組,其中 n 是一個非負整數。典型的 GPT 磁碟使用 128 位元組的條目。.
Each slot in the partition entry array describes one partition through its type GUID, unique partition GUID, LBA boundaries, attributes, and name. For a field-by-field explanation of the GPT 分割區條目結構, including byte offsets and GUID encoding, see our GPT 分區條目:結構、陣列與 GUID 欄位 指南。.
主 GPT 標頭與備用 GPT 標頭:有哪些變化?
主 GPT 標頭與備用 GPT 標頭的欄位結構相同,但其所包含的位元組內容並不完全相同。.
它們的位置以及某些內部指標有所不同。.
請考慮一個具有以下特徵的示範性 GPT 磁碟:
- 100,000 個邏輯區塊,已編號
0透過99,999. - 邏輯區塊大小為 512 位元組。.
- 一個包含 128 個槽位、每個槽位為 128 位元組的條目陣列。.
- 兩端各有一個由 32 個區塊組成的分割區條目陣列。.
版面配置如下:
結構 | 主要 GPT | 備份 GPT |
標頭 LBA |
|
|
MyLBA |
|
|
替代 LBA |
|
|
PartitionEntryLBA |
|
|
條目陣列範圍 |
|
|
FirstUsableLBA |
|
|
最後可用 LBA |
|
|
標題大小 | 92 位元組 | 92 位元組 |
這些位置直接取自磁碟大小以及兩個各含 32 個區塊的分區條目陣列。.
例如:
備份陣列起始位置 = 最後一個 LBA − 陣列區塊數
99,999 − 32 = 99,967
最後一個可用的區塊必須位於該備份陣列之前:
99,967 − 1 = 99,966
因此,這兩組標頭雖然描述的是同一個可用磁碟範圍,但其分割區條目陣列所指向的實體位置卻不同。.
此種安排可讓支援 GPT 的軟體在主副本受損時,檢查備份的元資料。.
然而,即使有兩份副本,也無法保證其中任何一份是有效的或最新的。.
範例解析:從十六進位位元組解碼 GPT 標頭
以下範例使用的是刻意建構的 GPT 元資料,而非從實體磁碟擷取的位元組。.
它描述的正是上文提到的那顆 100,000 區塊的磁碟。.
此範例中沒有任何已填入資料的分區。所有 128 個分區條目槽位均以零填充,因此可根據完全定義的輸入來計算兩個條目陣列的校驗和。.
步驟 1:識別頁首
在主要標頭的開頭,前 16 位元組的內容如下:
45 46 49 20 50 41 52 54 00 00 01 00 5C 00 00 00
依欄位拆分序列:
位元組範圍 | 十六進位位元組 | 解碼後的含義 |
|
|
|
|
| 修訂 |
|
| 標頭大小:92 位元組 |
簽名、修訂內容及頁首大小均符合預期格式。.
這雖然建立了一個合理的標頭,但僅憑此並不能證明 GPT 是有效的。.
步驟 2:解碼位置欄位
主要標題包含:
現場 | 儲存的位元組 | 解碼後的數值 |
MyLBA |
|
|
替代 LBA |
|
|
FirstUsableLBA |
|
|
最後可用 LBA |
|
|
PartitionEntryLBA |
|
|
這些數值採用小端字節序。.
舉例來說,這些位元組 9F 86 01 00 00 00 00 00 代表 0x000000000001869F, ,或十進制 99,999.
倒車頭轉向 MyLBA 和 替代 LBA 以及變更 PartitionEntryLBA 至 99,967.
步驟 3:比較標頭校驗和
針對這個具體的模擬範例,使用先前顯示的 DiskGUID 以及一個以零填充的 16,384 位元組分割區條目陣列,計算出的數值如下:
校驗碼 | 主要 GPT | 備份 GPT |
標頭CRC32 |
|
|
PartitionEntryArrayCRC32 |
|
|
由於標頭中的位置欄位不同,因此標頭的校驗和也不同。.
分區條目陣列的校驗和相符,是因為這兩個陣列都包含完全以零填充的相同位元組。.
這些是經計算得出的範例數值,並非通用的 GPT 校驗和常數。若磁碟 GUID、分割區佈局或元資料有所變更,將產生不同的結果。.
GPT 標頭 CRC32 驗證的運作原理
GPT 使用兩個獨立的 CRC32 校驗和來偵測其分割區元資料的變更:
標頭CRC32驗證 GPT 標頭本身。.PartitionEntryArrayCRC32驗證相關的分區條目陣列。.
兩者皆採用標準的 CRC-32 演算法,但涵蓋的位元組範圍不同。.
HeaderCRC32:校驗和的計算方式
的 標頭CRC32 該欄位佔用四個位元組,其偏移量以標頭為基準 0x10.
根據該 UEFI 規格, 計算校驗和時,必須將此欄位暫時設為零。.
驗證流程分為五個步驟:
- 請閱讀標題。. 從磁碟映像中取得 GPT 標頭位元組,並判定
標題大小偏移量處的欄位0x0C. - 記錄儲存的 CRC32。. 讀取偏移量處的四個位元組
0x10–0x13作為一個小端序的 32 位元值。. - 將校驗和欄位設為零。. 在臨時副本中,請將這四個位元組替換為
00 00 00 00. - 計算 CRC32。. 針對精確的
標題大小位元組。. - 比較結果。. 若計算出的值與儲存的值相符,則該標頭即通過其 CRC32 完整性檢查。.
對於標準的 92 位元組 GPT 標頭,此計算涵蓋了各處的偏移量 0x00–0x5B, ,而非整個 512 位元組的邏輯磁區。.
一個標準的 CRC-32 計算器或 Python 的 zlib.crc32() 可以進行計算。該演算法使用反射多項式 0xEDB88320, 初始寄存器值為 0xFFFFFFFF, ,以及對 0xFFFFFFFF.
範例:驗證 GPT 標頭的 CRC32
請參考本文稍早提到的合成 GPT 標頭。.
項目 | 價值 |
標題大小 |
|
儲存的標頭 CRC32 |
|
儲存的位元組 |
|
計算過程中的 CRC 欄位 |
|
計算出的 CRC32 |
|
驗證結果 | 比賽 |
計算出的校驗和與儲存的值相符,這表示此範例的標頭通過了 CRC32 校驗。.
即使僅有一個受檢字節發生變化,而未更新儲存的校驗和,計算結果通常也會有所不同。.
重要: 請務必在臨時副本或唯讀的工作資料上進行計算。請勿覆寫原始磁碟上的校驗和位元組。.
0x76EF8C67 以小端序排列。請選擇 零 以了解輸入資料是如何進行預處理的。.0xEDB88320 · Init 0xFFFFFFFF · 最終 XOR 0xFFFFFFFF. 教學範例,並非實際擷取的磁碟資料。.PartitionEntryArrayCRC32:驗證分割區條目
第二個校驗和,, PartitionEntryArrayCRC32, 儲存於以標頭為基準的偏移量處 0x58.
不像 標頭CRC32, 它涵蓋的是分割區條目陣列,而非標頭。.
其計算長度為:
分區條目數 × 分區條目大小
對於一個包含 128 個元素、每個元素為 128 位元組的陣列:
128 × 128 = 16,384 位元組
要驗證此校驗和,請對整個 16,384 位元組的陣列計算 CRC32,並將結果與 GPT 標頭中儲存的校驗和進行比對。.
在分區條目陣列中,無需將任何校驗和欄位設為零。.
由於主陣列與備用陣列位於不同位置,因此必須分別進行檢查。陣列最後一個條目之後的任何未使用填充空間,均不納入計算範圍。.
為何這兩種校驗和都很重要
這兩個校驗和分別回答了不同的問題:
- 標頭CRC32: 標頭位元組是否與標頭中儲存的校驗和相符?
- PartitionEntryArrayCRC32: 分區條目的位元組是否與儲存於標頭中的校驗和相符?
GPT 標頭可能通過其自身的 CRC32 檢查,但其分區條目陣列卻已損毀。.
同樣地,即使分區邊界在邏輯上不正確,或是元資料已過時,這兩項校驗和仍可能通過。.
CRC32 用於驗證元資料的完整性,而非磁碟狀態或檔案的可恢復性。. 必須進行額外的檢查,以確認分割區條目是否一致,以及底層檔案系統是否仍可存取。.
如何檢查 GPT 標頭是否有效
UEFI 規定,支援 GPT 的軟體必須檢查標頭簽名、標頭 CRC,, MyLBA, ,以及相關分區條目陣列的 CRC。對於主 GPT,還必須檢查備用標頭。.
實際檢查應包含以下額外的一致性檢查:
檢查 | 預期狀況 | 為何重要 |
簽名 |
| 識別結構 |
標題大小 | 至少 92 位元組;不得大於一個邏輯區塊 | 定義校驗和範圍 |
標頭CRC32 | 與重新計算的 CRC32 值相符 | 偵測標頭位元組的變更 |
MyLBA | 與實體標頭的位置相符 | 偵測位置錯誤的元資料 |
替代 LBA | 指向另一個頁首 | 支援冗餘佈局驗證 |
PartitionEntryLBA | 指向位於磁碟範圍內的陣列 | 防止陣列存取位址無效 |
PartitionEntryArrayCRC32 | 與實際陣列位元組相符 | 偵測入口陣列損毀 |
可用 LBA 範圍 | 按順序排列、在範圍內,且位於元數據區域之外 | 檢查版面配置的一致性 |
主/備份元資料 | 在必要時保持一致 | 偵測衝突的副本 |
通過這些檢查並不能驗證個別的檔案系統或檔案。. 還需檢查分區條目的邊界是否有效,以及是否存在重疊。.
的 UEFI GPT 驗證要求 為判定 GPT 元資料是否有效提供規範依據。.
當 GPT 標頭損毀時會發生什麼情況?
後果取決於哪些元資料仍可使用。.
主要標題損毀,備用標題有效
如果主要 GPT 無效,支援 GPT 的軟體必須檢查最後一個邏輯區塊的標頭,並驗證其相關的分區條目陣列。.
有效的備份可提供重建主副本所需的元資料,但須符合該平台的復原政策。.
此類修復操作會寫入分割區元資料,因此不應在存放重要且未受保護資料的磁碟上貿然進行。.
備用標頭已損毀,主標頭有效
主要分割區的佈局可能仍然可以讀取。.
然而,為了維持 GPT 的冗餘性,必須還原該備份。.
因此,即使磁碟表面上看似可存取,其備份元資料仍可能已受損。.
兩個標頭皆無效
如果兩個標頭均無效,則根據 UEFI 驗證規則,該磁碟沒有有效的 GPT 標頭。.
這並不一定表示每個分割區或檔案都已從物理層面被刪除。.
分割區元資料、檔案系統元資料以及檔案內容分別佔用磁碟上的不同區域。.
當涉及重要檔案時,請保留原始磁碟並加以區分 遺失的分割區資料復原 避免重新寫入分割表。.
標頭有效,但分割區資訊不正確
僅憑結構上有效的標頭,尚不足以證明其分區條目能正確描述當前磁碟的狀態。.
例如,當舊式分割軟體變更磁碟佈局後,過期的 GPT 元資料可能會殘留在磁碟末端。.
因此,必須將看似有效的備份與保護性 MBR、當前磁碟容量、分割區條目以及其他可用的證據一併進行評估。.
UEFI 特別警告,在磁碟重新格式化為傳統 MBR 之後,切勿依賴過時的 GPT 結構。.
如何安全地檢查 GPT 標頭
若要進行詳細分析,請使用磁碟映像檔或具備唯讀權限的十六進位檢視器。.
- 請確認是否為正確的實體磁碟,以及其報告的邏輯區塊大小。.
- 如果磁碟上存有重要資料,請在修改任何元資料之前,先建立適當的映像檔。對於不穩定或故障的磁碟,則需採取適當的資料擷取方法。.
- 在十六進位編輯器中開啟該影像,且勿啟用寫入功能。.
- 在 LBA 處定位主要標頭
1, 對應於位元組偏移量邏輯區塊大小 × 1. - 檢查偏移量處的簽名
0x00並利用相對於標頭的偏移量來解讀其他欄位。. - 根據映像檔或磁碟容量確定最後一個 LBA,然後檢查備份標頭。.
- 比較欄位值、標頭校驗和以及相關的分區條目陣列。.
Windows 磁碟管理與 PowerShell 的 Get-Disk 雖然能夠識別磁碟的分區樣式,但其一般的摘要視圖並未提供完整的位元組級 GPT 標頭驗證。.
請勿初始化、格式化或執行 DiskPart 清洗 僅僅是因為磁碟回報分區無效或遺失。同樣地,CHKDSK 是一項檔案系統修復工具,而非通用的 GPT 標頭重建方法。.
限制與重要邊界情況
有幾項條件會影響 GPT 標頭的解析。.
不同的邏輯區塊大小。. 一個 4Kn 磁碟使用 4,096 位元組的邏輯區塊。主標頭仍位於 LBA 1, ,但其絕對位元組偏移量與 512 位元組邏輯磁區磁碟上的不同。.
更大的 GPT 標頭。. 在允許的邏輯區塊大小範圍內,標頭的大小可能超過 92 位元組。CRC32 必須使用實際經過驗證的 標題大小, 並非假設的常數。.
調整磁碟大小或克隆磁碟。. 若磁碟容量已擴充,舊的備份標頭可能不再位於最後的 LBA 位置。在進行修正之前,必須根據當前的裝置大小評估 GPT 元資料。.
CRC32 並非加密式驗證。. 校驗和相符,並不能證明元資料是真實的,或未經蓄意篡改。.
實體媒體的問題。. 讀取錯誤、間歇性連線中斷或控制器故障都可能導致無法進行可靠的檢測。若對故障硬體反覆嘗試,可能會使復原工作更加困難。.
這些限制說明了為何 GPT 驗證需要進行多項相關檢查,而非僅靠單一簽名或校驗和比對。.
總結
的 GPT 標題 提供了解讀 GUID 分區表所需的位置、邊界、識別碼及完整性資訊。其結構由明確的位元組偏移量定義,而其主副本與備份副本則分別位於磁碟的兩端,提供冗餘的元資料。.
要進行正確的分析,光是定位還不夠 EFI 零件. 必須綜合評估標頭的 CRC32、分割區條目陣列的 CRC32、LBA 指標、可用邊界,以及主/備份的一致性。.
了解這些關聯性,便能辨識有效的 GPT 元資料、找出不一致之處,並區分分割表損毀與實際的檔案資料遺失。.
常見問題
什麼是 GPT 標頭簽名?
EFI 零件. 十六進位表示法為 45 46 49 20 50 41 52 54. 它會出現在主標頭和備用標頭的開頭。僅憑找到這段序列,並不能證明整個 GPT 是有效的。.GPT 標頭有多少位元組?
標題大小 該欄位定義其實際長度,該長度必須至少為 92 位元組,且不得大於邏輯區塊大小。邏輯區塊中其餘的位元組則被保留。.主 GPT 標頭和備用 GPT 標頭儲存於何處?
1. 備份標頭儲存於磁碟的最後一個邏輯區塊中。每個標頭的 MyLBA 能識別其自身位置,而 替代 LBA 識別出另一個標頭。.為什麼主 GPT 標頭和備用 GPT 標頭的 CRC32 值不同?
MyLBA, 替代 LBA, ,而且通常 PartitionEntryLBA. 由於這些位元組被 HeaderCRC32 所涵蓋,因此即使兩個標頭都準確地描述了同一張磁碟,計算出的校驗和通常也會有所不同。.當磁碟受損時,GPT 標頭能否通過 CRC32 驗證?
受損的 GPT 標頭能否從備份中恢復?
GPT 磁碟 GUID 與分割區 GUID 是同一回事嗎?
磁碟 GUID GPT 標頭中的此欄位用於識別磁碟。各個分割區條目均包含獨立的識別碼,包括分割區類型 GUID 以及唯一的分割區 GUID。這些值具有不同的作用,切勿混淆。.Vasilii 是一位在該領域擁有約 10 年實務經驗的資料復原專家。在他的職業生涯中,他已成功解決數千個複雜的個案,包括刪除的檔案、格式化的硬碟機、遺失的磁碟分割和 RAW 檔案系統。他的專業知識涵蓋使用十六進位編輯器等專業工具的手動復原方法,以及使用復原軟體的進階自動解決方案。Vasilii 的使命是讓 IT 專業人士和一般使用者都能獲得可靠的資料復原知識,協助他們保護寶貴的數位資產。.
