对比MBR和GPT分区概念

   在阅读UEFI spec的过程中,有一个章节专门介绍GUID Partition Table form,说道GPT,必然要与传统的MBR做一番比较,以加深概念和理解和对技术更新的认知。

   在x86架构中,大家的认知基本上都是从硬盘中启动系统,并对系统做合理的分区。但是硬盘如何启动系统,如何保存数据,如何管理分区,这些概念基本没有太多去了解的需要,除了我们这些做底层软件的家伙。

   在传统的分区管理方式中,一定需要理解MBR的概念,Master Boot Record,即主引导记录。位置在Disk的第一个扇区(一般为512Bytes),可以认为MBR就是disk的第一个扇区,也可以认为是第一个扇区中的boot code部分。 因为第一个扇区包括如下三部分:前面446字节是boot loader,其后是64字节的分区表,最后是标识符0x55aa。

   其中,bootloader部分可以根据情况改写,在格式化安装系统的时候这部分会被覆盖的。那么需要理解的地方是后面64Bytes的分区表部分,MBR支持四个分区,每个分区表使用16bytes。

   而目前新的架构中使用GPT来管理Disk 分区,技术的进步当然要带来优势。

   在size方面,可以认为是32bits到64bits的升级。从安全度考虑,GPT增加了备份分区的部分,在disk的最尾端。同时引进了GUID的概念,disk本身可以分配一个GUID,而每个分区也可以分配一个GUID和GUID type。所以在调整分区,或者添加,删减分区的时候,需要修改128个分区表entry中的参数,包括分区GUID,分区类型GUID,分区起始LBA,结束LBA和CRC校验值等。另外,在disk尾端的backup分区表也要做对应的调整。

    当然,考虑到兼容性问题,GPT分区格式,会将第一个分区设置成PMBR,即protect MBR,以免被不支持GPT的系统或者工具识别成不可认的分区格式。

 



与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为128 EB(Exabytes)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

以下是MBR的摘录:

原文:http://zh.wikipedia.org/wiki/MBR

主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息,是数据信息的重要入口。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性的重建数据结构信息后才可能重新访问原先的数据。主引导扇区内的信息可以通过任何一种基于某种操作系统的分区工具软件写入,但和某种操作系统没有特定的关系,即只要创建了有效的主引导记录就可以引导任意一种操作系统(操作系统是创建在高级格式化的硬盘分区之上,是和一定的文件系统相联系的)。

对于硬盘而言,一个扇区可能的字节数为128×2n (n=0,1,2,3)。大多情况下,取n=2,即一个扇区(sector)的大小为512字节。


主引导记录的组成

启动代码

主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。 它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导

硬盘分区表

硬盘分区结构信息
偏移长度(字节)意义
00H1分区状态:00-->非活动分区;80--> 活动分区;
其它数值没有意义
01H1分区起始磁头号(HEAD),用到全部8位
02H2分区起始扇区号(SECTOR),占据02H的位0-5;
该分区的起始磁柱号(CYLINDER),占据
02H的位6-7和03H的全部8位
04H1文件系统标志位
05H1分区结束磁头号(HEAD),用到全部8位
06H2分区结束扇区号(SECTOR),占据06H的位0-5;
该分区的结束磁柱号(CYLINDER),占据
06H的位6-7和07H的全部8位
08H4分区起始相对扇区号
0CH4分区总的扇区数

硬盘分区表占据主引导扇区的64个字节(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息。下面是一个例子:

如果某一分区在硬盘分区表的信息如下

80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00

则我们可以看到,最前面的"80"是一个分区的激活标志,表示系统可引导[1];"01 01 00"表示分区开始的磁头号为1,开始的扇区号为1,开始的柱面号为0;"0B"表示分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS);"FE BF FC"表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;"3F 00 00 00"表示首扇区的相对扇区号为63;"7E 86 BB 00"表示总扇区数为12289662。

对于现代大于8.4G的硬盘,CHS已经无法表示, BIOS使用LBA模式,对于超出的部分,CHS值通常设为 FEFFFF, 并加以忽略,直接使用08-0f的4字节相对值,再进行内部转换.

结束标志字

结束标志字55,AA(偏移1FEH-偏移1FFH)是主引导扇区的最后两个字节,是检验主引导记录是否有效的标志。

