启动失败,根目录MD(RAID1)+ LVM:udev事件时序

全新安装的Ubuntu Server 13.10(x64)从位于md + lvm的根卷启动时遇到问题。 现在我已经扼杀了一个解决scheme,但我想更多地了解正在发生的事情以及可能会有哪些更好的解决scheme。

由于这台机器的目的是为了试验Xen(为了更好地理解商用虚拟机托pipe),该机器是由我必须交付的零件组装而成的,特别是: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 

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

通过在/ etc中创build/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'" 

(并重buildinitramfs)系统现在无辅助地启动,但这是一个相当可怕的解决scheme。 我已经尝试过在各种bug追踪器和博客文章中讨论的rootwait=lvmwait=scsi_mod.scan=sync内核参数,但没有一个是我尝试过的。 几页提示evms是一个问题,但似乎没有安装。 其他人build议在不相关的块设备上超时,甚至禁用DVD驱动器。

看来在md和lvm之间有某种竞争条件,在md0准备好之前lvm正在被udev调用。 那些内核参数似乎 lvm运行插入延迟,因此没有多less等待有帮助,因为vgchange已经运行(并失败),因此LV永远不会准备好。

就我所钻研的问题而言。 任何人都可以提出一个更好的解决scheme,或build议如何钻入以find更多的问题?

[1]因为sdb1在这个时候缺less,所以这个raid卷被手动configuration为1个设备的RAID1,因为Ubuntu不喜欢在降级的卷上引导。

我只是有同样的问题,显然是相同types的硬件和新鲜的13.10 x64安装。 由于缺乏经验,我花了几天的时间寻找缺less内核模块等的可能性,但是在阅读完您的报告后,我发现在initramfs busybox提示符下的vgchange -ay会显示系统可启动的状态。 我还没有试过你发布的1秒延迟解决方法(我会),但我也注意到下面的Debian错误报告可能是相关的:

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

我有同样的问题,search后,我发现这个解决scheme为我工作。 我只需将所有/dev/md/*设备重命名为/dev/md/*中的/dev/md*设备,然后运行update-initramfs -u以更新initramfs。