如何了解 systemd 单元生命周期?

如何了解 systemd 单元生命周期?

当主机没有外部网络时,出现了 sshd 无法在虚拟机上启动的奇怪情况。结果我使用的 dev linux 镜像(不要认为这是一个奇怪的现象,它在 arch、ubuntu、debian、gentoo、rhel... 上是一样的)有一些单元文件创建了一个基于Before=而不是After=依赖的链timesyncd运行成功。没有什么可以告诉我那些Beforeed 依赖关系。

#sshd.service
[service]
After=network.target

#pacman-init.service
Before=sshd.service cloud-final.service archlinux-keyring-wkd-sync.service
After=time-sync.target
ConditionFirstBoot=yes

因此,在首次启动后,每当我使用无法访问 ntp 服务器的主机启动这台机器时,systemd 都会对我进行加气。

systemctl start sshd<-什么也没发生。没有失败。没有超时。任何日志上都没有任何内容!等了3个小时,仍然不知道发生了什么。

systemctl list-dependencies sshd<- 没有提及影响服务!

systemctl list-dependencies --all sshd<- all 选项似乎除了不相关的切片信息之外没有添加任何内容。

然后上线将完成 ntp 更新,满足pacman-init.serviceAfter=time-sync.target看到ConditionFirstBoot=yes不再适用,忽略pacman-init并启动sshd.service。叹。

在不上网的情况下,我必须了解解析处理单元的问题,以便Before将不相关的服务附加到相关服务的After属性中,并且我可以了解它们。

for u in `systemctl show sshd | grep After= | cut -d= -f2`; do systemctl status $u; done

那就是仅有的看看 pacman-init.service 是一个依赖项并保存着东西。

所以,我的问题不是如何解决这些问题。问题是,作为一名 systemd 操作员,我到底应该如何获得有关此的信息?


编辑:

另一个 systemd 糟糕的用户体验。

系统休眠。 2076年从沉睡中归来!

$ timedatact
              Local time: Sun 2076-09-20 11:14:27 UTC
           Universal time: Sun 2076-09-20 11:14:27 UTC
                 RTC time: Fri 2023-05-12 17:39:40
                Time zone: UTC
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

太棒了,它知道 RTC 时钟是分钟从它醒来的那一刻起,但由于某种原因,它决定将时钟设置为 2076 年。

没有从 rtc 设置时钟的命令...

我启用网络并尝试天真的restart systemd-timedated.当然,它失败了,并且完全没有任何关于原因的信息。甚至没有它想要做的事情。只是失败了。

让我们看看它试图运行什么。哦,看。单元文件是二进制文件。谢谢什么也没有。

让我们尝试一下在整个时间设置混乱中唯一可用的调试命令(就像它并不那么重要,对吧?)

timedatectl show-timesync -a --monitor
Failed to parse bus message: No such file or directory

哪个文件?想知道干嘛,就受systemd的苦吧! ...以防万一,我确保文档中提到的所有常用配置文件都可用并且可以通过原始内容读取。同样的错误。

伟大的可用性解决方法:手动重新输入从硬件时钟获得的日期! ...并且要快点,以免时钟偏差更大。或者在单一脚本上浪费更多时间。

timedatectl set-time '...'

相关内容