当 Debian 更新到 GRUB 2(软件包grub-pc
)时,它不会自动升级 MBR。相反,它配置了旧的 GRUB 1 安装,以便链式加载 GRUB 2;这样管理员就可以测试新的 GRUB 2 配置。如果 GRUB 2 由于某种原因失败,您仍然可以使用旧的 GRUB 1 条目之一引导系统。测试 GRUB 2 后,您应该运行upgrade-from-grub-legacy
以替换 MBR,然后手动删除/boot/grub/menu.lst*
.
不幸的是,我们并没有在很多服务器上真正这样做,所以现在我们混合了 GRUB 1 和 GRUB 2 MBR,并且我们不知道哪个服务器正在使用哪个版本。有没有办法检测GRUB MBR版本?
答案1
德语 Ubuntu wiki(别担心,即使对于不会说德语的人来说,这些信息也应该是可以理解的)似乎展示了一种更好的方法:
sudo hexdump -v -s 0x80 -n 2 -e '2/1 "%x" "\n"' /dev/sdXY
结果可换算成下表:
5272 GRUB (Legacy)
aa75 GRUB (Legacy)
48b4 GRUB 2 (version 1.96)
7c3c GRUB 2 (version 1.97 or 1.98)
020 GRUB 2 (version 1.99)
488 Grub 2 core.img
31d2 Grub 2 core.img
8053 LILO
原始 wiki 文章包含更多 ID,可用于识别其他操作系统中的许多其他 MBR。
答案2
我发现当服务器仍在使用 GRUB 1 MBR 时,设备的第三个 512 字节块包含以下字符串:
some-server ~ # dd if=/dev/sda bs=512 count=1 skip=2 2>/dev/null | strings
0.97
/boot/grub/stage2 /boot/grub/menu.lst
如果服务器使用 GRUB 2 MBR,则该块将不包含任何可读字符串:
some-other-server ~ % dd if=/dev/sda bs=512 count=1 skip=2 2>/dev/null | strings
WVSS
Z[^_]