Zależności konfiguracji systemowej sieci
Bardzo łatwo jest wpłynąć na kolejność jednostek systemd. Z drugiej strony musisz uważać na to, co gwarantuje ukończona jednostka.
Skonfiguruj swoją usługę
W obecnych systemach zamawianie po network.target
prostu gwarantuje, że usługa sieciowa została uruchomiona, a nie faktyczną konfigurację. Aby network-online.target
to osiągnąć, musisz złożyć zamówienie później i pociągnąć.
[Unit]
Wants=network-online.target
After=network-online.target
Aby zachować zgodność ze starszymi systemami, konieczne może być zamówienie również po network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
To jest dla pliku jednostkowego twojej usługi i dla systemd.
Wdrożenie w aktualnych wersjach oprogramowania
Teraz musisz się upewnić, że network-online.target
działa zgodnie z oczekiwaniami (lub przynajmniej możesz użyć network.target
).
Obecna wersja NetworkManager oferuje to, NetworkManager-wait-online.service
co jest pobierane przez, network-online.target
a zatem przez twoją usługę. Ta specjalna usługa zapewnia, że usługa będzie czekać, aż wszystkie połączenia skonfigurowane do automatycznego uruchomienia zostaną pomyślnie zakończone, zakończone niepowodzeniem lub przekroczą limit czasu.
Obecna wersja systemd-networkd blokuje twoją usługę, dopóki wszystkie urządzenia nie zostaną skonfigurowane zgodnie z żądaniem. Jest to łatwiejsze, ponieważ obecnie obsługuje tylko konfiguracje, które są stosowane podczas rozruchu (a dokładniej czas uruchomienia `systemd-networkd.service).
Ze względu na kompletność, /etc/init.d/network
usługa w Fedorze, zgodnie z interpretacją bieżących wersji systemd, blokuje, network.target
a zatem pośrednio bloki network-online.target
i twoją usługę. To przykład implementacji opartej na skryptach.
Jeśli implementacja, niezależnie od tego, czy jest oparta na daemonie, czy na skryptach, zachowuje się jak jedna z powyższych usług zarządzania siecią, opóźni uruchomienie usługi do momentu pomyślnego ukończenia konfiguracji sieci, niepowodzenia z uzasadnionego powodu lub przekroczenia limitu czasu po rozsądnym czasie. ramka do ukończenia.
Możesz sprawdzić, czy netctl działa w ten sam sposób i czy ta informacja byłaby cennym dodatkiem do tej odpowiedzi.
Implementacje w starszych wersjach oprogramowania
Nie sądzę, żebyś zobaczył wystarczająco starą wersję systemd, w której nie działałoby to dobrze. Ale możesz sprawdzić, czy przynajmniej network-online.target
istnieje i że zostanie zamówiony później network.target
.
Poprzednio NetworkManager gwarantował, że zostanie zastosowane co najmniej jedno połączenie. I nawet aby to zadziałało, trzeba by to NetworkManager-wait-online.service
wyraźnie włączyć . Zostało to od dawna naprawione w Fedorze, ale zostało niedawno zastosowane wcześniej.
systemctl enable NetworkManager-wait-online.service
Uwagi dotyczące implementacji network.target i network-online.target
Nie powinny kiedykolwiek trzeba zrobić oprogramowania zależą NetworkManager.service
ani NetworkManager-wait-online.service
ani żadnych innych konkretnych usług. Zamiast tego wszystkie usługi zarządzania siecią powinny zamawiać się przed network.target
i opcjonalnie network-online.target
.
Prosta usługa zarządzania siecią oparta na skryptach powinna zakończyć konfigurację sieci przed wyjściem i powinna zamówić się przed, network.target
a zatem pośrednio przed network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Usługa zarządzania siecią oparta na demonie powinna również zamówić się wcześniej, network.target
nawet jeśli nie jest to bardzo przydatne.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Usługa, która czeka na zakończenie działania demona, powinna zamówić się po określonej usłudze i wcześniej network-online.target
. Powinien być używany Requisite
w usłudze demona, aby natychmiast przestał działać, jeśli dana usługa zarządzania siecią nie jest używana.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Pakiet powinien zainstalować dowiązanie symboliczne do usługi oczekiwania w wants
katalogu network-online.target
, aby było pobierane przez usługi, które chcą czekać na skonfigurowaną sieć.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Powiązana dokumentacja
Uwagi końcowe
Mam nadzieję, że nie tylko pomogłem odpowiedzieć na twoje pytanie w momencie, w którym je zadałeś, ale również przyczyniłem się do poprawy sytuacji w dystrybucji upstream i Linuksie, dzięki czemu mogę teraz udzielić lepszej odpowiedzi niż było to możliwe w momencie pisania oryginalnej .