问题
我有一台从八磁盘 Btrfs RAID10 卷启动到 Arch Linux 的机器。最近,我重新启动并出现以下 GRUB 救援提示:
我不确定到底是什么触发了这个。自上次启动以来,我pacman -Syu
至少安装了两次更新 ( ),并且可能对系统进行了其他更改,包括重新安装 GRUB。如果我添加专用启动盘就可以启动系统。
理论
在与 #archlinux IRC 频道的一位乐于助人的成员进行故障排除时,我遇到了Arch wiki 上的这个注释:
分区偏移量
当您尝试将 core.img 嵌入分区磁盘时,可能会出现偏移问题。这意味着可以直接将grub的core.img嵌入到无分区磁盘(例如/dev/sdX)上的Btrfs池中。 GRUB 可以引导 Btrfs 分区,但该模块可能比其他文件系统大。 grub-install 生成的 core.img 文件可能无法放入 MBR 和第一个分区之间的驱动器前 63 个扇区 (31.5KiB)。最新的分区工具(例如 fdisk 和 gdisk)通过将第一个分区偏移大约 1MiB 或 2MiB 来避免此问题。
这似乎表明将 GRUB 安装到分区上可能会出现问题和无分区磁盘,较新的分区工具通过在磁盘开头留出额外的空间来缓解(目前)这种情况。
安装到分区或无分区磁盘
警告:GRUB强烈劝阻像 GRUB Legacy 或 Syslinux 那样安装到分区引导扇区或无分区磁盘。此设置很容易损坏,尤其是在更新期间,并且不支持由 Arch 开发者提供。
好吧,真是的。
无论如何,grub-install -v
在其输出中包含这一行:
grub-install: info: the total module size is 0xa07c.
这大约是 41K,远远超过了上面提到的 31.5KiB 限制,但我对 GRUB 的了解还不够深,无法确定这就是我遇到麻烦的原因。
问题
如果这是问题是,我怎样才能证明它——
grub-install
如果是的话,为什么不大声失败呢?今后格式化可启动 Btrfs 磁盘的正确方法是什么?主引导记录?通用技术? — 专用启动盘很诱人,但我喜欢在卷中的每个设备上都有一个冗余引导加载程序。
有没有比擦除并运行
btrfs replace
每个磁盘更好的方法将每个磁盘迁移到分区表?
答案1
过去,使用 fdisk 创建 MBR 分区表时,默认情况下会保持前 63 个扇区不变。这是可以安装 GRUB 和其他引导加载程序的地方。
快进到现代,同样的工具(fdisk)留下了更多未使用的空间;足以让 GRUB2 安装具有 BTRFS 支持的 stage1。我相信默认情况下偏移量约为 1MB;无论这在行业中意味着什么。
我不知道为什么grub-install
没有失败,但我想它不会检查引导扇区大小;没有分区怎么可能。
我不认为拥有冗余引导加载程序有什么问题。您必须手动管理它,但 GRUB2 的 stage1 不会经常更改。但这意味着您需要分区。
我不知道有什么工具可以迁移磁盘以添加分区表。问题是文件系统与磁盘上的扇区相关联,并且添加分区表会更改这些扇区。如果您的 BTRFS 文件系统位于 LVM 上,那么您可以移动文件系统,因为文件系统将与“虚拟扇区”绑定。并不是说你应该这样做,只是说明问题是什么。