我有 RAID1 md0 用于 /boot,由 4 个分区 (sda2、sdb2、sdc2、sdd2) 组成。我在 2TB 硬盘上使用 GPT,因此每个磁盘上的第一个分区 (sda1,...) 都是 1 兆字节的 bios_grub 分区。
我还有用于 LVM 的 RAID10 md1(包含 /)和用于交换的 RAID0 md2,它们均由所有 4 个驱动器上的分区构建。
mdadm 持久超级块版本是 0.9。
Grub 安装grub-install --modules="mdraid lvm" '(hd0)'
在所有 4 个驱动器 (hd0、hd1、hd2、hd3) 上。
问题。
重启时,grub2 失败并显示“错误:没有这样的磁盘”,并显示“grub rescue>”提示。
ls
命令仅显示 4 个磁盘及其分区 - 但没有md*
设备。重试insmod normal
时显示“错误:没有这样的磁盘”。检查“root”和“prefix”显示类似“(md0)/grub”的内容,这是正确的。执行set prefix=(hd0,2)/grub
然后insmod normal
允许正常启动。
问题。
为什么 grub2 看不到 md0?
到目前为止,我能看到的唯一解决方案是手动构建带有硬编码工作前缀 (grub-mkimage --prefix='(hd0,2)/grub') 的 grub 映像,然后使用 grub-setup 将映像写入每个磁盘。但是,这种解决方案很丑陋,而且容易出错(为了避免错误,需要调查 grub-install 如何调用这两个命令)。我会欣赏更好的解决方案。(注意:这是一个远程服务器,因此无法真正进行“重启调试”。)
答案1
我认为 RAID 仍然是引导加载程序的灰色区域之一。
我最近建立了一个 RAID1 系统,在花了几个小时尝试让 LILO/GRUB/GRUB2 检测我的 raid 之后,我放弃了,只是告诉它使用检测到的第一个 HDD 的第一个分区,并确保如果 HDD 发生故障,下一个 HDD 已经与正确的 MBR/引导加载程序等对齐...
因此,它所做的就是启动、从第一个 HDD(无 RAID)获取内核和 initfs,然后启动内核并将所有 RAID 内容留给内核。因为 GRUB/LILO 不会对驱动器进行物理写入,所以这不会损坏它们。
基本上,在引导加载程序阶段我只是完全忽略了 RAID。
即使 grub 首先执行了此操作,内核也需要重新组装 raid 阵列。除非驱动器在启动过程中发生故障,否则 grub 没有理由需要对 RAID1 系统进行 raid 感知。
PS 您不需要 raid0 SWAP,此功能已在内核中。只需在 FSTAB 中将两个交换设备的优先级都设置为 1 即可
/dev/sda2 none swap sw,pri=1 0 0
/dev/sdb2 none swap sw,pri=1 0 0
ect....
如果单个交换驱动器在正常操作期间发生故障,则您的系统很有可能发生故障。(您可以 raid1 交换,但不能像上面那样从 fstab 进行)