分区分区,顾名思义就是划分区域,例如我们造房子的时候,首先在设计图纸上划分哪里是厨房、哪里是客厅、哪里是卧室等等,划分好区域好,这个区域如何装修、存放什么物品完全由你或者你的家人决定!同理,GPT分区意思是这个分区按照GPT标准划分,划分好区域后,某一个分区存放什么东西完全由你决定,例如内核、文件系统、用户数据等等!

注意点:​​LBA​​​,英文全称​​Logical Block Address​​​,逻辑区块地址。​​LBA​​​是非常单纯的一种定址模式﹔从​​0​​​开始编号来定位区块,例如第一区块​​LBA=0​​​,第二区块​​LBA=1​​​,依此类推。在现代计算机中,一个LBA通常是​​512​​​字节,也就是一个逻辑扇区大小,这说明​​LBA=0​​​的起始地址为​​0​​​,结束地址为​​0x1ff​​!

一、GPT分区结构图


二、保护MBR

​保护MBR​​​包含一个​​DOS分区表(LBA0)​​​,只包含一个类型值为​​0xEE​​​的分区项,在小于​​2TB​​​的磁盘上,大小为整个磁盘;在更大的磁盘上,它的大小固定为​​2TB​​​。它的作用是阻止不能识别GPT分区的磁盘工具试图对其进行分区或格式化等操作,所以该扇区被称为​​“保护MBR”​​​。实际上,​​EFI根本不使用这个分区表​​。

Linux固件开发 | 几分钟看透GPT分区_GPT

三、EFI部分

​EFI部分​​​又可以分为​​4​​​个区域:​​GPT头部、分区表项、分区区域、备份区域​​。

3.1 GPT头部

起始于磁盘的​​LBA1​​​,通常也只占用这个单一扇区。其作用是​​定义分区表的位置和大小​​​。​​GPT头还包含头和分区表的校验和​​,这样就可以及时发现错误。

Linux固件开发 | 几分钟看透GPT分区_GPT_02

3.2 分区表项

这个区域由​​GPT头​​​定义,一般占用磁盘​​LBA2~LBA33扇区​​​。分区表中的每个分区项由​​起始地址、结束地址、类型值、名字、属性标志、GUID值​​​组成。分区表建立后,​​128位的GUID​​对系统来说是唯一的。

Linux固件开发 | 几分钟看透GPT分区_服务器_03

3.3 分区区域

最大的区域,由分配给分区的扇区组成。这个区域的起始和结束地址由​​分区表项​​​定义。例如​​Partition 1​​​由​​Entry 1​​定义。

分区区域就是存放你想要存放的东西,例如内核、文件系统、用户数据等等。

Linux固件开发 | 几分钟看透GPT分区_固态硬盘_04

3.4 备份区

备份区域位于磁盘的尾部,包含​​GPT头部和分区表项的备份​​​。它占用​​GPT结束扇区和EFI结束扇区之间的33个扇区​​​。其中​​最后一个扇区​​​用来备份​​1号扇区的GPT头部​​​,其余的​​32个扇区​​​用来备份​​LBA2~LBA33扇区的分区表项​​。

Linux固件开发 | 几分钟看透GPT分区_机械硬盘_05

四、数据结构

4.1 GPT头部数据结构

​GPT头部​​​位于磁盘的​​1号扇区(LBA1)​​,其具体结构如下表所示:

相对字节偏移量(十六进制)

字节数

说明[整数皆以​​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~*​

​*​

保留,通常是全零填充

摘自​​u-boot/include/part_efi.h​​的结构体:

Linux固件开发 | 几分钟看透GPT分区_服务器_06

4.1 分区表项数据结构

分区表项结构如下:

相对字节偏移量(十六进制)

字节数

说明[整数皆以​​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​​个字符。

注意,扇区尺寸不能假定为​​512​​​字节,也就是说,一个扇区内可能存放​​4​​​个以上的分区项,也可能只存放​​1​​​个分区项的一部分。也就是说,除了头两个扇区​​(LBA 0 和 LBA 1)​​之外,GPT规范仅定义了数据结构的尺寸,而不关心使用多少个扇区进行存储。

摘自​​u-boot/include/part_efi.h​​​的​​_gpt_entry​​结构体:

Linux固件开发 | 几分钟看透GPT分区_linux_07

分区类型如下:

相关操作系统

​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)]​​​,必须是​​VFAT格式​

​None​

​BC13C2FF-59E6-4262-A352-B275FD6F7172​

​扩展boot分区​​​,必须是​​VFAT格​​式

​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​

​69DAD710-2CE4-4E3C-B16C-21A1D49ABED3​

​ARM32根分区 (/)​​​。这是​​systemd​​​的发明,可用于无​​fstab​​时的自动挂载

​Linux​

​B921B045-1DF0-41C3-AF44-4C6F280D3FAE​

​AArch64根分区 (/)​​​。这是​​systemd​​​的发明,可用于无​​fstab​​时的自动挂载

​Linux​

​3B8F8425-20E0-4F3B-907F-1A25A76F98E8​

​服务器数据分区(/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​

保留

摘自​​u-boot/include/part_efi.h​​​的​​_gpt_entry​​结构体:

Linux固件开发 | 几分钟看透GPT分区_机械硬盘_08


摘自​​u-boot/include/efi.h​​​的​​efi_guid_t​​结构体:

Linux固件开发 | 几分钟看透GPT分区_服务器_09

​Microsoft​​​还进一步对分区的属性进行了细分:​​低位4字节​​​表示​​与分区类型无关的属性​​​,​​高位4字节​​​表示​​与分区类型有关的属性​​​。​​Microsoft​​目前使用了下列属性:

分区属性如下:

​Bit​

解释

​0​

​系统分区​​(磁盘分区工具必须将此分区保持原样,不得做任何修改)

​1​

​EFI隐藏分区(EFI不可见分区)​

​2​

​传统的BIOS的可引导分区标志​

​60​

只读

​62​

隐藏

​63​

不自动挂载,也就是不自动分配盘符

摘自​​u-boot/include/part_efi.h​​​的​​_gpt_entry​​结构体:

Linux固件开发 | 几分钟看透GPT分区_固态硬盘_10


摘自​​u-boot/include/part_efi.h​​​的​​gpt_entry_attributes​​联合体:

Linux固件开发 | 几分钟看透GPT分区_linux_11