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 .
no-auto-default
, tylkoauto
. Czy masz jakieś konkretne pytanie? Moim zdaniem strona internetowa nm-online wyraźnie stwierdza, że wraz z-s
nią czeka na próbę nawiązania wszystkich automatycznych połączeń, tj. Połączenia lub awarii./etc/init.d/network
lub podobnego, ale to nie działa uniwersalnie.Możesz użyć
After
w[Unit]
sekcji, aby zdefiniować usługę, która powinna zostać uruchomiona przed uruchomieniem usługi. Na przykład, jeśli używasz NetworkManagera, możesz uruchomić usługę po uruchomieniu NetworkManagera.źródło
BindsTo
nie jest tu tak właściwe, ponieważ usługa jest zdarzeniem jednorazowym, a nie usługą trwałą (chyba że zawiera równieżExecStop
funkcję uruchamiania po awarii sieci).BindsTo
BindsTo
, np.Requires
Jeśli chcesz, aby usługa była uruchamiana tylko wtedy, gdy robi to NetworkManager.After
tak naprawdę nie robi tego - oznacza to tylko, że NM również działa, a następnie uruchom to później. Jeśli NM nie zostanie uruchomiony, usługa zostanie uruchomiona w dowolnym punkcie.After=foo
będzie nie powodują, żefoo
urządzenie, aby rozpocząć, jeśli nie jest już uruchomiony, to będzie tylko powiedzieć Systemd jak zamówić jednostek jeśli oba są uruchamiane w tym samym czasie . Używanie zarówno,After=foo
jak iWants=foo
lubRequires=foo
będzie skutkować wciągnięciem,foo
jeśli nie zostanie uruchomione, a także sprawi, że system uporządkuje jednostki poprawnie.Jeśli twoja usługa zapewnia serwer, który może biernie czekać na połączenie z kimś, użyj tego:
Twoja usługa powinna być powiązana z interfejsem wieloznacznym. Jeśli używa aktywacji gniazda (zalecane) lub jeśli jest tylko lokalna, możesz całkowicie zignorować cele sieciowe.
Jeśli Twoja usługa działa jako klient lub jest peer to peer, jest to bardziej odpowiednie:
Przed systemd 213 , network-online.target wymaga obejścia wspomnianego Pavela (musisz ręcznie włączyć usługę, która będzie czekać na uruchomienie sieci). Od wersji 213 jest to wykonywane domyślnie.
systemd-networkd-wait-online
będzie czekał na skonfigurowanie co najmniej jednego adresu (routowalnego lub lokalnego) dla interfejsu bez sprzężenia zwrotnego.Konfigurowanie systemd-networkd, NetworkManager lub równoważnego jest niezależnym zadaniem. DHCP (dla IPv4) i NDP (dla IPv6) zwykle działają od razu po wyjęciu z pudełka, ale należy je skonfigurować tak, aby wyzwoliła się precyzyjna definicja „sieci nie działa”
network-online.target
.Dokumentacja:
źródło
Będzie to miało odwrotny efekt niż chcesz. Od
man systemd.unit
:Na tej podstawie możemy zobaczyć, że właściwa opcja jednostki to „Chce” lub „Wymaga”; na podstawie ich opisu „Wymagane” jest prawdopodobnie poprawne, z dodatkiem „Po”, aby zapewnić nie tylko uruchomienie usługi sieciowej, ale także uruchomienie jej przed tym urządzeniem.
Żadna z opcji jednostek, AFAIK, nie może zawierać warunku, że rozpoczęta perquisite musiała zostać ukończona lub osiągnęła pewien punkt (sieć to prawdopodobnie usługa demona), tylko że zaczyna się pierwsza. Mając to na uwadze, możesz chcieć zrobić skrypt
Type=forking
i wprowadzić zdrowe opóźnienie (powiedzmy 30 sekund) lub coś w rodzaju pętli wyjścia z sukcesem, w tym opóźnienia, aby upewnić się, że najpierw dzierżawisz DHCP.źródło
After
w połączeniu zRequires
„w celu zapewnienia nie tylko uruchomienia usługi sieciowej, ale także jej uruchomienia przed tym urządzeniem”.After
działa razemWants
lub wRequires
ten sposób. Z drugiej strony wyraźne opóźnienia są złym nawykiem w narzędziach opartych na zależnościach, szczególnie gdy istnieje wyraźny sposób oczekiwania na konfigurację sieci określoną w dokumentacji systemowej, więc muszę nalegać na głosowanie negatywne.Użyj
After
w tej[Unit]
sekcji, aby określić, co należy uruchomić przed własną usługą. (Ta część poprzedniej odpowiedzi jest poprawna).Aby uruchomić usługę po uruchomieniu sieci, użyj celu sieciowego, który powinien obowiązywać niezależnie od tego, czy korzystasz z NetworkManager, systemu conf.d / netctl w Arch, czy innej usługi, o której systemd jest świadomy.
Krótkie spojrzenie potwierdzi, że każda inna usługa w twoim systemie, która korzysta z łączności sieciowej, zawiera tę dyrektywę.
Jest także przenośny dla dowolnej dystrybucji używającej systemd. Twój plik jednostki będzie taki sam dla Arch, Fedora, RHEL 7, przyszłych wersji Debiana ...
Usługi, które rozpoczynają połączenie sieciowe, takie jak skrypty Arch lub własne, powinny to określać w swoich plikach jednostkowych.
źródło
Wants
część, ponieważ ma skutki uboczne w innych pakietach. Popatrz na moją odpowiedź.Wants
onnetwork.target
jest dobrym pomysłem tutaj.Chciałem dodać punkt do tego artykułu. Obecnie (lato 2015) w RHEL7 / CentOS 7, network-online.target jest niepoprawnie ustawiony przed uruchomieniem sieci IPv6, więc demony, które mają
w ich definicji usługi, która również jawnie wiąże się z adresami IPv6, prawdopodobnie zostanie uruchomiona przed uruchomieniem IPv6, co spowoduje ich awarię.
źródło
/etc/init.d/network
. Jeśli ten sam problem występuje nawet w przypadku NM, byłby to dobry powód, aby złożyć żądanie funkcji. Nie sprawdziłem za pomocą RHEL / CentOS, mogę ci pomóc, jeśli jesteś zainteresowany.pracuje dla mnie.
źródło
networkd
świadczenie własnej usługi / wait-online /. Przyciąganie i zamawianie ponetwork-online.target
jest właściwym sposobem na skorzystanie z każdej usługi, która to obsługuje.