1.MBR
1.1 MBR的組成
一個扇區的硬盤主引導記錄MBR由4個部分組成。
主引導程序(偏移地址0000H--0088H),它負責從活動分區中裝載,并運行系統引導程序。
出錯信息數據區,偏移地址0089H--00E1H為出錯信息,00E2H--01BDH全為0字節。
分區表(DPT,Disk Partition Table)含4個分區項,偏移地址01BEH--01FDH,每個分區表項長16個字節,共64字節為分區項1、分區項2、分區項3、分區項4。
結束標志字,偏移地址01FE--01FF的2個字節值為結束標志55AA,如果該標志錯誤系統就不能啟動。
typedef struct {
char bootinst[446]; /* space to hold actual boot code */
PHMBRTABLE partitions[4];
unsigned short signature;/* set to 0xAA55 to indicate PC MBR format */
} mbr_head;

1.2 MBR中的分區信息結構
占用512個字節的MBR中,偏移地址01BEH--01FDH的64個字節,為4個分區項內容(分區信息表)。它是由磁盤介質類型及用戶在使用 FDISK定義分區時確定的。在實際應用中,FDISK對一個磁盤劃分的主分區可少于4個,但最多不超過4個。每個分區表的項目是16個字節,其內容含義如下表所示。
|存儲字節位 |內容及含義 |
|---------|
|第1字節 |引導標志。若值為80H表示活動分區,若值為00H表示非活動分區。第2、3、4字節 本分區的起始磁頭號、扇區號、柱面號。其中:磁頭號——第2字節;扇區號——第3字節的低6位;柱面號——為第3字節高2位+第4字節8位。|
|第5字節 |分區類型符。00H——表示該分區未用(即沒有指定);06H——FAT16基本分區;0BH——FAT32基本分區;05H——擴展分區;07H——NTFS分區;0FH——(LBA模式)擴展分區(83H為Linux分區等)。|
|第6、7、8字節| 本分區的結束磁頭號、扇區號、柱面號。其中:磁頭號——第6字節;扇區號——第7字節的低6位;柱面號——第7字節的高2位+第8字節。|
|第9、10、11、12字節| 本分區第一個扇區。|
|第13、14、15、16字節| 本分區的總扇區數。|
typedef struct {
unsigned char bootid; /* bootable? 0=no, 128=yes */
unsigned char beghead ; /* beginning head number */
unsigned short begsect : 6; /* beginning sector number */
unsigned short begcyl : 10; /* 10 bit nmbr */
unsigned char systid; /* Operating System type indicator code */
unsigned char endhead ; /* ending head number */
unsigned short endsect : 6; /* ending sector number */
unsigned short endcyl : 10; /* also a 10 bit nmbr */
unsigned int relsect; /* first sector relative to start of disk */
unsigned int numsect; /* number of sectors in partition */
} mbr_table;

1.3 MBR的限制
MBR 分區系統是一個數據結構補丁的大雜燴,用于克服早期的限制。MBR 自身完全駐留在一個硬盤的第一個扇區(512 字節)上。MBR 的前 400 個字節專門用于存儲代碼:boot loader(引導裝載程序)。計算機引導時,BIOS 讀取并執行這段代碼。
在這個代碼區域之后,MBR 存儲數據在 4 個分區上,這些分區稱為主分區。每個分區采用兩種方法描述:“柱面/磁頭/扇區(CHS)” 標記法和 “邏輯塊(LBA)” 標記法。今天,CHS標記法幾乎成為了老古董,因為它是一個 24 位的數字。這意味著它只限于描述 8GB 磁盤區域。32 位的 LBA 值支持 2TB大小。但是這個 2TB 上限不太容易突破,因為在 MBR 中沒有留下任何未分配的字段,可以用于向 LBA 地址添加更多位
除了這個 2TB 問題之外,MBR 還有其他困難。主要困難是 4 個主分區的限制。要克服這個限制,可能的方法是將一個主分區放到一邊,作為一個占位符(稱為擴展分區),用于容納任意數量的附加分區(稱為邏輯分區)。然而,這是一種笨拙的權宜之計,會導致一些問題。比如,安裝多個操作系統時,如果過多的操作系統要求自身擁有過多的主分區,就會出現困難。
MBR 還有數據完整性問題。它是一個單一數據結構,容易受到誤操作和磁盤故障的損壞。另外,由于邏輯分區以一種鏈接表結構定義,如果一個邏輯分區損壞,就會阻止對剩余的邏輯分區的訪問。這些數據結構都沒有任何形式的錯誤探測功能,因此,損壞很難定位。
2.GPT
2.1 GPT的組成


