MBR

主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性地重建数据结构信息后,才可能重新访问原先的数据。主引导扇区内的信息可以通过任何一种基于某种操作系统的分区软件写入,但和某种操作系统没有特定的关系,即只要创建了有效的主引导记录就可以引导任意一种操作系统。
主引导记录(master boot record,MBR)位于硬盘的第一物理扇区。由于历史原因,硬盘的一个扇区大小是512字节,包含最多446字节的启动代码、4个硬盘分区表项(每个表项16字节,共64字节)、2个签名字节(0x55,0xAA),如图所示。分区表项的结构见表。
截屏2021-04-13 下午11.02.03.png

image.png

GRUB

When a computer with Red Hat Enterprise Linux is turned on, the operating system is loaded into memory by a special program called a boot loader. A boot loader usually exists on the system’s primary hard drive (or other media device) and has the sole responsibility of loading the Linux kernel with its required files or (in some cases) other operating systems into memory.

根据红帽官方文档对grub的描述,grub一共分为两个阶段。
第一阶段由BIOS从MBR中读入内存,MBR中前446字节存放了能够加载1.5阶段或者2阶段的引导加载程序。
某些硬件需要一个中间步骤才能加载引导程序,所以有时候会有1.5阶段加载程序到内存。(当/boot/分区高于硬盘驱动器的 1024 柱面或使用 LBA 模式时,有时会出现这种情况。)
由第一阶段加载的第二阶段被读入到内存,第二阶段包含了程序显示GRUB的菜单和命令环境。该界面允许用户选择要引导的内核或操作系统、向内核传递参数或查看系统参数。

例如,Microsoft ® Windows ® 操作系统以及其他操作系统都是使用链式加载来加载的。在这种方法下,MBR 指向保存操作系统的分区的第一个扇区,在那里它找到实际启动该操作系统所需的文件。
GRUB 支持直接和链式加载引导方法,允许它引导几乎所有操作系统。

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/installation_guide/s1-grub-whatis#s2-grub-whatis-booting

工作过程

计算机系统启动首先对本机的硬件设备进行测试, 测试成功之后进入自举程序INT l9H, 然后将磁盘的0柱面、0磁头、1扇区的主引导记录内容读入内存指定单元, 其首址为0:7C00开始的区域, 并执行MBR程序段。主引导记录优先于所有操作系统被调入内存的指令, 并发挥主导作用。最后把控制权交给主分区 (活动分区) 内操作系统, 并让主分区信息来管理硬盘。

  1. 首先检查硬盘中分区表是否完好。
  2. 从分区表查找可引导的“活动”分区。
  3. 将活动分区中第一逻辑扇区数据加载到内存中。在DOS分区中, 该扇区内容被称为DOS引导记录, 简称DBR。

image.png

MBR 缺陷

  • 只提供四个分区,多于分区需要拓展分区来实现
  • MBR分区包括亿字节的分区类型代码,有可能会发生冲突。例如0x82,可以标识Linux交换空间或者Solaris磁盘标识
  • MBR使用32位逻辑块寻址,最大限制为2T
  • MBR分区容易损坏

MBR 修复

MBR 本身没有备份,所以如果MBR一旦损坏就会直接无法进入系统。想要修复MBR分区表,只有一种方式,那就是拷贝正常启动磁盘的前 512 字节到坏掉的磁盘。但是需要复制磁盘和原来的磁盘分区表信息一致。

复制 前512 字节
#dd if=/dev/sdb of=/tmp/floopy/mbr.dat bs=512 count=1

将硬盘挂到其他正常的系统,然后进行恢复。
1) dd if=/mbr.dat of=/dev/sdb bs=512 count=1
2) fdisk /dev/sdb, 然后执行p及w
3) mount /dev/sdb2 /tmp/sys

其他的信息都不用改,直接把磁盘挂回之前的系统。
https://blog.csdn.net/weixin_36210111/article/details/116695246

GPT

