"Vorher" und "wollen" für denselben systemd-Dienst?

10

In diesem Beispiel einer systemd-Einheitendatei:

# systemd-timesyncd.service
...

Before=time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
Wants=time-sync.target

systemd-timesyncd.servicesollte vorher beginnen time-sync.target . Dies definiert eine Ordnungsabhängigkeit .

Aber gleichzeitig systemd-timesyncd.service will time-sync.target . So time-sync.targetist es Anforderungsabhängigkeit

Was ist der Anwendungsfall für diese Beziehung und warum stehen sie nicht in einem Konflikt miteinander?

TheMeaningfulEngineer
quelle

Antworten:

13

Der Anwendungsfall dieser doppelten Beziehung ähnelt einer "bereitgestellten" Beziehung. systemd-timesyncdBietet einen Zeitsynchronisationsdienst, der alle Abhängigkeiten einer Einheit erfüllt time-sync.target. Es muss vorher gestartet werden, time-sync.targetda es für jeden Dienst erforderlich ist, der auf Zeitsynchronisation beruht, und es möchte, time-sync.targetweil jede Einheit, die auf Zeitsynchronisation beruht, zusammen mit dem systemd-timesyncdDienst gestartet werden sollte .

Ich denke, das Missverständnis kommt von Ihrer Interpretation von "Wünschen". Die "will" -Relation in systemd ist keine Abhängigkeit: systemd-timesyncdmuss nicht time-syncfunktionieren. Es ist eine "Start zusammen mit" -Beziehung: Sie besagt, dass die konfigurierende Einheit ( systemd-timesyncd.service) möchte, dass die aufgelisteten Einheiten ( time-sync.target) mit ihr beginnen.

Siehe auch Welcher Dienst bietet time-sync.target in systemd?

Stephen Kitt
quelle
5

Mit diesem Mechanismus soll sichergestellt werden, dass Bestellbeziehungen hergestellt werden können, die jedoch nur wirksam werden, wenn dies erforderlich ist.

time-sync.targetist ein Bestellmeilenstein. Alle Dienste , die „Zeitsynchronisation“ liefern angeben , dass sie Beforedas time-sync.target, so dass das Ziel wird nur bereit , wenn „Zeitsynchronisation“ in Kraft ist. Alle Dienste , die „Zeitsynchronisation“ werden wirksam , wenn sie laufen angeben , dass sie brauchen Afterdas time-sync.target.

Wenn letztere auch eine WantsBeziehung zu diesem Ziel hätten, würden sie immer von diesem geordnet werden, da dies immer in der Reihe der Dinge enthalten wäre, die in Ordnung gebracht werden.

Dies wird als suboptimal angesehen, wenn tatsächlich kein konkreter "Zeitsynchronisations" -Dienst vorhanden ist. und die systemd Leute denken, dass eine solche Anordnung in einem solchen Fall nicht in Kraft sein sollte. Vielmehr sollten Dienstleistungen so bestellt werden, als wären time-sync.targetsie nicht vorhanden, sodass einige von ihnen viel früher gestartet werden können, wenn dies ihre "natürliche" Position ohne den Meilenstein ist.

Die Lösung ist time-sync.target, eigentlich nicht da zu sein. Es wird nicht von den Diensten gewünscht, die voraussichtlich starten, nachdem die Zeitsynchronisation verfügbar ist. Es existiert also nicht in der Menge der bestellten Dinge, wenn nur diese Dienste gestartet werden. Es wird nur in den Satz aufgenommen, wenn ein tatsächlicher "Zeitsynchronisations" -Dienst gestartet wird, wobei dieser (und nicht die Client-Dienste) die WantsBeziehung hat, die ihn einbringt.

Ziele müssen nicht unbedingt Sammlungen von Diensten sein. Sie können auch Meilensteine ​​bestellen.

Es gibt eine ganze Reihe solcher reinen Meilensteine ​​in systemd und anderswo. Das name-servicesZiel in der Service-Bundle-Sammlung des Nosh-Toolset ist ein ähnlicher Meilenstein für die reine Bestellung.

Weiterführende Literatur

  • Jonathan de Boyne Pollard (2018). system-control. Nosh Guide . Software.
JdeBP
quelle
0

time-sync.target ist eine Art Flag im System, so dass Dienste, die von einer korrekten Zeit abhängen, nicht von systemd-timesyncd, ntpd usw. abhängen müssen.

Der BeforeEintrag weist systemd an, systemd-timesyncd und dann time-sync.target zu starten (dies dient nur zur Bestellung). Das Wantssagt ihm, dass er das Flag tatsächlich setzen soll.

Uwe Ohse
quelle