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

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

我使用的是 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。亚伦的回答实际上最让我放心,这正在按预期工作,因此接受了这个答案。

答案1

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

dd if=/dev/sda bs=512 count=1 | xxd

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

dd if=/dev/sda bs=1 count=4 skip=383

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

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

编辑:结束十年后,我刚刚收到一条通知,说这又被投票了。伟大的!但是,我老实说我不知道GRUB 是否将自身安装在现代 GPT 分区驱动器的“保护性 MBR”中,因此将此答案仅视为潜在的一种具有更现代的 UEFI 启动方式。

答案2

启动过程有几个步骤(我描述的是传统的 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 定位文件系统或查找命名文件,因此您不再需要担心指定磁盘的各种方式。

相关内容