如何在软 RAID 1 上正确安装 GRUB?

vic*_*vic 22 linux software-raid grub2 xfs

在我的设置中,我有两个磁盘,每个磁盘都按以下方式格式化:

(GPT)
1)  1MB   BIOS_BOOT
2)  300MB LINUX_RAID   
3)  *     LINUX_RAID   
Run Code Online (Sandbox Code Playgroud)

引导分区映射在 /dev/md0 中,rootfs 映射在 /dev/md1 中。md0 用 ext2 格式化,md1 用 XFS 格式化。(我知道必须在 md 设备上而不是在 sd 上进行格式化 - 请告诉我这是否有误)。

如何正确设置 GRUB,以便在一个驱动器出现故障时,另一个仍能启动?并且通过扩展,替换驱动器也将自动包含 GRUB?当然,如果这甚至可能的话。

Gil*_*il' 16

如果两个磁盘是/dev/sdaand /dev/sdb,则同时运行grub-install /dev/sdaand grub-install /dev/sdb。然后两个驱动器将能够单独启动。

确保您的 Grub 配置不会对磁盘​​进行硬编码(hd0),而是搜索引导和根文件系统的 UUID。

我不知道 Grub 支持将两个磁盘声明为 RAID-1 阵列,以便grub-install自动写入两个磁盘。这意味着grub-install如果您更换一张磁盘,您将需要再次运行;除了向 RAID 阵列添加新成员之外,还有一件事要做。


Bru*_*uno 7

其他答案(建议使用grub-install /dev/sdagrub-install /dev/sdb)在使用 Legacy BIOS 启动时有效,但在使用 UEFI 时无效。1 (要检查是否使用 UEFI 启动,请检查是否/sys/firmware/efi存在。)


如果您使用 UEFI,则 ESP(EFI 系统分区)不能成为软件 RAID 的一部分,因为它将在软件 RAID 初始化之前用于启动。

您需要在两个磁盘上拥有相同的内容,但它们将是两个独立的 (FAT32) 分区,而不是 RAID 的一部分。

假设您的第一个 ESP 是/dev/sda1(包含目录的 FAT32 分区EFI),您的第二个磁盘(例如/dev/sdb)将需要在同一位置有一个分区和内容以实现冗余。

通常,默认情况下,/dev/sda1将安装在 上/boot/efi,而另一个不会安装(或者甚至可能存在,如果您刚刚设置了 RAID)。确保您有一个与 FAT32 分区/dev/sdb1匹配的分区/dev/sda1,并将内容复制到其中。

UEFI 上的 Debian Wiki 条目建议安装第二个/boot/efi2并使用update-grub钩子自动复制。

您需要创建第二个安装点 ( mkdir /boot/efi2) 并相应地添加第二个 ESP /etc/fstab(Debian Wiki 上的一个很好的建议是添加nofail)。例如:

# You can find the partitions UUIDs using blkid
UUID=7F49-3985  /boot/efi       vfat    umask=0077,errors=remount-ro,nofail      0       0
UUID=8D57-95E5  /boot/efi2      vfat    umask=0077,errors=remount-ro,nofail      0       0
Run Code Online (Sandbox Code Playgroud)

然后添加一个钩子/etc/grub.d/90_copy_to_boot_efi2(并使其可执行)。这将在您下次跑步时运行update-grub。这是 Debian Wiki 脚本的稍微修改版本:

# You can find the partitions UUIDs using blkid
UUID=7F49-3985  /boot/efi       vfat    umask=0077,errors=remount-ro,nofail      0       0
UUID=8D57-95E5  /boot/efi2      vfat    umask=0077,errors=remount-ro,nofail      0       0
Run Code Online (Sandbox Code Playgroud)

注意(如果sda失败):假设sda失败并且您需要更换磁盘,请记住删除该钩子,并将 的内容复制/boot/efi2到新的中/boot/efi/boot/efi否则,您可能会遇到(在新磁盘上)为空的情况,并且您的工作 /boot/efi2将被擦除rsync --recursive --delete可能是不可原谅的)。


1:这似乎没有被广泛记录(仅在Arch Linux wiki上找到参考),但是当您使用 EFI Grub 安装时,INSTALL_DEVICE参数(例如/dev/sda)将被忽略。事实上,grub-install /dev/non_existent_device甚至不会失败:

# grub-install /dev/non_existent_device
Installing for x86_64-efi platform.
Installation finished. No error reported.
Run Code Online (Sandbox Code Playgroud)