Howto migrować z sieci do systemd-networkd z dynamicznym przełączaniem awaryjnym

14

Systemd systemd-networkdmożna zastąpić istniejący system sieciowy w Raspbian.

Jak to działa z Raspbian na Raspberry Pi z dwoma interfejsami dla Ethernetu i WLAN? Czy mogę również zrealizować dla nich dynamiczne przełączanie awaryjne?

Ingo
źródło

Odpowiedzi:

28

Testowany na Raspberry Pi 4B z
Raspbian Buster Lite 2020-02-13 zaktualizowany 2020-04-11.
Aktualizacje wykonane za pomocą sudo apt update && sudo apt full-upgrade && sudo reboot.

Nie będzie działać z Raspbian Stretch !
Tutaj znajdziesz ostatnią przetestowaną wersję Raspbian Stretch Lite .


♦ Streszczenie

Używanie systemd-networkdzamiast domyślnego dhcpcdjest oczywiście możliwe. Ale nie we wszystkich przypadkach ma to znaczenie.

networkd to niewielka i szczupła usługa do konfigurowania interfejsów sieciowych, zaprojektowana głównie z myślą o przypadkach użycia serwerów w świecie z hotplugged i zwirtualizowaną siecią. Jego konfiguracja jest podobna pod względem ducha i poziomu abstrakcji do ifupdown, ale nie potrzebujesz żadnych dodatkowych pakietów, aby skonfigurować mosty, wiązania, vlan itp. Nie jest jeszcze zbyt odpowiedni do zarządzania sieciami WLAN; NetworkManager jest nadal o wiele bardziej odpowiedni dla takich przypadków użycia pulpitu. [1]

Ale dla raspi leżącego w pobliżu telewizora lub wzmacniacza i wykonującego swoją pracę 24 godziny na dobę przez 7 dni w tygodniu w celu strumieniowego przesyłania audio lub wideo lub aparatu itp., systemd-networkdJest dobrym wyborem. Ale musisz zrobić kompletną zmianę. Nie ma możliwości zmieszania się z networkingi / lub dhcpcd. Należy również pamiętać, że NetworkManager nie jest obsługiwany przez Raspbian po wyjęciu z pudełka.


♦ Krok 1: Przygotowanie

Dla porównania używam świeżej karty SD Raspbian Buster Lite .

Zwrócę uwagę na instalację bezgłową tylko z ssh. Jeśli używasz tego, sprawdź dwukrotnie literówki lub w przeciwnym razie utracisz połączenie z przerwanym połączeniem. Jeśli chcesz bezgłową instalację, spójrz na SSH (Secure Shell) i postępuj zgodnie z sekcją 3. Włącz SSH na bezgłowym Raspberry Pi (dodaj plik do karty SD na innym komputerze) .

Wyłącz stare rzeczy. Nie zatrzymuj żadnych usług, tylko je wyłącz! Będzie więc działać tylko przy następnym uruchomieniu. Jak to zrobić, wykonaj następujące czynności


♦ Krok 2: Skonfiguruj przewodowy interfejs Ethernet (eth0)

Utwórz ten plik ze swoimi ustawieniami. Możesz po prostu skopiować i wkleić to w jednym bloku do linii poleceń, zaczynając od cati włączając zarówno EOF (separator EOF nie otrzyma części pliku):

pi@raspberrypi: ~$ sudo -Es   # if not already done
root@raspberrypi: ~# cat >/etc/systemd/network/04-eth.network <<EOF
[Match]
Name=e*
[Network]
# to use static IP (with your settings) toggle commenting the next 8 lines.
#Address=192.168.50.60/24
#DNS=84.200.69.80 1.1.1.1
#[Route]
#Gateway=192.168.50.1
#Metric=10
DHCP=yes
[DHCP]
RouteMetric=10
EOF

♦ Krok 3: Konfiguracja interfejsu wlan (wlan0)

Utwórz ten plik ze swoimi ustawieniami:

