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

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

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

(GPT)
1)  1MB   BIOS_BOOT
2)  300MB LINUX_RAID   
3)  *     LINUX_RAID   

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

如何正确设置 GRUB,以便在一个驱动器出现故障时,另一个驱动器仍能启动?推而广之,替换驱动器也会自动包含 GRUB 吗?当然,如果这可能的话。

答案1

如果两个磁盘是/dev/sda/dev/sdb,则同时运行grub-install /dev/sdagrub-install /dev/sdb。然后两个驱动器都可以单独启动。

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

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

答案2

其他答案(建议使用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

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

#!/bin/sh
set -e

if mountpoint -q /boot/efi && mountpoint -q /boot/efi2 ; then
        rsync -t --recursive --delete /boot/efi/ /boot/efi2/
fi
exit 0

注意(如果sda失败):假设sda出现故障,需要更换磁盘,记住删除那个钩子,并将内容复制/boot/efi2到新的/boot/efi.否则,您可能会遇到/boot/efi(在新磁盘上)为空并且你的在职的 /boot/efi2将被擦除rsync --recursive --delete可以是无情的)。


1:这似乎没有被广泛记录(仅在Arch Linux 维基),但是当您使用 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.

答案3

过去我在相当多的服务器上这样做过,有时会发现问题,通常我所做的是运行以下命令

sudo grub-install /dev/sdb
sudo update-grub /dev/sdb

我遇到的问题通常会显示错误消息,例如

update-grub … update-grub failed with no such disk …

为了解决这个问题,我已经运行了

sudo mv /boot/grub/device.map /boot/grub/device.map.old 
sudo update-grub 

这似乎已经解决了问题 - 作为某些情况下的测试,我已经删除/sdv/sda并只是用来/dev/sdb启动,但这并不理想,并且在大多数生产环境中很可能是不可能的!

答案4

我安装 CentOS 5 和 CentOS 6 的经验是,在安装阶段我当时配置了 RAID-1 - 安装确实让您可以选择执行此操作。结果如下: 1. 将 /dev/sda1 定义为 1 GB 作为 RAID 分区 2. 将 /dev/sdb1 定义为 1 GB 作为 RAID 分区 3. 创建由 /dev/sda1 组成的 RAID 设备 /dev/md0和 /dev/sdb1 4. 使用 /dev/md0 创建 /boot 分区 5. 使用步骤 1 - 3 创建其他分区。 6. 按照说明在步骤 5 中创建的分区上实施 LVM。

初始系统引导后,在 grub.conf 中,我将条目 /dev/sda1 更改为 /dev/md0。然后,我复制了 flashimage 行的条目 (hd0,0) 并在开头添加了 # 并将 (hd0,0) 更改为 (hd1,0)。查看上面的答案,了解如何将 grub 安装到 /dev/sdb 并遵循它们。修改 fstab 以便引导挂载点使用 /dev/md0 (通过这样做,当您执行 yum update 时,/boot 分区上有一些更新,它将写入 /dev/sda1 和 /dev/sdb1 )。如果 /dev/sda 硬盘驱动器出现故障,则必须使用救援启动并注释掉 (hd0,0) 行并取消注释 (hd1,0) 行。您的系统应该是可启动的

相关内容