在不使用硬件 RAID 的情况下,如何使 EFI 系统分区变得冗余?

Nei*_*dge 5 linux redundancy uefi

在不使用硬件 RAID 的情况下使 EFI 系统分区冗余的 BCP 是什么?

如果我在不同设备上创建 3x EFI 系统分区,然后将对主设备(安装在/boot/efi)所做的任何更改备份到备份设备(安装在/boot/efi-[bc]):

  • 如果主设备发生故障,系统是否仍会启动,即是否会选择备份 EFI 系统分区之一?
  • 系统在启动时是否会确定性地选择 EFI 系统分区,即必须在下次重新启动之前将对主分区的更改复制到备份上?

是否有更好的方法,使系统在主设备出现故障时仍能启动?

Nik*_*nov 4

  1. UEFI 规范缺乏有关软件 RAID 的任何知识。这是已知的缺陷。

我推测可能是因为它很大程度上受到微软人员的影响,他们无法在 Windows 中创建可靠的软件 RAID 阵列,并且他们不知道可以使用简单的超级块从分区中创建阵列,而无需特殊的内部结构(Windows 只能使用转换为“动态”逻辑磁盘管理器或存储空间格式的磁盘构建阵列)。

  1. 您可以在不同的设备上制作多个 ESP 并手动同步它们。

例如,如果您在 ZFS“软件 RAID”上安装 Proxmox VE,它将创建多个 ESP,并安装特殊的“钩子”,该钩子在内核、引导加载程序和其他与引导相关的内容更新后运行,并且该钩子确保所有 ESP 都已启动。保持同步。

您还可以添加 Grub 挂钩以将其安装在两个 ESP 上,如本答案所述:

创建包含以下内容的文件/etc/grub.d/90_copy_to_boot_efi2并使其可执行:

#!/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
Run Code Online (Sandbox Code Playgroud)

然后,每当您或系统运行时,update-grub它都会运行此脚本。另请注意,当灾难发生时,此脚本有些危险;如果主设备发生/boot/efi故障并被更换,此脚本将从/boot/efi2 中删除有效内容。因此,在这种情况下,您需要禁用它(删除可执行位),或者在运行 rsync 之前检查挂钩中的源条件。

  1. 为了让备用 ESP 在主设备发生故障时接管,您应该为所有 ESP 设置 UEFI 启动条目。在 Linux 中是这样完成的:
efibootmgr -c -d /dev/sdb -l \\EFI\\DEBIAN\\GRUBX64.EFI -L debian-sdb
efibootmgr -c -d /dev/sdc -l \\EFI\\DEBIAN\\GRUBX64.EFI -L debian-sdc
efibootmgr -c -d /dev/sdd -l \\EFI\\DEBIAN\\GRUBX64.EFI -L debian-sdd
efibootmgr -c -d /dev/sda -l \\EFI\\DEBIAN\\GRUBX64.EFI -L debian-sda
Run Code Online (Sandbox Code Playgroud)

这是我的托管系统之一的真实示例。它假设 ESP 是每个磁盘的第一个分区。这应该在同步 ESP 的内容后完成。efibootmgr -v将确认您像这样创建的所有引导条目都使用不同的设备。

另请参阅:https ://askubuntu.com/questions/66637/can-the-efi-system-partition-be-raided