早期的 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字节,于是能表示的最大容量为:
-
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会去加载内核,启动操作系统。
四、修改引导默认组合
首先我们可以使用下面这条命令来查看我们的引导类型
接着使用 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,请使用以下命令安装:
2. 打开磁盘:使用以下命令打开您要转换的磁盘:
请将/dev/sdX替换为您要转换的磁盘名称。
3. 转换分区表格式:在gdisk命令行中,输入“r”以进入恢复和转换菜单,然后输入“g”以将分区表转换为mbr格式。输入“w”以保存更改并退出gdisk。
实验
接着使用 gdisk 工具进行转换为mbr。
下图可以看到转换完重启后,磁盘类型为msdos,即mbr分区,创建的文件依旧还在。(如果想要转换回gpt,我们只需gdisk /dev/sda进去交互模式,直接输入“w”即可转换回gpt)
注意:gdisk 工具用于在BIOS引导的系统进行磁盘类型转换时,会进行格式化分区,重启后会进入grub rescue模式,上面实验是UEFI引导的系统。
实际情况还是遵循BIOS+MBR与UEFI+GPT的默认组合,如果硬盘容量大于2TB,还是使用GPT分区好。
参考文献:
《鸟哥Linux的私房菜》