如何检查 grub2 实际安装了 MBR 的驱动器?

tim*_*day 19 boot debian grub2 bootable

我使用的是 Debian/Squeeze 系统(其历史至少可以追溯到 Woody),该系统已作为 Squeeze 升级的一部分升级到 grub2。一切正常,但我即将弄乱磁盘配置。

目前,这台机器运行 2 个 80GB 驱动器,带有 RAID1 ed /、/home 和 /boot 分区(还有一对带有 RAID1 ed“/data”和几个交换的驱动器,以防有人想知道交换在哪里,但我没有碰那些)。

我添加了 2 个 130GB SSD,将它们分区为至少与 80GB 驱动器上的分区一样大,并打算通过增加 RAID1 以包含它们来切换到新的 SSD 驱动器,等待同步,然后移除旧的从阵列中删除驱动器,因此只剩下 SSD(然后增加文件系统)。但是 mdadm/ext3 争论不是这个问题的内容......

这将给我留下 2 个过时的 80GB (IDE) 驱动器,我想将它们从机器中移除。我担心删除它们会带走一些重要的 MBR。如何确保机器保持可引导?

进一步来说:

  • 当我进行 Squeeze 升级时,我记得有一些关于 grub2 应该安装到哪些驱动器的选择(我使用默认值,即所有驱动器)。不过当时 SSD 不在机器中。我如何重新运行它以使 grub 安装在 SSD MBR 上?(我猜这是某个包的 dpkg 重新配置)。

  • 如何找到 grub2 认为它安装在哪些驱动器上?很遗憾,这些天在 /boot/grub/ 下有将近 200 个文件!去哪里看?此外,/boot/grub/device.map.auto 目前只列出 3 个驱动器(80GB 中的 2 个,但只有另一个驱动器对中的一个,没有任何 SSD),这似乎有点奇怪。我如何获得最新信息?(更新:那是一条红鲱鱼;device.map.auto 似乎是多年前的遗物;device.map 在 grub-mkdevicemap 的更新中看起来很明智。想想我在这方面的偏执源于旧主板的 BIOS,它会重新排序 GRUB 看到的设备顺序)。

结果:一切顺利,我现在拥有两个开箱即用的旧 80GB IDE 驱动器,以及运行 RAID1 ed SSD 的快速启动系统,所有文件系统都调整到新的分区大小。我正在寻找的另一个“Grub 难题中缺失的部分”是dpkg-reconfigure grub-pc提示哪些磁盘要在其上维护 MBR。Aaron 的回答实际上最让我放心,这是按预期工作的,因此接受了这个答案。

Aar*_*sco 18

MBR 是 512 字节,因此可以快速查看 GRUB 是否存在...

dd if=/dev/sda bs=512 count=1 | xxd
Run Code Online (Sandbox Code Playgroud)

这会转储 MBR,我在我的字节 0x17F = 383 处看到“GRUB”。

dd if=/dev/sda bs=1 count=4 skip=383
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它会打印“ GRUB”,然后是dd输出。

您可以将其包装在 bashfor循环或其他东西中以跨越更多驱动器。如果您不想手动执行此操作。

  • 只是一个小小的补充——因为 GRUB 的位置可能会随着版本的不同而变化,可以使用 `dd if=/dev/sda bs=1 count=512 | dd if=/dev/sda | grep -aob GRUB`。这将返回引导扇区内标记的位置。 (5认同)

Gil*_*il' 17

启动过程有几个步骤(我描述的是传统的 PC BIOS):

  1. BIOS 读取启动盘的第一个扇区(512 字节)。
  2. 第一个扇区中的代码通过 BIOS 接口在固定位置读取更多数据和代码。此 BIOS 接口仅公开两个硬盘:磁盘 0 是读取第一个扇区的位置,磁盘 1 是另一个磁盘,如果您有两个以上,则不容易预测。引导扇区包含一个字节,指示进一步的数据在哪个硬盘上;这是包含/boot/grub.
  3. 在前一阶段加载的代码理解分区、文件系统和其他高级概念。数据包括一个文件系统位置(即类似 的字符串(hd0)/boot/grub),它决定了在哪里查找grub.cfg和进一步的 Grub 模块。
  4. grub.cfg 执行,通常是为了显示菜单并启动操作系统。

引导扇区由 生成grub-setup,通常通过 调用grub-install。引导扇区最终位于您在grub-installgrub-setup命令行上指定的任何磁盘上(以 Linux 语法)。您可以通过运行来检查磁盘上是否有引导扇区file -s /dev/sda。由于您要添加新磁盘并希望从中启动,您需要grub-install在新磁盘上运行。grub-install在同一个磁盘上多次运行是无害的。

困难的部分在上面的步骤 2 中。如果可能的话,将 Grub(即/boot/grub目录)放在 BIOS 启动盘上(或者,从另一个方向接近这个,告诉您的 BIOS 从磁盘启动/boot/grub)。这就是device.map发挥作用的地方。确保(hd0)映射到包含 的磁盘/boot/grub,然后grub-install在该磁盘上运行。

如果您的两个磁盘采用软件 RAID-1 配置,则您将拥有相同的引导扇区。这是理想的行为:如果作为 BIOS 启动盘的一个磁盘出现故障,则从另一个启动将正常工作(因为它们在相同的相关位置包含相同的字节)。如果您只镜像了某些分区,那么安装引导扇区只会影响其中一个磁盘。grub-install在更改device.map(hd0)与包含第二个镜像副本的磁盘关联后,您应该在第二个磁盘上再次运行/boot/grub

第 3 步非常复杂,但通常开箱即用。在第 4 步,Grub 通过 UUID 定位文件系统或查找命名文件,因此您不再需要担心指定磁盘的各种方式。