如何确保在根文件系统可写之后启动 system-userdbd.service 而不产生循环依赖?

如何确保在根文件系统可写之后启动 system-userdbd.service 而不产生循环依赖?

我有一个快速的虚拟机,但 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 超时。

  1. 如何确保systemd-userdbd.service在根文件系统可写之后启动而不产生循环依赖?
  2. (更普遍的问题)我如何分析造成循环依赖的原因?

答案1

如何确保在根文件系统可写之后启动 systemd-userdbd.service 而不会产生循环依赖?

让您的 initramfs(或内核)立即将文件系统挂载为可读写,而无需经过“ro-fsck-remount-rw”过程。也就是说,使用内核rw选项而不是 来启动ro

(通常第一步是确保您的 initramfs 中包含“fsck”,但在您的情况下,“fsck.xfs”除了打印消息之外没有执行任何其他操作,因此没有它您也可以做得很好。)

(更普遍的问题)我如何分析造成循环依赖的原因?

systemctl list-dependencies --after应该显示它。

Systemd 会将排序循环的每个组件打印到日志中。以 root 身份登录并检查journalctl -bdeleted 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

但基本上这是一个上游错误,因为该服务需要可写的根文件系统,但未能将其添加到其必备条件中。

相关内容