Windows GPT磁盘GUID结构详解
前一篇 Windows磁盘MBR结构详解 中我们介绍了Basic Disk中的Master Boot Record结构。GPT Disk作为Windows 2003以后引入的分区结构。使用了GUID分区表结构,它与MBR相比好处是支持更大和更多的分区,提高容错。本文介绍了GUID分区表的结构和各个字段的含义。
GPT Disk 的Protective MBR:
GPT Disk的结构中,第一个LBA位置(LBA 0)存放的是Protective MBR,随后LBA1的位置才是GPT的GUID分区表头。Protective MBR的作用是为了兼容性考虑,阻止一些遗留的MBR磁盘工具破坏GUID分区表。这种在LBA 0的位置存放Protective MBR的结构是基于Extensible Firmware Interface(EFI)规格。Protective MBR和MBR拥有同样的结构,同时还包括一条包含值为0xEE的System ID的分区记录(如下图所示),这个值标注了该分区为GPT分区,如果包含该分区的磁盘被移动到Windows 2000中或者被一些遗留的磁盘工具访问,则该分区会被标注晨GPT Protective分区,不能被删除。
Globally Unique Identifier Partition Table(GUID)结构:
如下图所示,组成GPT Disk的GUID记录有以下几种:
GUID Partition Table Header: GPT Header定义了分区记录所用到的Logical Block Address的区域。同时还定义了分区在磁盘上的位置、它自身的GUID、以及一组CRC32的校验值。Primary GPT Header位于磁盘的LBA1位置,紧跟着Protective MBR。Backup GPT Header位于磁盘最后一个磁道之上。下图是GPT Header中包含几个字段:
首位0x00是为长度8个字节的签名档,这个值必须为固定值,用来定义EFI的兼容性。
0x08开始有四组长度为4个字节的字段,Revision标注EFI规格的版本信息、Header Size记录了整个GPT Head的大小,也为固定值、CRC32的校验信息、Reserved预留位。
随后0x18开始是5个长度为8个字节的字段和一个长度为16字节字段,Primary LBA记录了Primary GPT Head的位置、Backup LBA记录Backup GPT Header的位置、First Usable LBA记录了第一个分区的起始位置,例如64位的Windows Server 2003,它的起始位置是34、Last Usable LBA记录的分区结束的位置。Disk GUID长度为16个字节,用来标识分区表头和磁盘、 Partition Entry LBA记录GUID分区记录的位置,固定为LBA2。
从0x50开始为3个长度为4字节的记录,Number of Partition Entries记录最大的磁盘分区数,例如64位的Windows Server是128个、Size of Partition Entry记录了每个GUID分区记录大小,它的值为128字节、Partition Entry Array CRC32记录一组分区记录的校验值。
最后从0x5C位置开始长度为420字节的预留空间,值都为0。
GUID Partition Entry Array:类似MBR中的分区表,GUID partition entry array中包含了磁盘上每个分区的记录。比如64位的Windows Server 2003创建了一个Array值为16384字节,则第一个可用的数据大于等于LBA34. GUID Partition Entry Array也在分区最后存在一个副本,位置是在最后一个可用的LBA之后,GUID Partition table header之前。
GUID Partition Entry: GUID Partition Entry长度为128个字节,用来定义单个分区结构。每个GUID Partition entry从Partition Type记录开始。长度为16个字节的Partition Type GUID,类似MBR磁盘分区表中的System ID,它定义了分区中包含的数据和分区的作用。下图中是一个典型的GPT Disk的GUID Partition entry array记录,这个图中显示了三种分区记录
第一部分{45464920-5041-5254-0000-01005C000000}为EFI System分区、中间部分{16E3C9E3-5C0B-B84D-817D-F92DF00215AE}为Microsoft Reserved分区,最下面的一个{A2A0D0EB-E5B9-3344-87C0-68B6B72699C7}是Windows Basic Disk中的一个主分区。
在每个部分的中间位置主要记录了一些字段。Partition Type GUID之后的0x10位置开始,是一个长度为16字节的Unique Partition GUID记录用来标识每条记录的唯一性。0x20开始为3个长度为8个字节的字段,Starting LBA和Ending LBA分别记录了分区的起始和结束的位置、Attribute Bit描述了分区是如何使用的,例如是否为隐藏和只读等等、最后0x38开始的72个字节字段用来Unicode的分区的名字,名字最长为36个字符。