我有一个 Mandriva Linux 系统,从 2010.0 版升级urpmi
到 2010.1 版,然后又升级到 2011.0 版。我确实遇到了一些小问题,但我都能解决。
几周前,Mandriva 更新程序通知我,要更新shorewall
,我还必须用 和 替换sysvinit
。systemd
自然systemd-sysvinit
,我不愿意让更新程序无缘无故地触及像启动系统这样重要的东西,所以我推迟了。自然,Mandriva 更新程序小程序一直烦我。自然,我最终放弃并同意了。而且,自然,它弄得一团糟,我的系统无法自行启动。
它正常启动,发出几条消息,然后我收到大量以下格式的消息:
Starting XXXX aborted because a dependency failed.
其中 XXXX 是与文件系统相关的内容,可以是fsck
调用或文件系统挂载。它将我带入 root shell,在那里失败的依赖关系很快就变得显而易见:大多数 MD 阵列尚未启动。手动执行
# mdadm -As
# mount -a
# systemctl default
按照此顺序可以让系统完成启动过程。
我有几个物理驱动器被分成多个分区,然后将它们组合成几个 RAID-1(例如/boot
)和 RAID-5(/
、交换和几乎所有其他内容)阵列。分区和阵列以及它们包含的文件系统都是手动创建的,然后安装了 Mandriva Linux。没有任何值得注意的问题,一切都运行良好,直到systemd
出现问题。
我思考我已经在一定程度上追踪了这个问题。sysvinit
以前运行的旧系统/etc/rc.d/rc.sysinit
(由 Mandriva 提供)包含以下行:
MDADM_RETURN=`/sbin/mdadm -As --auto=yes --run 2>&1`
它将启动 中指定的任何尚未启动的 MD 阵列/etc/mdadm.conf
。据我所知,此文件在安装后不再使用system
,上面的行已被 中的此行替换/lib/systemd/fedora-storage-init
:
[ -r /proc/mdstat -a -r /dev/md/md-device-map ] && /sbin/mdadm -IRs
不幸的是,我的系统似乎缺少该/dev/md/md-device-map
文件,因此mdadm
无法执行。我可以想到几种“修复”此问题的方法,例如编辑脚本systemd
或修改我的/boot/initrd.img
以启动所有 MD 阵列,但我宁愿以一种不会因下一次软件包升级而中断的方式进行。
它的格式是什么
/dev/md/md-device-map
?如何创建?这个文件是通用的吗(例如,在较新的mdadm
版本中),还是 Fedora/Mandriva 特有的?我在 Fedora 论坛上看到了一些示例,但没有什么实质性的内容。修复此启动故障的“正确”方法是什么?如果可以避免,我宁愿不求助于脑外科手术……
为什么,为什么,为什么我没有坚持“如果没有坏,就不要修理它!”的格言?(是的,这是一个修辞手法......)
答案1
我设法找到了这个问题。在 Fedora 系统上,它/dev/md/md-device-map
显然是设备映射文件,而我的 Mandriva 系统则使用它。因此,由于脚本查看了错误的位置,因此无法启动。mdadm
/dev/.mdadm/map
/lib/systemd/fedora-storage-init
mdadm
为了避免编辑该脚本文件并冒着在将来的软件包更新时丢失修改的风险,我添加了自己的脚本:
$ cat /lib/systemd/mdadm-array-start
#!/bin/bash
# Start any MD RAID arrays that have not been started yet
[ -r /proc/mdstat ] && /sbin/mdadm --assemble --scan
exit 0
我还创建了一个单元文件systemd
:
$ cat /lib/systemd/system/mdadm-array-start.service
[Unit]
Description=Start MD arrays
DefaultDependencies=no
Conflicts=shutdown.target
After=fedora-wait-storage.service
Before=fedora-storage-init.service local-fs.target shutdown.target
Wants=fedora-wait-storage.service
[Service]
ExecStart=/lib/systemd/mdadm-array-start
Type=oneshot
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=basic.target
然后我启用了该服务:
# systemctl enable mdadm-array-start.service
ln -s '/lib/systemd/system/mdadm-array-start.service' '/etc/systemd/system/basic.target.wants/mdadm-array-start.service'
这可确保任何 MD 阵列无需管理员干预即可启动。