GPT概述

  • 2019 年 10 月 4 日
  • 筆記

全局唯一標識分區表(GUID Partition Table,縮寫:GPT)是一個實體硬碟的分區結構。它是可擴展韌體介面標準的一部分,用來替代BIOS中的主引導記錄分區表。傳統的主啟動記錄 (MBR) 磁碟分區支援最大卷為 2.2 TB (terabytes) ,每個磁碟最多有 4 個主分區(或 3 個主分區,1 個擴展分區和無限制的邏輯驅動器)。與MBR 分區方法相比,GPT 具有更多的優點,因為它允許每個磁碟有多達 128 個分區,支援高達 18 千兆兆位元組 (exabytes,1EB=10^6TB) 的卷大小,允許將主磁碟分區表和備份磁碟分區表用於冗餘,還支援唯一的磁碟和分區 ID (GUID)。 與 MBR 分區的磁碟不同,GPT的分區資訊是在分區中,而不象MBR一樣在主引導扇區。為保護GPT不受MBR類磁碟管理軟體的危害,GPT在主引導扇區建立了一個保護分區 (Protective MBR)的MBR分區表,這種分區的類型標識為0xEE,這個保護分區的大小在Windows下為128MB,Mac OS X下為200MB,在Window磁碟管理器里名為GPT保護分區,可讓MBR類磁碟管理軟體把GPT看成一個未知格式的分區,而不是錯誤地當成一個未分區的磁碟。另外,GPT 分區磁碟有多餘的主要及備份分區表來提高分區數據結構的完整性。

在MBR硬碟中,分區資訊直接存儲於主引導記錄(MBR)中(主引導記錄中還存儲著系統的引導程式)。但在GPT硬碟中,分區表的位置資訊儲存在GPT頭中。但出於兼容性考慮,硬碟的第一個扇區仍然用作MBR,之後才是GPT頭。跟現代的MBR一樣,GPT也使用邏輯區塊地址(LBA)取代了早期的CHS定址方式。傳統MBR資訊存儲於LBA 0,GPT頭存儲於LBA 1,接下來才是分區表本身。64位Windows作業系統使用16,384位元組(或32扇區)作為GPT分區表,接下來的LBA 34是硬碟上第一個分區的開始。為了減少分區表損壞的風險,GPT在硬碟最後保存了一份分區表的副本。與主啟動記錄 (MBR) 分區方法相比,GPT 具有更多的優點,因為它允許每個磁碟有多達 128 個分區,支援高達18 千兆兆位元組的卷大小,允許將主磁碟分區表和備份磁碟分區表用於冗餘,還支援唯一的磁碟和分區ID(GUID)。

GPT結構

GPT的結構見下圖

傳統MBR (LBA 0) 在GPT分區表的最開頭,處於兼容性考慮仍然存儲了一份傳統的MBR,用來防止不支援GPT的硬碟管理工具錯誤識別並破壞硬碟中的數據,這個MBR也叫做保護MBR。在支援從GPT啟動的作業系統中,這裡也用於存儲第一階段的啟動程式碼。在這個MBR中,只有一個標識為0xEE的分區,以此來表示這塊硬碟使用GPT分區表。不能識別GPT硬碟的作業系統通常會識別出一個未知類型的分區,並且拒絕對硬碟進行操作,除非用戶特別要求刪除這個分區。這就避免了意外刪除分區的危險。另外,能夠識別GPT分區表的作業系統會檢查保護MBR中的分區表,如果分區類型不是0xEE或者MBR分區表中有多個項,也會拒絕對硬碟進行操作。 在使用MBR/GPT混合分區表的硬碟中,這部分存儲了GPT分區表的一部分分區(通常是前四個分區),可以使不支援從GPT啟動的作業系統從這個MBR啟動,啟動後只能操作MBR分區表中的分區。如Boot Camp就是使用這種方式啟動Windows。 分區表頭 (LBA 1) 分區表頭定義了硬碟的可用空間以及組成分區表的項的大小和數量。在使用64位Windows Server 2003的機器上,最多可以創建128個分區,即分區表中保留了128個項,其中每個都是128位元組。(EFI標準要求分區表最小要有16,384位元組,即128個分區項的大小) 分區表頭還記錄了這塊硬碟的GUID,記錄了分區表頭本身的位置和大小(位置總是在LBA 1)以及備份分區表頭和分區表的位置和大小(在硬碟的最後)。它還儲存著它本身和分區表的CRC32校驗。韌體、引導程式和作業系統在啟動時可以根據這個校驗值來判斷分區表是否出錯,如果出錯了,可以使用軟體從硬碟最後的備份GPT中恢復整個分區表,如果備份GPT也校驗錯誤,硬碟將不可使用。所以GPT 硬碟的分區表不可以直接使用16進位編輯器修改。 分區表頭的格式如下

主分區表和備份分區表的頭分別位於硬碟的第二個扇區(LBA 1)以及硬碟的最後一個扇區。備份分區表頭中的資訊是關於備份分區表的。

分區表項 (LBA 2–33) GPT分區表使用簡單而直接的方式表示分區。一個分區表項的前16位元組是分區類型GUID。例如,EFI系統分區的GUID類型是{C12A7328- F81F-11D2-BA4B-00A0C93EC93B}。接下來的16位元組是該分區唯一的GUID(這個GUID指的是該分區本身,而之前的GUID 指的是該分區的類型)。再接下來是分區起始和末尾的64位LBA編號,以及分區的名字和屬性。 GPT分區表項的格式如下