我会尽量简短地说。
我有一个带有 11 个驱动器的 mdadm RAID 6。多年来,它一直“正常工作”,在重新安装等情况下都没有出现任何问题。我甚至不需要配置 mdadm.conf。
在 12.04 版本之后,我无法再启动机器,因为 mdadm 无法挂载阵列,然后会将我扔进 initramfs shell。在启动时,mdadm 会获取 7 个驱动器并在 /dev/md127 中启动它们,当然这会失败。
启动时,我将其停止,将所有驱动器重新组装为 md0,一切又恢复正常。
问题是,我如何才能使其在启动时正常运行?
经过相当多的测试后,我当前的 mdadm.conf 是这样的: http://pastebin.com/SWx1nCNg
启动期间的 mdadm-status: http://pastebin.com/Ua9W3aj4
请注意,上面粘贴的下面是用于重新组装的命令,该命令工作正常。
帮助? :)
答案1
问题是在所有驱动器初始化之前调用了 /usr/share/initramfs-tools/scripts/mdadm-functions。
我的 RAID 阵列中有 6 个驱动器。其中 2 个是板载 SATA,4 个在 mpt2sas(SAS2008)卡上。
显然,mdadm 试图在 6 个驱动器全部连接到系统之前初始化阵列
如果我将 mdadm-functions 编辑为这样,一切正常(丑陋的修复):
degraded_arrays()
{
sleep 15
mdadm --misc --scan --detail --test >/dev/null 2>&1
return $((! $?))
}
对我来说,这个错误是在我今天从 10.04 LTS 升级到 12.04.1 LTS 时出现的!
答案2
因此,经过一些提示后,我发现问题在于某些驱动器没有被 mdadm 足够快地检测到,因此它就停止了。
有人建议添加 rootdelay=30 作为内核参数,但 Ubuntu 直接忽略了。我反而添加了一个 initramfs 预挂载脚本。
echo "sleep 60" > /etc/initramfs-tools/scripts/init-premount;
chmod +x /etc/initramfs-tools/scripts/init-premount;
update-grub;
update-initramfs -u;
重新启动后,启动时间多了一分钟,但我知道 mdadm 已检测到所有驱动器。
答案3
修改在其他地方找到的对我有用的答案。
我看到的症状:
当我升级到 Precise/12.04 时,在 Lucid/10.04 下运行良好的 RAID 停止了自动组装。RAID 在 Precise 中组装为 /dev/md127。在 initramfs shell 中,以下命令修复了问题并允许机器启动。
mdadm --stop /dev/md127 mdadm --assemble /dev/md0
有效的解决方案:
确保 mdadm.conf 具有正确的 ARRAY 行。(我可以正确组装 /dev/md0,这表明 mdadm.conf 是正确的。)
在 /usr/share/initramfs-tools/scripts/local-top 中创建一个脚本(我称之为 mdfix)
#!/bin/sh
sleep 6
mdadm --stop /dev/md127
sleep 6
mdadm --assemble /dev/md0
然后
chmod +x mdfix
update-grub
update-initramfs -u
update-initramfs 可能会生成有关 /dev/md127 的“无此设备”信息。把毛巾盖在头上,不要惊慌。:)
重新启动后,/dev/md0 应该可以正确挂载,只是速度会比以前慢一点。(休眠可能没有必要,但谨慎总比后悔好。)