磁盘分区方式对比(MBR与GPT)

磁盘中曾经提到,磁盘出厂都会进行一次低层格式化,从而确定磁盘的磁道分区划分,在磁盘的低层格式化之后,磁盘的扇区建立起来,扇区就是磁盘进行数据存储管理的一个基本单位。

而分区则是对扇区进行组织管理的一种方式,它将扇区分成不同的组,每个组包含一定的扇区,每个称为一个分区。目前比较令人熟知的分区方式有两种:MBR分区和GPT分区。

MBR(Master Boot Record)分区

MBR分区是随着IBM PC DOS时代而来的,与他同时诞生的还有传统BIOS,它所诞生的那个时代硬盘容量都很小,所以MBR分区是根据当时的硬盘容量来进行设计的,正是因为如此,随着硬盘容量越来越大,它的劣势逐渐显现出来:只能创建4个主分区,通过4个主分区只能管理2TiB的硬盘空间。

1、MBR分区格式

上图说明:上图中的partition3 与 Extened之间采用括号表示的意思:这一块要不就是Partition3,包含黄色区域开始到下一个黄色区域之间的部分;这一块要不就是Extened Partition,包含蓝色区域开始到下一个黄色区域之间的部分。

另外,上图中的黄色是Partition Boot Record(又叫partition boot sector,或者volume boot record,VBR,或者volume partition sector)因为文件系统或者操作系统不同而有所不同,这个区域是在IBM的个人计算机的操作系统中引入的,也就是DOS时代。后来微软出的操作系统都兼容了这个VBR,不管是FAT12,FAT16,FAT32还是NTFS,这些文件系统都是兼容VBR这个区域的,并且保留了这个区域,这个区域存放着文件系统的一些信息。现在大容量硬盘都采用GPT分区格式,这些文件系统依然保留了VBR这个区域。

对于linux来说,不论是MBR还是GPT分区,ext4文件系统都有一个引导块的区域,这个区域就是类似于VBR的一个区域,称为引导块,group 0 padding。

关于ext4文件系统概述 - 知乎

https://blog.csdn.net/lengye7/article/details/122904639  ext4备份地址

 主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(0柱面,0磁头,1扇区)或者LBA寻址的0号扇区。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。


标准的MBR扇区结构如下:

code area:代码区,引导代码存放的区域,BIOS加电自检完成之后,读入MBR,然后执行这个区域的代码。

Disk signature:硬盘标志用来区分硬盘,当有多块硬盘的时候,方便BIOS通过匹配这个字段来确定自己加载的是否是正确的MBR。

Table of primary patitions:分区表,16字节一个表项,BIOS或者操作系统从这里找到分区的入口。总共可以有4个分区,可以是4个主分区,或者3个主分区+1个扩展分区。 

分区表项格式:

 Patition Flag:1字节,0x80:bootable,活动分区,启动分区,0x00:not bootable,非活动分区,非启动分区。这个标志用来指导Boot Loader用来加载具体分区的Partition Boot Sector,当一个分区的标志位0x80的时候,Boot Loader后续就会加载该分区的Partition Boot Sector。4个分区中,最好只有一个0x80标志,即引导分区,或者叫启动分区。

Start CHS:3字节,早期用来标记分区起始扇区的位置。

Partition Type:1字节,分区类型,具体是什么分区需另外查看资料。

End CHS:3字节,早期用来标记结束扇区的位置。

Start LBA:4字节,分区开始的第一个LBA扇区号,现在所使用的扇区起始位置的标记方式。

Size:4字节,分区所占有的扇区数量。

CHS方式是早期硬盘所使用的标记方式,其所能支持的硬盘不能超过7.875GiB。

为了能够支持更大的硬盘,于是采用一种过渡方式,即开始使用LBA和Size方式来标记分区的起始和结束。

但是即使采用了LBA与Size方式,MBR方式所支持的硬盘也不能超过2TiB。

下面来解释原因:

1、由于size为4字节,则一个分区最多可以有2的32次方个扇区,假设一个扇区是512字节,则一个分区最多不能超过2TiB。

那么一个分区最多可以2TiB,4个分区岂不是可以达到支持8TiB?

