在这个systemd 单元文件的例子中:
# systemd-timesyncd.service
...
Before=time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
Wants=time-sync.target
systemd-timesyncd.service
应该开始之前 time-sync.target
。这定义了一个排序依赖。
但同时systemd-timesyncd.service
想要 time-sync.target
。time-sync.target
它的需求依赖也是如此
这种关系的用例是什么?为什么它们之间没有冲突?
这种双重关系的用例类似于“提供”关系。
systemd-timesyncd
提供时间同步服务,因此它满足一个单元对time-sync.target
. 它必须在之前启动,time-sync.target
因为它对于任何依赖时间同步的服务都是必需的,并且它想要time-sync.target
因为任何依赖时间同步的单元都应该与systemd-timesyncd
服务一起启动。我认为误解来自您对“想要”的解释。systemd 中的“想要”关系不是依赖关系:
systemd-timesyncd
不需要time-sync
起作用。这是一个“开始”关系:它表示配置单元 (systemd-timesyncd.service
) 希望列出的单元 (time-sync.target
) 与其一起开始。另请参阅哪个服务在 systemd 中提供 time-sync.target?
这种机制的目的是确保排序关系可以建立,但除非必要,否则不会生效。
time-sync.target
是一个订购里程碑。所有提供“时间同步”的服务都指定它们是Before
,time-sync.target
因此只有在“时间同步”生效时目标才准备就绪。所有需要“时间同步”才能在运行时生效的服务都指定它们After
是time-sync.target
.如果后者也
Wants
与该目标有关系,那么它们最终将始终被它排序,因为它总是包含在已排序的事物集中。在实际上没有具体的“时间同步”服务的情况下,这被视为次优;系统人员的想法是,这种排序在这种情况下不应该生效。相反,应该像不存在一样订购服务
time-sync.target
,如果这是它们没有里程碑的“自然”位置,则允许其中一些更早地启动。解决方案是
time-sync.target
实际上不存在。期望在时间同步可用后启动的服务不需要它。因此,如果仅启动这些服务,则它不存在于有序事物集中。仅当启动了实际的“时间同步”服务时才会将其带入集合中,并且该服务(而不是客户端服务)具有将Wants
其引入的关系。目标不一定是服务的集合。他们也可以订购里程碑。
在 systemd 和其他地方有很多这样的纯粹里程碑。
name-services
nosh 工具集的服务包集合中的目标是一个类似的纯排序里程碑。进一步阅读
system-control
. 小吃指南。软件。time-sync.target
是系统中的一种标志,因此依赖于正确时间的服务不必依赖于 systemd-timesyncd、ntpd 等。该
Before
条目告诉 systemd 启动 systemd-timesyncd,然后是 time-sync.target(这仅用于排序)。Wants
告诉它实际设置标志。