我的系统上有两个 mdadm 阵列:
alex@fileserver:~$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdc1[0] md0[3] sde1[1]
7759197184 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
md0 : active raid0 sdd1[1] sdb1[0]
3907019776 blocks super 1.2 512k chunks
unused devices: <none>
如果你仔细观察,你会发现它在数组中md1
使用了。 md0
(我有两个 4 TB 磁盘和两个 2 TB 磁盘,这就是我希望它协同工作的方式...)
除了启动时之外,这效果很好。即使我的mdadm.conf
有这些行:
ARRAY /dev/md/0 metadata=1.2 UUID=ba271258:3f18f660:1d5d19aa:2bd0d8e3 name=fileserver:0
ARRAY /dev/md/1 metadata=1.2 UUID=262a6823:3fafb521:75e315ab:f2de4329 name=fileserver:1
它设法组装得md0
很好,但在其阵列中md1
丢失了md0
,最终闲置在那里,仅sdc1
作为sde1
备用件。我猜 mdadm 尝试并行组装其数组或其他什么?
如果在启动后,我mdadm --stop /dev/md1
这样做,则mdadm --assemble --scan
阵列已正确组合在一起。
我的场景可能不是很标准,但是有一些简单的解决方案可以解决这个问题吗?例如,某种方式告诉 mdadm.conf 这md1
取决于md0
?我总是可以编写一个小的初始化脚本,在 mdadm 之后为我执行停止/汇编命令,但如果存在适当的解决方案,我宁愿避免此类黑客攻击,特别是因为我有依赖于md1
存在和安装来工作的系统服务适当地。
答案1
这是一个 Ubuntu 错误,出现在 12.04(内核 ~3.2.0.40)中,一直存在到 16.04 中修复。 Debian 版本中没有出现同样的问题。
来自 Ubuntu 中的对话错误跟踪器:
(塔兰托加用户):
看起来 [Debian] Wheezy 禁用了 md 的 udev 并使用 rc 脚本在启动时进行组装;因此它不会在启动后自动组装阵列。 Trusty 在启动期间和启动后组装真实设备,但似乎忽略了 /dev/md0 等虚拟设备。
Tarantoga 通过添加单行 udev 规则文件找到了一个简单的解决方案:
/etc/udev/rules.d/85-mdadm.rules
:
SUBSYSTEM=="block", ACTION=="add|change", ENV{ID_FS_TYPE}=="linux_raid_member", DEVPATH=="*/virtual/*", RUN+="/sbin/mdadm --incremental $tempnode"
这个解决方案对我有用。我有一面有两个条纹的镜子,只有条纹会在启动时组装。制定这条规则可以使一切正常组装。
(是的,我有一个特定的用例,其中条纹镜子比条纹镜子更好:-))