硬盘分区表 gaunthan Posted on Nov 27 2016 ? File System ? ## MBR **MBR**(Mater Boot Record,主引导记录),是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。它包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。 MBR是由分区程序(如`Fdisk.exe` )所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存。 在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“**主引导记录**”(MBR),其后是4个16字节的**磁盘分区表**,以及2字节的**结束标志**。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。 标准MBR结构如下图所示:  ### 启动代码 主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。 它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。 ### 硬盘分区表 #### 分区表结构 硬盘分区表占据主引导扇区的64个字节(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。这16个字节中存有活动状态标志、文件系统标识、起止柱面号、磁头号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。由于MBR扇区只有64个字节用于分区表,所以只能记录4个分区的信息。这就是硬盘主分区数目不能超过4个的原因。后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍用16个字节存储。  #### 分区特点 - 每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)。 - 一个分区的最大容量为2T,且每个分区的起始柱面必须在这块硬盘的前2T内。 在Linux中,硬盘主分区从标号1开始,扩展分区和逻辑分区则从标号5开始。IDE硬盘最多有59个逻辑分区(5号到63号),SATA硬盘则有11个逻辑分区(5号到15号)。 各种接口的磁盘在Linux中的文件名分别为: - /dev/sd[a-p][1-15]:使用SCSI,SATA,USB等接口的磁盘的设备文件名。 - dev/hd[a-d][1-63]:使用IDE接口的磁盘的设备文件名。 ### 结束标志 结束标志占据最后2字节,固定为0xAA55或0x55AA,具体取决于处理器类型。其中,小端模式处理器该值为0xAA55,大端模式处理器该值为0x55AA。 ### 主引导扇区的读取流程 1. BIOS 加电自检 ( Power On Self Test -- POST )。 BIOS执行内存地址为 FFFF:0000H 处的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件(包括内存)进行检查。 2. 读取主引导记录(MBR)。 当BIOS检查到硬件正常并与 CMOS 中的设置相符后,按照 CMOS 中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存地址为0000:7C00H 处。 3. 检查0000:7CFEH-0000:7CFFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示"NO ROM BASIC"然后死机。 4. 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处, 然后继续执行。 5. 根据MBR中的引导代码启动引导程序。 ## 以十六进制查看设备内容 在Linux,可以通过使用`hexdump`命令以十六进制方式来查看文件的内容。在类Unix系统中,设备都是抽象为文件的存在。如使用SATA接口的硬盘的设备文件为为`/dev/sd*`。可以访问/dev/sda1来获取该硬盘最前512字节的内容。命令如下: sudo hexdump -n 512 /dev/sda1 -C 其中选项`-n 512`指定只读取512字节,而`-C`则是以十六进制+ASCII的方式打印。输出如下:  注意到输出中有一行的内容是一个星号,而这一行的前后两行的地址不连续。这是因为这段空间的内容都是相同的(在这图片里,这段内容都是0),因此`hexdump`为了阅读性就将它们省略了,只给出首尾的内容。 由于我的硬盘分区是GPT格式的,因此你会发现它跟上面的MBR格式有相同之处却又有些许差异。想要知道原因,请继续往下阅读。如果你不清楚i自己硬盘的分区表格式,可以使用`sudo blkid /dev/sda`命令来查看:  ## GPT **GPT**(GUID Partition Table,全局唯一标识分区表)是一个实体硬盘的分区表的结构布局的标准。它是**EFI**(Extensible Firmware Interface,可扩展固件接口)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的使用32位来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。GPT分配64位给逻辑块地址,因而使得最大分区大小为$2^{64}-1$个扇区成为可能。 GPT分区表结构示意图如下:  ### 传统MBR(LBA 0) 在GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做**保护MBR**。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。不能识别GPT硬盘的操作系统通常会识别出一个未知类型的分区,并且拒绝对硬盘进行操作,除非用户特别要求删除这个分区。这就避免了意外删除分区的危险。另外,能够识别GPT分区表的操作系统会检查保护MBR中的分区表,如果分区类型不是0xEE或者MBR分区表中有多个项,也会拒绝对硬盘进行操作。 在使用MBR/GPT混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。如Boot Camp就是使用这种方式启动Windows。 ### 分区表头(LBA 1) 分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。在使用64位Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。(EFI标准要求分区表最小要有16,384字节,即128个分区项的大小) 分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小(位置总是在LBA 1)以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。所以GPT硬盘的分区表不可以直接使用16进制编辑器修改。 ## References - [维基百科——全局唯一标识分区表](https://zh.wikipedia.org/wiki/GUID%E7%A3%81%E7%A2%9F%E5%88%86%E5%89%B2%E8%A1%A8). 赏 Wechat Pay Alipay 决策树学习与ID3算法实现 C++ 非公有继承与组合