我有一个快速虚拟机,但 systemd 服务systemd-zserdbd.service
失败并显示
Dec 01 17:45:32 server-new systemd[1]: Starting systemd-remount-fs.service...
...
Dec 01 17:45:32 server-new (-userdbd)[183]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[185]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new systemd[1]: Started systemd-journald.service.
Dec 01 17:45:32 server-new (-userdbd)[186]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[187]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[188]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
...
Dec 01 17:45:32 server-new systemd-fsck[180]: /usr/bin/fsck.xfs: XFS file system.
Dec 01 17:45:32 server-new systemd[1]: Finished systemd-remount-fs.service.
...
Dec 01 17:45:32 server-new systemd[1]: Reached target local-fs-pre.target.
...
Dec 01 17:45:33 server-new systemd[1]: Reached target local-fs.target.
该错误非常明显:systemd-userdbd.service
需要可写的根文件系统,但在文件系统重新挂载为可写之前启动。
systemctl edit systemd-userdbd.service --drop-in=wait-for-rw-root
因此,我想通过with添加必要的依赖项
[Unit]
Wants=local-fs.target
After=systemd-userdbd.socket systemd-remount-fs.service local-fs.target
但这似乎在启动时创建了循环依赖。重新挂载文件系统需要很长时间,直到 systemd 超时。
- 如何确保
systemd-userdbd.service
在根文件系统变得可写后启动而不创建循环依赖? - (一个更普遍的问题)我如何分析造成循环依赖的原因?
让您的 initramfs (或内核)立即将文件系统挂载为读写,而无需经历“ro-fsck-remount-rw”舞蹈。也就是说,使用
rw
内核选项而不是ro
.(通常第一步是确保您的 initramfs 中包含“fsck”,但在您的情况下,“fsck.xfs”除了打印消息之外实际上不执行任何其他操作,因此没有它您也可以正常工作。)
systemctl list-dependencies --after
应该显示它。Systemd 会将排序循环的每个组成部分打印到日志中。以 root 身份登录并检查
journalctl -b
“deleted to break ordering cycle
”。我终于自己找到了解决方案。
systemd-userdbd.socket
触发器systemd-userdbd.service
。因此,解决方案是添加额外的依赖项systemd-userdbd.socket
,延迟套接字的启动,进而延迟相应的服务。systemctl edit systemd-userdbd.socket --drop-in=wait-for-rw-root
我创建了一个包含以下内容的插入式via但基本上这是一个上游错误,因为该服务需要可写的根文件系统,但未能将其添加到其必需条件中。