Grub 在 MBR 启动时向启动扇区写入什么?

Grub 在 MBR 启动时向启动扇区写入什么?

syslinux 的一部分安装过程涉及安装mbr.bin到设备的主引导记录。

dd \
  conv=notrunc \
  bs=440 \
  count=1 \
  if=/usr/lib/syslinux/mbr/mbr.bin \
  of=/dev/sdX

如果我从磁盘恢复这些字节,并将它们与原始mbr.bin文件进行比较,它们是相同的。

$ sha512sum /usr/lib/syslinux/mbr/mbr.bin
3ba2bd96c7e5d81e...
$ dd bs=440 count=1 if=/dev/sdX | sha512sum
3ba2bd96c7e5d81e...

到目前为止一切顺利!这两个校验和应该相同,这似乎合乎逻辑。

当我尝试使用 Grub 来实现与 Syslinux 相同的行为时,它对我来说似乎有点神秘。

通过做一些侦查,dpkg-reconfigure grub-pc我可以看到我的grub安装在安装新的引导加载程序时最终会调用它......

grub-install --target=i386-pc --force --no-floppy /dev/sdX

通过运行相同的grub-install命令并添加--verbose,我看到grub-install调用grub-bios-setup

grub-bios-setup \
  --verbose \
  --force \
  --directory='/boot/grub/i386-pc' \
  --device-map='/boot/grub/device.map' \
  '/dev/sdX'

看看一些来源, 我思考grub-bios-setup就是负责写入 MBR 的操作,因为如果我将前 512 个字节清零,然后重新运行grub-bios-setup,我会看到这些字节恢复到我将它们清零之前的状态。

不幸的是,我对代码的理解不够深入,无法完全理解什么正在由 撰写grub-bios-setup

我有一些预感。我思考所写内容的一部分与有关boot.img。事实上,如果我比较引导扇区和中的某些字节boot.img,它们是相同的(注意,此处读取的字节总数为440)。

$ skip=104 count=336; \
  sudo dd if=/boot/grub/i386-pc/boot.img \
    skip=$skip bs=1 count=$count 2>/dev/null | sha512sum ; \
sudo dd if=/dev/sdX \
    skip=$skip bs=1 count=$count 2>/dev/null | sha512sum

e531a81fd3eedb324a9...
e531a81fd3eedb324a9...

它们有相似之处,但并非如此完全相同。第一个104字节不同,我不明白是什么导致了这种差异。

Grub是否有类似的mbr.bin文件?是吗boot.img?Grub 是否会修改其中一些字节?Grub 是否会动态生成这些不同的字节?Grub 生成的字节是否特定于每个系统,并且每次写入时都是唯一的?

答案1

是的,boot.img写入 MBR 的前 440 个字节。boot.img包含一个“BIOS 参数块”,其中包含取决于安装系统的数据。安装 Grub 时,这些数据会写入 BPM。这里是源代码。

顺便说一句,我不会在 GRUB 上花费太多时间。几年后,这段代码可能不会在新 PC 上运行。英特尔计划在 2020 年之前摆脱旧式 BIOS 模式。

相关内容