systemd *.device 单元实际上在等待什么?

systemd *.device 单元实际上在等待什么?

我的系统在 systemd 尝试挂载文件系统时卡住了。它因依赖项超时而失败。依赖关系是dev-disk-by\x2dlabel-cb\x2drootfs.device正在安装的设备所在的位置/dev/disk/by-label/cb-rootfs

systemd[1]: dev-disk-by\x2dlabel-cb\x2drootfs.device: Job dev-disk-by\x2dlabel-cb\x2drootfs.device/start timed out.

没有什么可以阻止我安装系统:

mount -av

因此,在这种情况下,systemd 似乎正在等待错误的事情,因为设备显然已经在那里并准备好安装。


可能使事情变得复杂的是根文件系统是涉及同一设备的overlayfs。简单来说,initramfs 是这样做的:

mount /dev/disk/by-label/cb-rootfs /host
mount -o loop /host/rootfs/foo.squashfs /ro
mount -t overlay overlay lowerdir=/ro,upperdir=/host/writable,workdir=/host/workdir /root

/root那么根文件系统是否已准备好让 systemd 开始挂载/etc/fstab

然后/etc/fstab尝试挂载

/dev/disk/by-label/cb-rootfs /host ext4 defaults 0 0

正如我所说,我可以mount -av,并且 Linux 挂载 `/dev/disk/by-label/cb-rootfs 绝对没有问题。但 systemd 显然正在无休止地等待它以某种方式准备就绪。

systemd 还在等什么?我怎样才能避免这样等待呢?

答案1

为了回答我关于 systemd 邮件列表的问题,我得到了这个回应:

蝠鲼米库莱纳斯

.device 单元等待乌德夫广播有关添加该设备的 uevent,这发生在 udev 1. 收到初始内核 uevent(真实的或由 systemd-udev-trigger.service 生成)和 2. 处理完该设备的所有 .rules(其中意味着从 RUN= 启动的所有规则都必须已退出,等等)。

只有 udev 规则标记有 TAG+="systemd" 的设备才会生成 .device 单元;通常 99-systemd.rules 会将其添加到磁盘设备。

如果任何规则已将设备标记为 ENV{SYSTEMD_READY}="0",则 .device 单元将继续等待,直到另一个事件将其删除。

就我而言,事实证明 udev 未正确安装或已损坏,因此尽管 /dev 中的设备可用,但 systemd 仍在等待来自 udev 的信号。

只需重新安装 udev 就可以解决我的问题。

相关内容