简单的问题:initramfs 如何知道如何在启动时组装 mdadm RAID 阵列?
我的问题:我启动服务器并得到:
Gave up waiting for root device.
ALERT! /dev/disk/by-uuid/[UUID] does not exist. Dropping to a shell!
发生这种情况是因为 /dev/md0(即 /boot,RAID 1)和 /dev/md1(即 /,RAID 5)未正确组装。我得到的结果是 /dev/md0 根本没有组装。/dev/md1 已组装,但它没有使用 /dev/sda2、/dev/sdb2、/dev/sdc2 和 /dev/sdd2,而是使用了 /dev/sda、/dev/sdb、/dev/sdc、/dev/sdd。
为了修复这个问题并启动我的服务器我执行以下操作:
$(initramfs) mdadm --stop /dev/md1
$(initramfs) mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
$(initramfs) mdadm --assemble /dev/md1 /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2
$(initramfs) exit
它可以正常启动,一切正常。现在我只需要在启动时正确组装 RAID 阵列,这样我就不必手动组装它们了。我检查了 /etc/mdadm/mdadm.conf,该文件中列出的两个阵列的 UUID 与 中的 UUID 相匹配$ mdadm --detail /dev/md[0,1]
。
其他详细信息:Ubuntu 10.10,GRUB2,mdadm 2.6.7.1
更新:我感觉它与超级块有关。$ mdadm --examine /dev/sda
输出与 相同的内容$ mdadm --examine /dev/sda2
。$ mdadm --examine /dev/sda1
似乎没问题,因为它输出有关 的信息/dev/md0
。我不知道这是否是问题,但它似乎适合用而不是/dev/md1
进行组装。/dev/sd[abcd]
/dev/sd[abcd]2
我尝试将超级块归零/dev/sd[abcd]
。这也会移除超级块,使我完全/dev/sd[abcd]2
无法组装。我不得不把它拿回来。这也使超级块恢复原状。/dev/md1
$ mdadm --create
答案1
好吧,查看用于组装 initramfs 的脚本,我认为问题可能只是您的 /etc/mdadm/mdadm.conf 已过时。
当您的系统完成阵列组装后,请执行以下命令来更新您的 mdadm 配置。您可能还需要仔细检查一下,以防万一。
mdadm --detail --scan > /etc/mdadm/mdadm.conf
完成后,使用以下命令更新你的 initramfs:
update-initramfs
如果此操作持续失败,则您的超级块(用于组装阵列的元数据)可能已损坏。您可能需要检查每个驱动器及其分区以进行验证。最糟糕的情况是,通过 mdadm 将超级块清零并重新创建。
答案2
听起来你的 initramfs 是在你的 RAID 设置错误(或者与现在不同)时创建的,并且从那时起就没有更新过。
您可以运行update-initramfs
(通常在内核更新后运行),希望这将重建您的 initramfs 文件,包括构建正确的 raid 配置文件。
答案3
这是我想出的一个解决方法:
将此脚本添加到/etc/initramfs-tools/scripts/local-top
:
#!/bin/sh
sleep 6
mdadm --stop /dev/md1
mdadm --stop /dev/md0
sleep 6
mdadm --assemble --scan
这会在系统尝试安装之前修复 RAID 阵列md1
。/root
我必须添加暂停才能使命令始终正常工作。
这实际上并不能解决问题,但这是我发现的最佳解决方案,不需要更改 RAID 阵列或升级软件。
答案4
回答这个问题:是的,它确实与超级块有关。技术文档在这里:https://raid.wiki.kernel.org/index.php/RAID_superblock_formats