主引导扇区的读取流程

  • 系统开机或者重启。
  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中的引导代码启动引导程序
  • 事实上,BIOS不仅检查0000:7CFEH-0000:7CFFH(MBR的结束标志位)是否等于55AAH,往往还对磁盘是否有写保护、主引导扇区中是否存在活动分区等进行检查。如果发现磁盘有写保护,则显示磁盘写保护出错信息;如果发现磁盘中不存在活动分区,则显示类似如下的信息“Remove disk or other media Press any key to restart”。

主引导记录与硬盘分区

主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。[2]

扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。

Windows系统默认情况下,一般都是只划分一个主分区给系统,剩余的部分全部划入扩展分区。这里有下面几点需要注意:

  • 在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。
  • Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
  • 在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。[3]如果硬盘太大则必须改用GPT


--------------------------------------------------------------------------------------------------------------------------------------------------------------

以下是GPT的摘录

原文:http://zh.wikipedia.org/wiki/%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80%E6%A8%99%E8%AD%98%E5%88%86%E5%8D%80%E8%A1%A8

全局唯一标识分区表GUID Partition Table缩写GPT)是一个实体硬盘分区表的结构布局的标准。它是可扩展固件接口EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2 × 1012字节[1]分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到了这个局限性,并且将他们的容量较大的磁盘升级到了4KB的扇区,这意味着MBR的有效容量上限提升到了16 TiB。 这个看似“正确的”解决方案,在临时地降低了人们对改进磁盘分配表的需求的同时,也给市场带来了关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在264-1个扇区成为了可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4 x 1021字节)或8 ZiB 个512字节(9,444,732,965,739,290,426,880字节 或 18,446,744,073,709,551,615(264-1)个扇区 x 512(29)字节每扇区)[1][2]

截止至2010年,大多数操作系统对GPT均有所支持,尽管包括Mac OS X和Windows在内的一些仅支持在EFI基础上自GPT分区启动,见#操作系统支持

GPT分区表的结构。此例中,每个逻辑块(LBA)为512字节,每个分区的记录为128字节。负数的LBA地址表示从最后的块开始倒数,−1表示最后一个块。

特点

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。传统MBR信息存储于LBA 0,GPT头存储于LBA 1,接下来才是分区表本身。64位Windows操作系统使用16,384字节(或32扇区)作为GPT分区表,接下来的LBA 34是硬盘上第一个分区的开始。

苹果公司曾经警告说:[3]“不要假定所有设备的块大小都是512字节。”一些现代的存储设备如固态硬盘可能使用1024字节的块,一些磁光盘(MO)可能使用2048字节的扇区(但是磁光盘通常是不进行分区的)。一些硬盘生产商在计划生产4096字节一个扇区的硬盘,但截至2010年初,这种新硬盘使用固件对操作系统伪装成512字节一个扇区。[4]

使用英特尔架构的苹果机也使用GPT。

为了减少分区表损坏的风险,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进制编辑器修改。

分区表头的格式
起始字节长度内容
08字节签名("EFI PART", 45 46 49 20 50 41 52 54)
84字节修订(在1.0版中,值是 00 00 01 00)
124字节分区表头的大小(单位是字节,通常是92字节,即 5C 00 00 00)
164字节分区表头(第0-91字节)的CRC32校验,在计算时,把这个字段作为0处理,需要计算出分区串行的CRC32校验后再计算本字段
204字节保留,必须是 0
248字节当前LBA(这个分区表头的位置)
328字节备份LBA(另一个分区表头的位置)
408字节第一个可用于分区的LBA(主分区表的最后一个LBA + 1)
488字节最后一个可用于分区的LBA(备份分区表的第一个LBA − 1)
5616字节硬盘GUID(在类UNIX系统中也叫UUID
728字节分区表项的起始LBA(在主分区表中是2)
804字节分区表项的数量
844字节一个分区表项的大小(通常是128)
884字节分区串行的CRC32校验
92*保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420个字节)

主分区表和备份分区表的头分别位于硬盘的第二个扇区(LBA 1)以及硬盘的最后一个扇区。备份分区表头中的信息是关于备份分区表的。

分区表项 (LBA 2–33)

GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。例如,EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。

GPT分区表项的格式
起始字节长度内容
016字节分区类型GUID
1616字节分区GUID
328字节起始LBA(小端序
408字节末尾LBA
488字节属性标签(如:60表示“只读”)
5672字节分区名(可以包括36个UTF-16(小端序)字符)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值