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.targetprostu gwarantuje, że usługa sieciowa została uruchomiona, a nie faktyczną konfigurację. Aby network-online.targetto 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.targetdziała zgodnie z oczekiwaniami (lub przynajmniej możesz użyć network.target).
Obecna wersja NetworkManager oferuje to, NetworkManager-wait-online.serviceco jest pobierane przez, network-online.targeta 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/networkusługa w Fedorze, zgodnie z interpretacją bieżących wersji systemd, blokuje, network.targeta zatem pośrednio bloki network-online.targeti 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.targetistnieje 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.servicewyraź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.serviceani NetworkManager-wait-online.serviceani żadnych innych konkretnych usług. Zamiast tego wszystkie usługi zarządzania siecią powinny zamawiać się przed network.targeti 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.targeta 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.targetnawet 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 Requisitew 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 wantskatalogu 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 .