GUID分区表(简称GPT。使用GUID分区表的磁盘称为GPT磁盘)是源自EFI标准的一种较新的磁盘分区表结构的标准。与普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。它具有如下优点:
1、支持2TB以上的大硬盘。
2、每个磁盘的分区个数几乎没有限制。为什么说“几乎”呢?是因为Windows系统最多只允许划分128个分区。不过也完全够用了。
3、分区大小几乎没有限制。又是一个“几乎”。因为它用64位的整数表示扇区号。夸张一点说,一个64位整数能代表的分区大小已经是个“天文数字”了,若干年内你都无法见到这样大小的硬盘,更不用说分区了。
4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表。其中一份被破坏后,可以通过另一份恢复。
5、每个分区可以有一个名称(不同于卷标)。

逻辑结构

磁盘分区 - 图4
1、保留MBR,GPT的分区方案,硬盘的第一个物理扇区,仍然是一个前面讲过的MBR,这个MBR主要是出于软件兼容性的考虑,对GPT分区方案本身来讲,其实没有啥意义。
2、GPT分区表头,这个在保留MBR之后,也就是占用第二个物理扇区,GPT分区表头中,定义了分区的数量,基本上,你可以认为GPT分区的数量是没有限制的;
3、GPT分区表,从第三个扇区开始,是实际的分区表。请注意:每个扇区可以保存4个分区信息,说明每个分区的分区信息占用的空间是128个字节。
4、从3中,我们知道每个分区的信息占用了四分之一个扇区,也就是128字节的空间,对比一下MBR分区方案中,每个分区的信息只有16个字节,所以GPT分区方案,有充足的空间去存储分区的开始位置及总的容量等,基本上,不用考虑对分区容量的限制。
5、从3中,我们知道,GPT分区方案,分了多少个区,就在分区表中有多少个分区信息。然而实际情形并不是这样,事实上,如图中所示:如果你使用windows操作系统,通常GPT分区表占用32个扇区的空间,可以保存128个分区信息,用不到的空间会被保留,实际使用了多少分区信息与保留了多少分区信息,在2中的GPT分区表头中设置。我们的电脑,通常不会有超过10个的分区,所以GPT分区表中的空间,90%以上都是保留空间,其实就是被浪费了。
6、接下来的两个部分,很简单,分别是GPT分区表,及GPT分区表头的备份。

GPT 分区boot loader

2325732763-fe6204dc00d97ea6_fix732.png

  • 在GPT分区表中,MBR为protected MBR(为兼容MBR,在硬盘起始位置保留的空间),后面并没有空间放core.img,需要建一个专门的分区来放,称为BIOS boot partition,该分区的文件类型为unformatted,flag为BOIS_grub,该flag用于标识core.img所要安装到的分区。若果使用UEFI引导,GRUB读取的是ESP分区中的数据,不需要flag为BIOS_grub的分区。

https://www.gnu.org/software/grub/manual/grub/html_node/BIOS-installation.html#BIOS-installation
https://segmentfault.com/a/1190000020850901

GPT损坏的原因

  • User error
  • GPT utility errors
  • MBR/GPT mismatches
  • GPT disk re-used as MBR
  • Overwritten GPT main header or table
  • Disk corruption
  • Misplaced data

修复GPT磁盘

预防
gdisk /dev/dsa1 参数b可以保存分区表数据到数据区。

Command (? for help): b Enter backup filename to save: gpt The operation has completed successfully.

半自动修复
当启动gdisk 的时候会读取GPT的数据结构,如果检查有问题会自动修复。

手动恢复分区表

Command (? for help): r Recovery/transformation command (? for help): ? b use backup GPT header (rebuilding main) c load backup partition table from disk (rebuilding main) d use main GPT header (rebuilding backup) e load main partition table from disk (rebuilding backup) f load MBR and build fresh GPT from it g convert GPT into MBR and exit h make hybrid MBR i show detailed information on a partition l load partition data from a backup file m return to main menu o print protective MBR data p print the partition table q quit without saving changes t transform BSD disklabel partition v verify disk w write table to disk and exit x extra functionality (experts only) ? print this menu

参考链接:
https://developer.apple.com/library/archive/technotes/tn2166/_index.html
https://thestarman.pcministry.com/asm/mbr/GPT.htm
https://www.wikiwand.com/en/GUID_Partition_Table

对比MBR与GPT

https://wiki.archlinux.org/title/partitioning#GUID_Partition_Table
https://developer.ibm.com/tutorials/l-gpt/

GRUB vs GRUB 2
https://linoxide.com/best-difference-between-linux-grub-and-grub2-bootloader/