我可以使用 dd 恢复 Grub 安装吗?

我可以使用 dd 恢复 Grub 安装吗?

我有一个具有以下分区布局的双引导系统:

# fdisk -l
Disk /dev/sda: 596.2 GiB, 640135028736 bytes, 1250263728 sectors
Disk model: SAMSUNG HM640JJ 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x08c427b9

Device     Boot      Start        End   Sectors   Size Id Type
/dev/sda1            80325   30800324  30720000  14.7G  7 HPFS/NTFS/exFAT
/dev/sda2         30800325  440400559 409600235 195.3G  7 HPFS/NTFS/exFAT
/dev/sda3        440403966 1132820479 692416514 330.2G  f W95 Ext'd (LBA)
/dev/sda4  *    1132820480 1250263039 117442560    56G 83 Linux
/dev/sda5        440403968 1116043263 675639296 322.2G  7 HPFS/NTFS/exFAT
/dev/sda6       1116045312 1132820479  16775168     8G 82 Linux swap / Solaris

Partition table entries are not in disk order.

它是根据parted和 的MBR gdisk。安装 Linux 后,我再也没有启动到 Windows,并dd在从实时 Linux 映像启动时定期将 Linux 的整个 60G 分区和 HDD 的前 63 个扇区备份到外部 HDD。

dd if=/dev/sda4 of=linux.img bs=4096 conv=fdatasync
dd if=/dev/sda of=boot.img bs=512 count=63 conv=fdatasync

在我的 Linux 崩溃后(第一次),我尝试使用上面的逆向启动来恢复它

dd if=linux.img of=/dev/sda4 bs=4096 conv=fdatasync
dd if=boot.img of=/dev/sda bs=512 conv=fdatasync

dd没有报告任何错误,Linux 分区已按预期恢复。但是我无法启动(系统一直在重新启动,因为 Grub 出了问题,光标闪烁,然后一遍又一遍地突然重新启动)。最后使用 live thenchroot和再次启动grub-install。此后我能够再次正常启动。

我备份了前 63 个扇区,因为 Grub 将其用作核心映像(如果我没记错的话)。启动后我做的第一件事就是转储到 newboot.img 文件,然后:

 diff boot.img newboot.img

什么也没返回,这意味着即使重新安装 grub 之后,该区域也是一样的。

  • 请问这种情况下无法启动的根本原因是什么?
  • 我应该如何进行备份(避免第三方)?

据我所知,没有分区更改,没有 UUID...两个图像都是一起创建的。 grub 代码可以在扇区 63 之后的某个位置继续吗?在哪里以及需要多长时间?

谢谢。

答案1

dd if=/dev/sda of=boot.img bs=512 count=63 conv=fdatasync

您要备份主引导记录和 62 个其他扇区,即 31.5 KB。但是嵌入在 MBR 之后的磁盘第一磁道上的 GRUB2 部分很容易比这个更大。

是的,您可能检查过尺寸/boot/grub/i386-pc/core.img并发现它比那个小。但这core.img并不是嵌入 MBR 和第一个分区开头之间空间的全部内容。至少,现代 GRUB2 还嵌入了一些 GRUB 模块:

  • fshelp.mod,各种文件系统的通用支持模块
  • part_msdos.mod,MBR分区表支持
  • 一个文件系统支持模块来匹配包含 Linux/boot目录的文件系统。

core.img在我的系统上,假设您的/boot文件系统是 ext2/3/4(即支持的文件系统非常小),这些最小模块的总大小ext2.mod将超过 36 KB。您的 Linux 发行版可能会选择嵌入更多模块以提供更多功能:上面列出的模块是一组非常简单的模块。

这些模块可以使用 LZMA 算法进行压缩,以降低总大小,但现代 GRUB2 还使用 Reed-Solomon 纠错码来保护嵌入代码免受位错误的影响,从而再次推高了大小。

我一直在尝试开发一个程序来检测各种引导加载程序并读取其低级配置以用于诊断/取证目的。事实证明,我基本上是在重复以下功能bootinfoscript(有一些差异)。但如果我正确读取磁盘上的结构,系统上嵌入的 GRUB2 代码的总大小为 102 个扇区,即 51 KB。

相关内容