Systemd systemd-networkd
moż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?
Systemd systemd-networkd
moż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?
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 .
Używanie systemd-networkd
zamiast domyślnego dhcpcd
jest 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-networkd
Jest dobrym wyborem. Ale musisz zrobić kompletną zmianę. Nie ma możliwości zmieszania się z networking
i / lub dhcpcd
. Należy również pamiętać, że NetworkManager nie jest obsługiwany przez Raspbian po wyjęciu z pudełka.
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
Utwórz ten plik ze swoimi ustawieniami. Możesz po prostu skopiować i wkleić to w jednym bloku do linii poleceń, zaczynając od cat
i 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
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 .
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 addr
każ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 down
oba 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 ssh
nie 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
DNS=192.168.1.1
do/etc/systemd/network/04-eth.network
. (Używam konfiguracji ze statycznymAby opracować odpowiedź z @Ingo: rozważ skorzystanie z linku
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.źródło