在我的设置中,我有两个磁盘,每个磁盘都按以下方式格式化:
(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/sda
和grub-install /dev/sdb
。然后两个驱动器都可以单独启动。
确保您的 Grub 配置不会像 那样对磁盘进行硬编码(hd0)
,而是搜索引导文件系统和根文件系统的 UUID。
我不知道 Grub 支持将两个磁盘声明为 RAID-1 阵列,以便grub-install
自动写入两个磁盘。这意味着grub-install
如果更换一张磁盘,则需要重新运行;除了向 RAID 阵列添加新成员之外,这是另一件事要做。
答案2
其他答案(建议使用grub-install /dev/sda
和grub-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) 行。您的系统应该是可启动的