MBR与GPT详解

一、MBR

        早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区)的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大小 ,所以说,第一个扇区 512Bytes 会有这三个数据:

1、主要开机记录区(Master Boot Record, MBR)

        可以安装开机管理程序的地方,有446 Bytes。 

2、分区表(partition table)

        记录整颗硬盘分区的状态,有64 Bytes,由于分区表所在区块仅有64 Bytes容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的柱面号码。

3、分区结束标志位

       结束标志,偏移地址01FE--01FF的2个字节,即最后多出来的510~511字节按惯例为0xAA55。若磁盘此处的值不为0xAA55,则判断该磁盘的MBR被损坏,系统不能启动。

MBR分区图:

         若将硬盘以长条形来看,然后将柱面以直条图来看,那么那64 Bytes的记录区段如下面的图所示:(其中蓝色那块为分区表)

        但是其实MBR分区类型的磁盘也可以分很多个分区,通过叫做扩展(Extended)分区来实现,MBR的分区表记录的是主(Primary)分区和扩展(Extended)分区,主分区就是我们上边所说的记录分区的开始和结束柱面。通过扩展分区达到使用其他扇区来记录分区的形式,每个分区会由一块空间来存放分区表,这里的其他扇区又被称作逻辑扇区。如图所示: 

分区表内容表解:

        可以看到两个以4字节表示分区之前以及本分区的扇区数,也就是可以表示的最大扇区数为:2^32*512,而每个标准扇区的容量为512字节,于是能表示的最大容量为:

4294967296*512 Bytes=2199023255552 Bytes=2147483648 KB=2097152 MB=2048 GB=2TB

二、GPT

图2-1
图2-2

图2-1分析:

  • LBA0(MBR兼容模块)
    出于兼容性考虑存储了一份传统MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。
    分为两个部分,第一个是前面446字节,用来存储第一阶段的启动引导程序。而在原本的分区表的记录区内,这个兼容模式仅放入了一个特殊字符来表示此磁盘为GPT格式之意。
    在使用 MBR/GPT 混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。

  • LBA1(GPT表头记录)
    记录了分区表本身的位置和大小,也记录了备份用的GPT分区(最后34个LBA区块)放置的位置。同时放置了分区表的校验码(CRC32),操作系统可以根据这个校验码来判断GPT是否正确。若有错误可以通过这个记录区来获取备份的GPT(磁盘最后面的备份区块)来恢复正常。

  • LBA[2-33](实际记录分区信息处)
    从LBA2区块开始,每个LBA都可以记录4组分区记录,所以在默认情况下,总共有4*32=128组分区记录。每组记录用到128字节的空间。

 图2-2分析:

1. Protective MBR(保护MBR):GPT分区表的第0柱面(LBA 0)处保留一个512字节的MBR分区记录,用来保护GPT分区表免受旧版BIOS的破坏。

2. GPT Header(GPT头):GPT分区表的头部,占据了磁盘的第一个物理块512字节。它包含了GPT分区表的基本信息,包括分区表的位置、大小、版本号、磁盘类型、GUID等。

3. Partition Entries(分区表项):磁盘上每个分区的描述信息,每个分区的信息占据了128字节。它包含了分区的GUID、起始位置、结束位置、分区属性等信息。

4. Partition Array CRC32(分区表项数组校验和):用于检测分区表项数组数据是否正确的校验和。

GPT分区表架构支持最多128个分区,每个分区的大小可以达到EB级别,其中包括了主分区、扩展分区、逻辑分区等类型。GPT分区表架构还提供了更好的数据安全性和可靠性,它通过备份GPT头和分区表项数组来避免数据丢失的风险。

GPT分区大小限制

        GPT 在每组记录中分别提供了 8字节 = 64位 来记载开始/结束的扇区号码。因此,理论上对于单一分区槽来说, 它的最大容量限制为 264 * 512bytes = 263 Kbytes = 233TB = 8 ZB 。但是受操作系统限制,一般一个分区最大限制为 18EB。GPT 分区没有所谓的主、扩展、逻辑分区的概念,每个都可以视为是主分区,每一个分区都可以格式化。

三、不同组合启动流程

BIOS+MBR

        当使用BIOS开机,如果是MBR分区中,grub2充当了开机管理程序,即存放在第一个扇区中。因为MBR只有446字节,存放不下grub2的整个程序及相关文件,所以grub2分成两部分,boot.img和core.img,boot.img存放其MBR中,core.img是被存放在MBR与第一个分区(注意这里是分区而不是扇区)之间的,boot.img去启动core.img,core.img由于没有了大小的限制,会包含一些基本文件系统驱动(EXT,FAT,NTFS),这样grub2可以定位到/boot的文件系统,读取内容等。而grub2需要的一些文件,包括运行时内核模块,配置文件都是在/boot/grub2文件夹下,内核文件就在/boot/文件夹下,这样grub2就会去加载内核,进一步操作系统就可以启动。

