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 模式。