分区分区,顾名思义就是划分区域,例如我们造房子的时候,首先在设计图纸上划分哪里是厨房、哪里是客厅、哪里是卧室等等,划分好区域好,这个区域如何装修、存放什么物品完全由你或者你的家人决定!同理,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根本不使用这个分区表 。
三、EFI部分
EFI部分 又可以分为4 个区域:GPT头部、分区表项、分区区域、备份区域 。
3.1 GPT头部
起始于磁盘的LBA1 ,通常也只占用这个单一扇区。其作用是定义分区表的位置和大小 。GPT头还包含头和分区表的校验和 ,这样就可以及时发现错误。
这个区域由GPT头 定义,一般占用磁盘LBA2~LBA33扇区 。分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值 组成。分区表建立后,128位的GUID 对系统来说是唯一的。
3.3 分区区域
最大的区域,由分配给分区的扇区组成。这个区域的起始和结束地址由分区表项 定义。例如Partition 1 由Entry 1 定义。
分区区域就是存放你想要存放的东西,例如内核、文件系统、用户数据等等。
3.4 备份区
备份区域位于磁盘的尾部,包含GPT头部和分区表项的备份 。它占用GPT结束扇区和EFI结束扇区之间的33个扇区 。其中最后一个扇区 用来备份1号扇区的GPT头部 ,其余的32个扇区 用来备份LBA2~LBA33扇区的分区表项 。
四、数据结构
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 的结构体:
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 结构体:
分区类型如下:
相关操作系统 | 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 结构体: 摘自u-boot/include/efi.h 的efi_guid_t 结构体:
Microsoft 还进一步对分区的属性进行了细分:低位4字节 表示与分区类型无关的属性 ,高位4字节 表示与分区类型有关的属性 。Microsoft 目前使用了下列属性:
分区属性如下:
Bit | 解释 |
---|
0 | 系统分区 (磁盘分区工具必须将此分区保持原样,不得做任何修改) | 1 | EFI隐藏分区(EFI不可见分区) | 2 | 传统的BIOS的可引导分区标志 | 60 | 只读 | 62 | 隐藏 | 63 | 不自动挂载,也就是不自动分配盘符 |
摘自u-boot/include/part_efi.h 的_gpt_entry 结构体:
摘自u-boot/include/part_efi.h 的gpt_entry_attributes 联合体:
|