接这张图来理解:

  • 首先第一个分区从2048扇区开始,0号扇区存放MBR,1~2047扇区如上边所说是留给core.img的。

  • 分区号1-4是留给主分区和扩展分区的,分区号5,6,7...是留给逻辑分区的,所以sdb1,sdb2,sdb5中间会有一个跳跃。

这也是MBR下系统的磁盘的结构:

 BIOS+GPT

        因为GPT中是兼容了MBR的(LBA0就是MBR),所以BIOS同样可以开机GPT分区的操作系统。与BIOS->MBR类似,同样需要boot.img去启动core.img,boot.img同样放在第一个扇区,不一样的是core.img并不是放在第一个分区和mbr之间,而是有一个单独的分区BIOS BOOT(1M的内存空间),下图是我操作系统GPT分区:

 

        /dev/sda1就是BIOS boot分区,2048sectors*512bytes=1MB, 同样官方也给了一张图来说明启动的这个过程:

 UEFI+GPT

        最后我们来讲UEFI启动GPT分区,我们也已经展示了GPT分区表的图,那么如果使用UEFI是如何启动呢,这里肯定不是使用boot.img和core.img来启动。这里提供一张不兼容MBR启动的分区表的图:

        由于没有了bios boot分区,所以就不再支持BIOS启动GPT分区了。这个分区表中比较特殊的一个分区是EFI system这个类型的分区,也被称作EFI System Partition(ESP),这个分区是VFAT格式的文件系统,UEFI还可以读取这个文件系统,且我们的引导文件也在这个目录里,从下图可以看到,这里就有boot loader(grub2)和一些启动时必须软件,centos目录下包含grubx64.efi这个程序, 最终UEFI执行grubx64.efi这个程序。这样就和之前步骤一样了,grub2会去加载内核,启动操作系统。

四、修改引导默认组合

首先我们可以使用下面这条命令来查看我们的引导类型

[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

接着使用 fdisk -l 来查看我们的磁盘分区类型 

这里提示 WARNING 是因为 fdisk 命令早期不支持gpt分区的,而现在新版的 fdisk 工具(如下图)可以识别到gpt分区。

BIOS+MBR——>BIOS+GPT

        在安装时使用BIOS引导,如果磁盘容量小于 2TB 的话,系统默认会使用 MBR 模式来安装,如果磁盘容量大于2TB的话,那么系统就会使用GPT模式来安装,在分区的时候会看到一个 BIOS BOOT 分区,那如果磁盘小于2TB又想要强制使用 GPT 分区表的话,你就得要这样作:

1. 使用方向键,将下图的光标移动到“ Install CentOS 7 ”的项目中

2. 按下键盘的 [Tab] 按钮,让光标跑到画面最下方等待输入额外的核心参数

3. 在出现的画面中,输入如下画面的数据 (注意,各个项目要有空格,最后一个是光标本身而非底线)

 UEFI+GPT——>UEFI+MBR

        安装时使用UEFI引导,系统会默认使用GPT模式来安装,在官方并没有找到可以强制修改的参数,所以我们进去使用 gdisk 工具修改,它可以使我们实现无损修改,不会格式化我们的磁盘,摧毁掉我们的数据,如果使用 fdisk 或者 parted 的话,它会在修改同时对硬盘进行格式化。

在UEFI+GPT环境下:

1.安装gdisk:如果您的系统没有安装gdisk,请使用以下命令安装:

yum  install gdisk -y

2. 打开磁盘:使用以下命令打开您要转换的磁盘:

gdisk /dev/sdX

请将/dev/sdX替换为您要转换的磁盘名称。

3. 转换分区表格式:在gdisk命令行中,输入“r”以进入恢复和转换菜单,然后输入“g”以将分区表转换为mbr格式。输入“w”以保存更改并退出gdisk。

实验

我们创建一个文件实验,待我们使用工具 gdisk 将磁盘类型gpt转换为mbr后查看它是否还在。

接着使用 gdisk 工具进行转换为mbr。

下图可以看到转换完重启后,磁盘类型为msdos,即mbr分区,创建的文件依旧还在。(如果想要转换回gpt,我们只需gdisk /dev/sda进去交互模式,直接输入“w”即可转换回gpt

注意:gdisk 工具用于在BIOS引导的系统进行磁盘类型转换时,会进行格式化分区,重启后会进入grub rescue模式,上面实验是UEFI引导的系统。

实际情况还是遵循BIOS+MBR与UEFI+GPT的默认组合,如果硬盘容量大于2TB,还是使用GPT分区好。


参考文献:

《鸟哥Linux的私房菜》

磁盘分区和开机启动 (taodudu.cc)

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值