一段时间以来,我一直在使用软件 RAID 1 根分区和启动分区来设置所有服务器,以便最大限度地减少磁盘故障时的停机时间。安装时我设置了
mdadm --create /dev/md0 --metadata 1.0 --raid-devices=2 --level=1 /dev/sd[ab]1
mdadm --create /dev/md1 --raid-devices=2 --level=1 /dev/sd[ab]2
mkfs.fat -F32 /dev/md0
mkfs.ext4 /dev/md1
然后在 fstab 中将它们分别设置为 /boot 和 /。当然EFI无法读取软件RAID 1分区,因此EFI引导设备是/dev/sda1和/dev/sdb1单独地。 initramfs 设置为了解 mdadm,因此 / 立即挂载为 /dev/md1 raid 分区,而 /dev/md0 在启动后进行镜像,保持/dev/sda1
并/dev/sdb1
同步。我多年来一直这样设置系统,从未遇到过任何问题。
直到最近,我配置了一个具有 26 个 HBA 磁盘的备份服务器。 /dev/sdy
和/dev/sdz
是我用于/
和 的SSD 磁盘/boot
。大多数时候系统都能正常启动。然而,重启时系统会间歇性崩溃,抱怨“超级块/dev/md1
已损坏”并“尝试运行 e2fsck -b 8198 等)来解决问题。但是,/dev/md1 上的超级块没有任何问题。我可以从 USB 记忆棒启动并安装 /dev/md1
没有问题,并且e2fsck
设备上没有返回任何错误,我不知道可能导致此问题的原因(除了间歇性硬件问题或可能不稳定的固件)。可能是系统中的大量磁盘与mdadm
默认情况下组装 raid 的方式相结合(即通过扫描分区寻找 RAID 超级块),但后来意识到该指令位于 /etc/mdadm.conf 中,无法读取直到 / 已经安装之后,这首先是问题所在。
有其他人见过这个问题或知道解决方案吗?
答案1
我在用系统引导作为我的 UEFI 启动管理器(https://wiki.archlinux.org/index.php/Systemd-boot),并且 systemd-boot 要求您提供加载器配置条目它提供有关要引导哪个内核/initramfs 文件以及作为内核引导参数传递的选项的信息。这些选项之一指定根设备:
# cat /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=acf7e0be-5723-478e-aad6-80af6eb82a92 rw ipv6.disable=1
我最初像往常一样将根设备设置为root=/dev/md1
,但该系统包含 26 个 HBA 磁盘,并且我认为系统对其磁盘设备命名感到困惑。无论如何,将 root 更改为
root=UUID=acf7e0be-5723-478e-aad6-80af6eb82a92
如上所示已经解决了这个问题,并且系统现在每次都能正确启动。