root@raspberrypi:~ # cat >/etc/systemd/network/08-wifi.network <<EOF
[Match]
Name=wl*
[Network]
# to use static IP (with your settings) toggle commenting the next 8 lines.
#Address=192.168.50.61/24
#DNS=84.200.69.80 1.1.1.1
#[Route]
#Gateway=192.168.50.1
#Metric=20
DHCP=yes
[DHCP]
RouteMetric=20
EOF

Konfiguracja wpa_supplicant z tym plikiem i Twoich ustawień country=, ssid=a psk=i włączyć go:

root@raspberrypi:~ # cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE

network={
    ssid="TestNet"
    psk="realyNotMyPassword"
    key_mgmt=WPA-PSK
    proto=RSN WPA
}
EOF

root@raspberrypi:~ # chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
root@raspberrypi:~ # systemctl disable wpa_supplicant.service
root@raspberrypi:~ # systemctl enable [email protected]
root@raspberrypi:~ # rfkill unblock 0
root@raspberrypi:~ # exit
root@raspberrypi:~ $

Uruchom ponownie i powodzenia ;-)

Możliwe, że RasPi otrzyma nowe adresy IP, więc być może będziesz musiał na nie spojrzeć przy następnym połączeniu z ssh .


♦ Krok 4: Łączenie interfejsu przewodowego i Wi-Fi w celu przełączenia awaryjnego

Powinieneś mieć oba interfejsy skonfigurowane i działające jak opisano powyżej. Nie ma problemu, gdy oba interfejsy są uruchomione. Jądro najpierw użyje interfejsu z najniższą metryką . Tutaj najpierw użyty zostanie interfejs Ethernet. Ma to jednak wielką wadę. Jak widać, ip -4 -brief addrkażdy interfejs ma swój własny adres IP. Jeśli jądro przełącza interfejs z powodu awarii jednego z nich, używa również nowego źródłowego adresu IP. Spowoduje to zerwanie wszelkiej ustanowionej pełnej komunikacji TCP, np. Ssh, streaming, sesje logowania i tak dalej. Możesz użyć nowego połączenia ze zmienionego źródłowego adresu IP, ale stare połączenia utknęły. Tak naprawdę nie tego chcemy.

Rozwiązaniem tego problemu jest wiązanie . Tworzymy interfejs tymczasowy bond0, który nie zmienia jego ustawień. Interfejs przewodowy i Wi-Fi przełączy się na bond0.

Najpierw wyłącz pojedyncze pliki sieciowe Ethernet i Wi-Fi:

pi@raspberrypi:~ $ sudo -Es
root@raspberrypi:~ # cd /etc/systemd/network/
root@raspberrypi:~ # mv 04-eth.network 04-eth.network~
root@raspberrypi:~ # mv 08-wifi.network 08-wifi.network~

Następnie skonfiguruj łączenie z tymi czterema plikami:

root@raspberrypi:~ # cat >/etc/systemd/network/02-bond0.netdev <<EOF
[NetDev]
# status: cat /proc/net/bonding/bond0
Name=bond
Kind=bond
[Bond]
Mode=active-backup
# primary slave is defined in *eth.network
MIIMonitorSec=500ms
MinLinks=1
EOF

root@raspberrypi:~ # cat >/etc/systemd/network/12-bond0-add-eth.network <<EOF
[Match]
Name=e*
[Network]
Bond=bond0
PrimarySlave=yes
EOF

root@raspberrypi:~ # cat >/etc/systemd/network/16-bond0-add-wifi.network <<EOF
[Match]
Name=wl*
[Network]
Bond=bond0
EOF

root@raspberrypi:~ # cat >/etc/systemd/network/20-bond0-up.network <<EOF
[Match]
Name=bond0
[Network]
# to use static IP (with your settings) toggle commenting the next 4 lines.
DHCP=yes
#Address=192.168.50.60/24
#Gateway=192.168.50.1
#DNS=84.200.69.80 1.1.1.1
EOF

