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 磁盘引导。
工具
010 editor