2.2 保護MBR
保護MBR包含一個DOS分區表(LBA0),只包含一個類型值為0xEE的分區項,在小于2TB的磁盤上,大小為整個磁盤;在更大的磁盤上,它的大小固定為2TB。它的作用是阻止不能識別GPT分區的磁盤工具試圖對其進行格式化等操作,所以該扇區被稱為“保護MBR”。實上,
上,EFI根本不使用這個分區表。

2.3 EFI部分
EFI部分又可以分為4個區域:EFI信息區(GPT頭)、分區表、GPT分區、備份區域。
1. EFI信息區(GPT頭)
起始于磁盤的LBA1,通常也只占用這個單一扇區。其作用是定義分區表的位置和大小。GPT頭還包含頭和分區表的校驗和,這樣就可以及時發現錯誤。
2. 分區表
分區表區域包含分區表項。這個區域由GPT頭定義,一般占用磁盤LBA2~LBA33扇區。分區表中的每個分區項由起始地址、結束地址、類型值、名字、屬性標志、GUID值組成。分區表建立后,128位的GUID對系統來說是唯一的。
3. GPT分區
最大的區域,由分配給分區的扇區組成。這個區域的起始和結束地址由GPT頭定義。
4. 備份區
備份區域位于磁盤的尾部,包含GPT頭和分區表的備份。它占用GPT結束扇區和EFI結束扇區之間的33個扇區。其中最后一個扇區用來備份1號扇區的EFI信息,其余的32個扇區用來備份LBA2~LBA33扇區的分區表。
2.4 EFI信息區數據結構
相對字節偏移量(十六進制) | 字節數 | 說明[整數皆以little endian方式表示] |
---|---|---|
00~07 | 8 | GPT頭簽名“45 46 49 20 50 41 52 54”(ASCII碼為“EFI PART”) |
08~0B | 4 | 版本號,目前是1.0版,其值是“00 00 01 00” |
0C~0F | 4 | GPT頭的大小(字節數),通常為“5C 00 00 00”(0x5C),也就是92字節。 |
10~13 | 4 | GPT頭CRC校驗和(計算時把這個字段本身看做零值) |
14~17 | 4 | 保留,必須為“00 00 00 00” |
18~1F | 8 | EFI信息區(GPT頭)的起始扇區號,通常為“01 00 00 00 00 00 00 00”,也就是LBA1。 |
20~27 | 8 | EFI信息區(GPT頭)備份位置的扇區號,也就是EFI區域結束扇區號。通常是整個磁盤最末一個扇區。 |
28~2F | 8 | GPT分區區域的起始扇區號,通常為“22 00 00 00 00 00 00 00”(0x22),也即是LBA34。 |
30~37 | 8 | GPT分區區域的結束扇區號,通常是倒數第34扇區。 |
38~47 | 16 | 磁盤GUID(全球唯一標識符,與UUID是同義詞) |
48~4F | 8 | 分區表起始扇區號,通常為“02 00 00 00 00 00 00 00”(0x02),也就是LBA2。 |
50~53 | 4 | 分區表總項數,通常限定為“80 00 00 00”(0x80),也就是128個。 |
54~57 | 4 | 每個分區表項占用字節數,通常限定為“80 00 00 00”(0x80),也就是128字節。 |
58~5B | 4 | 分區表CRC校驗和 |
5C~* | * | 保留,通常是全零填充 |
typedef struct {
BYTE SIGNATURE[8];
DWORD Revision;
DWORD Headersize;
DWORD CRC32OfHeader;
DWORD Reserved;
UINT64 CurrentLBA;
UINT64 BackupLBA; //location of the other head copy
UINT64 FirstUsableLBA; //primary partition table last LBA+1
UINT64 LastUsableLBA; //secondary parition table first LBA-1
BYTE DiskGUID[16];
UINT64 PartitionEntries;
DWORD NumOfPartitions;
DWORD SizeOfPartitionEntry;
DWORD CRC32ofPartitionArray;
BYTE reserved[420];
} gpt_head_table;

