Debian systemd network-online.target nie działa?


24

Próbuję utworzyć usługę systemową na Debian Jessie. Potrzebuję go rozpocząć po network-online.targetosiągnięciu.

Problemem są network-online.targetpożary w tym samym czasie network.target, kiedy moje interfejsy nie są jeszcze skonfigurowane, właśnie uruchomiłem zapytanie DHCP.

Wygląda na to, że ten problem jest specyficzny dla Debiana, ponieważ wykorzystuje starszą konfigurację sieci.

Jak obejść ten problem lub jak sprawić, by network-online.targetdziałał?


Jaka jest wydajność systemctl list-dependencies network-online.target? Należy również pamiętać, że network-online.targetmoże to nie oznaczać, że istnieje dostęp do Internetu. Zobacz stronę, aby uzyskać więcej informacji.
saiarcot895

Dane wyjściowe polecenia network-online.target ● └─systemd-networkd-wait-online.service brzmią : Przeczytałem już tę stronę, rozumiem tam podstawową koncepcję, ale nadal bardzo dziwne jest brak określonego punktu, w którym można uruchomić usługi krytyczne dla sieci. Przynajmniej może poczekać na prawidłowe przypisanie DHCP.
10robinho

Oznacza to, że network-online.targetzależy tylko od systemd-networkd-wait-online.servicepowiedzenia, że ​​jest gotowy. To nie zależy od NetworkManagera, który mówi, że jest gotowy, ani też nie sprawdza, czy ifupwszystkie linki zostały pomyślnie wyświetlone (jeśli użyjesz tej metody do skonfigurowania sieci). Ubuntu, z drugiej strony, zależy od ifupi NetworkManager, ale nie dla systemd-networkd-wait-online..
saiarcot895

Jak konfigurujesz sieć: pliki /etc/network/interfacessystemowe .networklub NetworkManager?
saiarcot895

Masz rację network-online.targeti network.targetsą uruchamiane zaraz po ifup. Używam domyślnej wersji Debiana, więc /etc/network/interfacesz adresem dhcp. Wygląda na to, że networkd może być lepszym rozwiązaniem, ale nie jest łatwe do wdrożenia.
10robinho,

Odpowiedzi:


18

Ponieważ używasz /etc/network/interfaces, potrzebujesz systemowej usługi do monitorowania statusu każdego interfejsu. Sprawdź, czy masz /lib/systemd/system/ifup-wait-all-auto.service(zainstalowany przez ifupdownpakiet w Ubuntu 15.04). Jeśli nie, utwórz /etc/systemd/system/ifup-wait-all-auto.servicei wklej następujące elementy:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

Jest to plik serwisowy obecny w systemie Ubuntu 15.04, ale z [Install]dodaną sekcją, aby ułatwić trochę. Mam nadzieję, że zachowanie ifupw Ubuntu 15.04 jest takie samo jak zachowanie ifupw Debian Jessie. Jeśli nie, konieczna będzie modyfikacja (szczególnie w ostatnim wierszu).

Następnie biegnij sudo systemctl enable ifup-wait-all-auto.service. Po ponownym uruchomieniu komputera powinieneś zobaczyć, że network-online.targetosiągnięto go po uruchomieniu interfejsów (przynajmniej).


Dzięki za wysiłek, pozwól mi spróbować teraz, a dam ci informację zwrotną
10robinho,

Skończyło się na nieco zmodyfikowanej wersji ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. Zależy to od hostnamesprawdzenia, czy adres IP został przypisany.
luka5z

Nie próbuj tego robić. to nie dlatego, że używa / etc / network / interfaces. To dlatego, że systemd jest tak niechlujny, a praca jest odciążana dla każdego użytkownika zamiast rozwiązywania problemu, w którym została utworzona.
Florian Heigl,

1
fwiw, ifup-wait-all-auto.servicezostała upuszczona w ifupdownwersji 0.8.5ubuntu1: ”Drop ifup-wait-all-auto.service. Zostało to zaimplementowane bardziej elegancko poprzez bezpośrednie utworzenie network-online.target Wants = networking.service. “ [
Dziennik

0

Uwaga! Właśnie wymyśliłem to na Raspbian Jessie: usuń WSZYSTKIE skomentowane linie w interfejsach sieciowych / etc / i będzie działać! Wydaje się, że to błąd analizowania =) W moim konkretnym przypadku zostawiłem komentarz iface eth0 inet dhcpi zapomniałem o tym eony temu, ale po aktualizacji do Raspbian Jessie i przebudowaniu jądra mam bardzo dziwne zachowanie: używał DHCP i odmówił wykonaj strojenie z / etc / network / interfaces. Więc usunąłem go z wszelkich komentarzy - tylko działające linie, uruchom ponownie - i to działa! NIE POTRZEBNE PATCHOWANIE / EDYCJA SKRYPTÓW!


Interesujące, muszę tego spróbować. Chociaż nie ma to większego sensu :)
10robinho

2
Czy masz jakieś referencje na ten temat? Chciałbym przeczytać raporty o błędach i zobaczyć kod błędu.
ʇsәɹoɈ

Nie, nie otworzyłem zgłoszenia błędu. Aby go odtworzyć, po prostu dodaj kilka komentarzy do /etc/network/interfacespliku - uruchomi się, jeśli nadal będzie dostępny.
Alexey Vesnin

0

Za https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ zalecanym sposobem uruchomić usługę PO sieci jest poziom jest użycie „ network-online.target ” w .service pliku:

 "After=network-online.target"
 "Wants=network-online.target"

Jednak po użyciu „ network-online.target ” i awarii mojej usługi, ponieważ sieć nie była w pełni wyrównana, odkryłem, że występuje błąd ( https://github.com/coreos/bugs/issues/1966 ): nie gwarantuje się być w 100% nieomylnym.

Rzeczywiście, gdy używane są narzędzia do dynamicznej konfiguracji sieci, takie jak „ NetworkManager ”, tak jak w tym przypadku, stan sieci nigdy nie może być w 100% precyzyjny ani przewidywalny. Najwyraźniej z linku opisującego błąd „ network-online.target ” może zachowywać się niekonsekwentnie w zależności od różnych aplikacji, z którymi jest używany.

Obejście :
Musisz przeanalizować kolejność uruchamiania usług i użyć takiej, która zaczyna się później niż „ network-online.target ”:

 systemd-analyze plot > /home/pi/graph.svg

Jest to proces iteracyjny, polegający na stopniowym zmienianiu celów na usługi późniejsze i późniejsze, dopóki nie znajdziesz takiego, który zapewnia równy poziom sieci i rozpoczęcie usługi bez błędów. W moim przypadku musiałem nawet umieścić sleep 10w swoim skrypcie usługę SystemD.


0

Kiedyś znalazłem odpowiedź na Github, która ją rozwiązała, ciągle próbując pingować serwer. Usługa jest kontynuowana tylko po wysłaniu polecenia ping:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

Zastąpiłem google.comwłasnym serwerem, ponieważ mój główny skrypt musiał się połączyć z moim serwerem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.