2、Start LBA的限制,由于Start LBA采用4字节,其所能寻址的扇区空间为2的32次方,假设第一个分区为2TiB,那么第二个分区的Start LBA地址就必然超出4字节的表示范围,于是第二个分区的Start LBA就无法表示了,就自然而然不存在第二个分区了。同理,也就不存在第三个和第四个分区了。

因此,MBR无法支持超过2TiB的硬盘。

但是如果想使用BIOS引导操作系统又要使用2TiB以上的硬盘那该怎么办呢?

最优方案:

假设该操作系统支持GPT分区方案,那么就可以使用两块硬盘,操作系统所在的硬盘采用MBR分区,然后另外一块容量超过2TiB的硬盘采用GPT方式。

其他方案:

当然,也有整骚操作的,把MBR分区和GPT分区整合在一块容量超过2TiB的硬盘上的,这个最好不要做,万一哪个软件不支持GPT分区的,操作磁盘的时候把GPT分区给破坏了就好玩了。

MBR分区只能支持4个主分区,那如果想要更多的分区怎么办?

MBR也能够创建一个扩展分区,在扩展分区中可以创建很多的逻辑分区,与主分区相比,逻辑分区不能作为引导分区或者说启动分区或者说活动分区。

扩展分区示意图:

扩展分区的引导记录(Extended Boot Record,EBR)

每个逻辑分区前面都是EBR,用来描述当前逻辑分许的起始位置以及大小,同时标记当前分区为一个逻辑分区,也给出下一个逻辑分区的起始位置。

扩展分区引导记录格式

 EBR的格式与MBR没有太大的区别,区别在于各个字段的用途上。

对于EBR来说,一般不使用前面446字节,同时只使用分区表的第一和第二表项,以及后面的标志0xAA,0x55。

其中第一表项用来记录当前逻辑分区的信息(分区起始位置,逻辑分区大小),第二表项用来记录下一个逻辑分区的信息(分区起始位置,逻辑分区大小)。

EBR的分区表的表项的格式

Boot indicator:1字节,永远都是0x00。

Partition type:有特定的字段,0x05(CHS寻址模式),0x0F(LBA寻址模式),但是不同的操作系统可能有所不同。

Start LBA:这与MBR的分区表项有所不同,这里的值是相对于逻辑分区开始的扇区号的。

其他的值没有说明与MBR一致。

逻辑分区的典型示意图:

上图中特意在每个逻辑分区之前隔开19个扇区,目的是为了更好的说明,逻辑分区的起始扇区号的值是相对于分区的EBR的开始扇区号的,例如第一个EBR中,给出的值为20,于是第一个逻辑分区的开始位置就是相对于5000的第20个扇区开始的,逻辑扇区号为5020。

2、MBR分区的硬盘的BIOS的简单引导过程

GPT分区 

由于MBR分区不能支持2TiB以上的硬盘,于是GPT被开发出来了,并作为了UEFI标准的一部分,它能够支持的分区数最少是128个(虽然最少这么多,实际上windows就只支持128个,具体支持多少个,取决于具体实现。),所能支持的硬盘容量最高可以达到8388608 PiB。

因此,GPT可以被认为支持无限分区,无限容量。

GPT:GUID partition table,全局唯一标识符分区表。

GUID:global unique identifier,全局唯一标识符。

1、GPT分区格式

#分区的整体格式

GPT整体的格式

 上图只是一个示意图,为了说明GPT的基本格式,这里的128个分区是一种说明。

LBA0:这里仍然是MBR,只不过在GPT中,MBR(主引导记录)中只存在一个分区,那就是标识类型为EE分区,即保护性分区,这个是为了告诉一些底层操作软件,如果这些软件无法识别GPT,就不要去操作,从而保护GPT分区不被破坏。

LBA1:这里存放GPT的主分区头(Primary GPT Header)。

LBA2-LBA33:一共32个扇区,我们称之为“主分区节点”。

LBA34-LBA-34:正常的GPT分区区域,文件系统(如FAT,NTFS,EXT4等)就是构建在这里面。

LBA-1:这里是GPT分区头的备份。

LBA-2-LBA-33:这里是备份的主分区节点。

#LBA1的GPT主分区头格式:

分区表头的格式

上图中,我们可以看到:

硬盘GUID:这个用于区分硬盘设备,唯一标识。

分区表项的数量:这个是4字节,32bit,这说明GPT分区的数量可以高达2的32次方个。

分区表项的大小: 一般就是128字节了。

CRC32校验:用于整个分区头的数据校验,如果出错,就读入备份的分区表头来恢复,如果备份的分区表头也出错了,则报错。

其他的字段就如图中所说的那样。

#分区表项的格式

分区表项的格式
​​​​​

 分区类型GUID:这个是非常重要的一个字段,通过这个字段区分不同的分区类型,例如EFI分区就有一个特定的GUID。

分区GUID:这个要和分区类型GUID进行区分,这个是用来分区的唯一标识,不同分区即使类型相同,分区GUID也不相同。

分区名:这是与MBR的重要区别,MBR没有分区名,72个字节,可以具备72个ASCII字符。

属性标签:这是一个很有意思的字段,可以直接在这里指定分区的属性,例如,只读,隐藏等属性。一般EFI分区(ESP分区),都会设置其属性为隐藏属性。

更多内容可参考EFI标准文档。

2、UEFI在GPT分区下的启动过程

传统BIOS不支持GPT分区启动,如果使用GPT分区,则只能使用UEFI启动。

UEFI启动后,进入了DXE阶段,就开始加载设备驱动,然后UEFI就会有设备列表了。

对于其中的磁盘,UEFI会加载对应的驱动解析其中的分区表(GPT和MBR,没错UEFI可以认识MBR分区)。然后UEFI就会有所有分区的列表了。然后UEFI就会用内置的文件系统驱动,解析每个分区。然后UEFI就会认识分区里的文件。

进入了BDS阶段,然后根据启动项的顺序转到相应的设备,启动项是BDS阶段从NVRAM中读入了,可以通过工具设置NVRAM中的内容,比如启动项的顺序就可以改变。

在启动操作系统的阶段,根据设置的启动项顺序,转到相应设备(仅限GPT设备,如果启动传统MBR设备,则需要打开CSM支持)的引导项,引导并进入操作系统。

启动项分为两种:

  • 文件启动项:大约记录的是某个磁盘的某个分区的某个路径下的某个文件。对于文件启动项,固件会直接加载这个EFI文件,并执行。类似于DOS下你敲了个win.com就执行了Windows 3.2/95/98的启动。文件不存在则失败。
  • 设备启动项:大约记录的就是“某个U盘”、“某个硬盘”。(此处只讨论U盘、硬盘)对于设备启动项,UEFI标准规定了默认的路径\EFI\Boot\bootX64.efi。UEFI会加载磁盘上的这个文件。文件不存在则失败。

作为UEFI标准里,钦定的文件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区。

对于windows来说:

通常情况:主板UEFI初始化,然后找到了默认启动项Windows Boot Manager(windows会直接更改默认的启动项,改为EFI\microsoft路劲下的启动文件)。里面写了bootmgfw.efi的位置。固件加载bootmgfw.efibootmgfw.efi根据BCD启动项(注意:这里是指操作系统启动项,不是UEFI的设备或文件启动项,注意区别。)存储,找到装Windows的磁盘的具体分区,加载其中的WinLoad.efi。由WinLoad.efi完成剩下的启动工作。

其中的虚线,跟上面的一样,意思是,Windows启动盘和EFI启动盘,可以是一个硬盘,也可以是不同的硬盘。所以对于UEFI来说,启动盘是bootmgfw.efi所在的那个盘。

同一个硬盘上, ESP分区可以具备两个吗?

ESP分区当然可具备两个或者多个,但是UEFI启动阶段,只会从一个启动项加载,也就是说,即使有多个ESP,也只有一个ESP被UEFI所加载。

如果有多个系统需要引导,比较好的做法是在一块硬盘上分配一个大一点的ESP,然后将各个操作系统的引导文件都写入到这个ESP分区中。

然后启动时候:

1、从UEFI的启动项中,自己手动选择需要加载的系统启动项。这是方法一。

2、选择一个能够从自己切换到其他系统启动项的引导程序作为UEFI的默认启动项。例如,Grub就是这样一个引导程序。这是方法二,方法二显然更好。

已经在虚拟机中测试过了。

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值