2.5 分區表
分區項結構
|相對字節偏移量(十六進制) |字節數 |說明[整數皆以little endian方式表示]|
|------------------------|
|00~0F |16 |用GUID表示的分區類型|
|10~1F |16 |用GUID表示的分區唯一標示符|
|20~27 |8 |該分區的起始扇區,用LBA值表示。|
|28~2F |8 |該分區的結束扇區(包含),用LBA值表示,通常是奇數。|
|30~37 |8 |該分區的屬性標志|
|38~7F |72 |UTF-16LE編碼的人類可讀的分區名稱,最大32個字符。|
typedef struct {
BYTE PartitionTypeGUID[16];
BYTE PartitionGUID[16];
UINT64 PartitionStartLBA;
UINT64 PartitionEndLBA;
UINT64 PartitionProperty;
wchar_t PartitionName[36]; //Unicode
} gpt_paptition_table;
分區類型
|相關操作系統 |GUID[little endian] |含義|
|------------|
|None |00000000-0000-0000-0000-000000000000 |未使用|
|None |024DEE41-33E7-11D3-9D69-0008C781F39F |MBR分區表|
|None |C12A7328-F81F-11D2-BA4B-00A0C93EC93B |EFI系統分區[EFI System partition (ESP)]|
|None |21686148-6449-6E6F-744E-656564454649 |BIOS引導分區,其對應的ASCII字符串是"Hah!IdontNeedEFI"。|
|None |D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 |Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)|
|Windows |E3C9E316-0B5C-4DB8-817D-F92DF00215AE |微軟保留分區|
|Windows |EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 |基本數據分區|
|Windows |DE94BBA4-06D1-4D40-A16A-BFD50179D6AC |Windows恢復環境|
|Linux |0FC63DAF-8483-4772-8E79-3D69D8477DE4 |數據分區。Linux曾經使用和Windows基本數據分區相同的GUID。這個新的GUID是由 GPT fdisk 和 GNU Parted 開發者根據Linux傳統的"8300"分區代碼發明的。|
|Linux |44479540-F297-41B2-9AF7-D131D5F0458A |x86根分區 (/) 這是systemd的發明,可用于無fstab時的自動掛載|
|Linux |4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 |x86-64根分區 (/) 這是systemd的發明,可用于無fstab時的自動掛載|
|Linux |3B8F8425-20E0-4F3B-907F-1A25A76F98E8 |Server Data (/srv) 這是systemd的發明,可用于無fstab時的自動掛載|
|Linux |933AC7E1-2EB4-4F13-B844-0E14E2AEF915 |HOME分區 (/home) 這是systemd的發明,可用于無fstab時的自動掛載|
|Linux |0657FD6D-A4AB-43C4-84E5-0933C84B4F4F |交換分區(swap) 不是systemd的發明,但同樣可用于無fstab時的自動掛載|
|Linux |A19D880F-05FC-4D3B-A006-743F0F84911E |RAID分區|
|Linux |E6D6D379-F507-44C2-A23C-238F2A3DF928 |邏輯卷管理器(LVM)分區|
|Linux |8DA63339-0007-60C0-C436-083AC8230908 |保留|
Microsoft還進一步對分區的屬性進行了細分:低位4字節表示與分區類型無關的屬性,高位4字節表示與分區類型有關的屬性。Microsoft目前使用了下列屬性:
|Bit |解釋|
|-----|
|0 |系統分區(磁盤分區工具必須將此分區保持原樣,不得做任何修改)|
|1 |EFI隱藏分區(EFI不可見分區)|
|2 |傳統的BIOS的可引導分區標志|
|60 |只讀|
|62 |隱藏|
|63 |不自動掛載,也就是不自動分配盤符|

2.6 備份分區表,備份GPT頭

備份分區表和分區頭在硬盤數據的末尾,里面的數據和結構跟分區表和分區頭內一樣。是頭部的一個備份。
2.7 GPT優勢
GPT的最大好處當然是它消除了 2TB 這個障礙。但是,即使您不必處理 2TB 的磁盤,您也可能會考慮采用 GPT。CRC 和備份數據結構是在低于 2TB 的磁盤上轉換到 GPT 的最重要的好處,盡管這一點存在爭議。主分區和邏輯分區的區別喪失也可能對一些用戶很重要。遺憾的是,許多需要主分區的操作系統都不能從 GPT 磁盤引導。