MD(RAID1)+ LVM 上的 root 启动失败:udev 事件计时

MD(RAID1)+ LVM 上的 root 启动失败:udev 事件计时

全新安装的 Ubuntu Server 13.10 (x64) 在从位于 md+lvm 的根卷启动时出现问题。我暂时想出了一个解决方案,但我想进一步了解发生了什么,以及可能有哪些更好的解决方案。

因为这台机器的目的是为了试验 Xen(为了更好地了解商业 VM 托管),所以这台机器是由我手头现有的零件组装而成的,具体来说是:Q6600 + Asus P5QL Pro、1 TB 和 500 GB SATA 磁盘(虽然 500 GB 磁盘仍在其他地方使用,但稍后会添加。)

1TB 磁盘有三个分区:sda1 大小与 500 GB 磁盘上的 sdb1 大小相同,sda2 用于交换,剩余部分在 sda3 中。md0 是由 sda1+sdb1 组成的 RAID1 卷[1],是 LVM 可用的一个 PV。

Ubuntu 安装在该 VG(vg_mir)中的两个 LV(dom0_root 和 dom0_homes)中,/boot 位于 dom0_root 中。

光盘初始化后,立即出现以下消息,具体问题如下:

kernel: [    3.003506] md: bind<sda1>
kernel: [    3.007705] md/raid1:md0: active with 1 out of 1 mirrors
kernel: [    3.007768] md0: detected capacity change from 0 to 499972440064
kernel: [    3.047284]  md0: unknown partition table
kernel: [    3.124709] device-mapper: table: 252:0: linear: dm-linear: Device lookup failed
kernel: [    3.124759] device-mapper: ioctl: error adding target to table
kernel: [    3.125156] device-mapper: table: 252:1: linear: dm-linear: Device lookup failed
kernel: [    3.125196] device-mapper: ioctl: error adding target to table

暂停后,它放弃并进入 initramfs shell。发出命令lvm vgchange -ay成功初始化 LVM,/dev/mapper 按预期填充,系统在 ^D 后正常启动。

通过在 /etc 中复制 /lib/udev/rules.d/85-lvm2.rules 并插入sleep 1如下所示的内容:

SUBSYSTEM=="block", ACTION=="add|change", ENV{ID_FS_TYPE}=="lvm*|LVM*", \
    RUN+="watershed sh -c 'sleep 1; /sbin/lvm vgscan; /sbin/lvm vgchange -a y'"

(并重建 initramfs)系统现在可以自行启动,但这是一个相当糟糕的解决方案。我尝试摆弄各种错误跟踪器和博客文章中讨论的rootwait=lvmwait=scsi_mod.scan=sync内核参数,但我尝试的所有方法都不起作用。几页表明 evms 有问题,但似乎没有安装。其他人建议在无关的块设备上超时,我甚至禁用了 DVD 驱动器。

似乎 md 和 lvm 之间存在某种竞争条件,在 md0 准备就绪之前,udev 就调用了 lvm。这些内核参数似乎会造成延迟lvm 正在运行,因此无论等待多久都无济于事,因为 LV 永远不会准备好,因为vgchange已经运行(并且失败了)。

这就是我对这个问题的深入研究。有人能提出更好的解决方案吗,或者建议如何深入研究以发现更多问题吗?

[1] 由于此时 sdb1 缺失,因此手动将此 raid 卷配置为具有 1 个设备的 RAID1,因为 Ubuntu 不喜欢在降级的卷上启动。

答案1

我刚刚遇到了同样的问题,显然是使用相同类型的硬件和全新安装的 13.10 x64。由于经验不足,我花了几天时间寻找缺少内核模块等的可能性,但在阅读您的报告后,我发现 initramfs busybox 提示符下的 vgchange -ay 确实使系统可启动。我还没有尝试您发布的 1 秒延迟解决方法(我会尝试),但我还注意到以下可能相关的 Debian 错误报告:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=633024

答案2

我遇到了同样的问题,经过搜索我发现此解决方案对我来说很管用。我只需要将所有/dev/md/*设备重命名为/dev/md*设备,/etc/mdadm/mdadm.conf然后运行update-initramfs -u即可更新 initramfs。

相关内容