Ale to nie jest cała historia. systemd-networkd sprawdza, czy wszystkie interfejsy są uruchomione, przed kontynuowaniem usług zależnych od uruchamiania. Dzięki wiązaniu mamy interfejsy slave (eth0, wlan0), które nigdy nie sygnalizują, że działają. Jest to tylko interfejs obligacji, który pojawia się, jeśli przynajmniej jeden z jego niewolników jest podłączony. Sprawdzanie zakończy się niepowodzeniem z błędami i długim oczekiwaniem podczas uruchamiania. Aby to zrobić, musisz zmodyfikować systemd-networkd-wait-online.service. Jak to zrobić, postępuj zgodnie z instrukcjami na

Po zakończeniu nadszedł czas na ponowne uruchomienie.

Możliwe, że RasPi otrzyma nowy adres IP, więc być może będziesz musiał na niego spojrzeć przy następnym połączeniu z ssh.

Następnie możesz sprawdzić status wiązania:

pi@raspberrypi:~ $ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 500
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: dc:a6:32:4c:08:1b
Slave queue ID: 0

Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: dc:a6:32:4c:08:1c
Slave queue ID: 0

Testowanie wiązania: powyżej statusu wiązania zobaczysz, że Currently Active Slave:zmieni się i nie MII Status:działa.

Jeśli jesteś bez głowy, nie łącz downoba interfejsy razem ;-)

pi@raspberrypi:~ $ ip addr
pi@raspberrypi:~ $ sudo ip link set eth0 down
pi@raspberrypi:~ $ sudo ip link set eth0 up
pi@raspberrypi:~ $ sudo ip link set wlan0 down
pi@raspberrypi:~ $ sudo ip link set wlan0 up

Bądź cierpliwy po ustawieniu wlan0 w górę. Ponowne połączenie z routerem i zarządzanie wiązaniami może trochę potrwać. Tym razem sshnie będzie odpowiedzi.

Aby uzyskać bardziej dogłębną analizę łączenia, możesz zajrzeć do trybu dynamicznego przełączania awaryjnego sieci, nadając priorytet Wi-Fi zamiast sieci Ethernet .


referencje:
[1] /usr/share/doc/systemd/README.Debian.gz
[2] man systemd.netdev
[3] man systemd.network
[4] https://wiki.debian.org/Bonding
[5] https://www.kernel.org/doc/Documentation/networking/bonding.txt

Ingo
źródło
Uwaga dotycząca pierwszego cytatu do góry: Raspbian nigdy nie używał NetworkManagera. Jest to raczej artefakt Fedory i systemów pochodnych (które było pierwszym miejscem, w którym systemd, projekt wspierany przez Redhat, został wdrożony).
Złotowłosa
Dotyczy również innych systemów opartych na Debianie, niekoniecznie działających na ARM :) Dziękujemy za zwięzłe wyjaśnienie.
TCB13
To działało dla mnie na odcinku, ale na buster napotkałem problem, że moje urządzenie nie może rozwiązać żadnej domeny. Wszelkie pomysły, co może być przyczyną?
user5950
@ user5950 Może coś się zmieniło w Buster? Spojrzę na to. Chwilkę cierpliwości.
Ingo
@Ingo Dziękujemy za szybką powtórkę. Mógłbym rozwiązać problem, dodając wiersz DNS=192.168.1.1do /etc/systemd/network/04-eth.network. (Używam konfiguracji ze statycznym
adresem
4

Aby opracować odpowiedź z @Ingo: rozważ skorzystanie z linku

ln -s /run/systemd/resolve/stub-resolv.conf resolv.conf

zamiast linku do /run/systemd/resolve/resolv.conf. To włącza „zintegrowany” kod pośredniczący DNS i włącza takie funkcje, jak serwer DNS dla interfejsu, co może być ważne, jeśli używasz sieci VPN, które zapewniają swojemu serwerowi DNS niepubliczne wpisy.

Robert James
źródło
Bardzo interesujące, dziękuję za opinie. Czy jest jakaś dokumentacja i / lub źródła tego? Jeśli tak, edytuj swoją odpowiedź (korzystając z linku poniżej) i dodaj ją tam.
Ingo