我有一个快速的虚拟机,但 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
项
[Unit]
Wants=local-fs.target
After=systemd-userdbd.socket systemd-remount-fs.service local-fs.target
但这似乎在启动时创建了循环依赖。重新挂载文件系统需要很长时间,直到 systemd 超时。
- 如何确保
systemd-userdbd.service
在根文件系统可写之后启动而不产生循环依赖? - (更普遍的问题)我如何分析造成循环依赖的原因?
答案1
如何确保在根文件系统可写之后启动 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
”。
答案2
我终于自己找到了解决方案。systemd-userdbd.socket
触发器systemd-userdbd.service
。因此,解决方案是放入额外的依赖项,从而systemd-userdbd.socket
延迟套接字的启动,进而延迟相应的服务。
systemctl edit systemd-userdbd.socket --drop-in=wait-for-rw-root
我创建了一个包含以下内容的插件
[Unit]
After=systemd-remount-fs.service local-fs.target
Wants=local-fs.target
但基本上这是一个上游错误,因为该服务需要可写的根文件系统,但未能将其添加到其必备条件中。