So migrieren Sie mit dynamischem Failover vom Netzwerk zu systemd-networkd


13

Systemds systemd-networkdkönnen verwendet werden, um das vorhandene Netzwerksystem auf Raspbian zu ersetzen.

Wie funktioniert es mit Raspbian auf einem Raspberry Pi mit zwei Schnittstellen für Ethernet und WLAN? Kann ich auch ein dynamisches Failover für sie realisieren?

Antworten:


26

Getestet auf einem Raspberry Pi 4B mit
Raspbian Buster Lite 2020-02-05 aktualisiert am 2020-02-13.
Raspbian Buster Lite 2019-07-10 aktualisiert am 2019-08-15.
Updates durchgeführt mit sudo apt update && sudo apt full-upgrade && sudo reboot.

Es wird nicht mit Raspbian Stretch funktionieren !
Hier finden Sie die letzte getestete Revision für Raspbian Stretch Lite .


Die Verwendung systemd-networkdanstelle der Standardeinstellung dhcpcdist natürlich möglich. Aber es ist nicht in allen Fällen sinnvoll.

networkd ist ein kleiner und schlanker Dienst zum Konfigurieren von Netzwerkschnittstellen, der hauptsächlich für Serveranwendungsfälle in einer Welt mit Hotplugged- und virtualisierten Netzwerken entwickelt wurde. Die Konfiguration ähnelt in Geist und Abstraktionsebene der von ifupdown, Sie benötigen jedoch keine zusätzlichen Pakete, um Bridges, Bonds, VLAN usw. zu konfigurieren. Es ist noch nicht sehr gut für die Verwaltung von WLANs geeignet. NetworkManager ist für solche Desktop-Anwendungsfälle noch viel besser geeignet. [1]

Aber für einen Raspi, der in der Nähe eines Fernsehers oder Verstärkers liegt und rund um die Uhr arbeitet, um Audio oder Video oder eine Kamera usw. zu streamen, systemd-networkdist dies eine gute Wahl. Sie müssen jedoch einen vollständigen Wechsel vornehmen. Es gibt keine Möglichkeit, sich mit networkingund / oder zu verwechseln dhcpcd.


♦ Schritt 1: Vorbereitung

Als Referenz verwende ich eine frisch geflashte SD-Karte von Raspbian Buster Lite 2019-07-10 .

Ich werde auf eine kopflose Installation nur mit ssh achten. Wenn Sie dies verwenden, überprüfen Sie die Tippfehler oder sonst, da Sie mit einer unterbrochenen Verbindung verloren gehen. Wenn Sie eine Headless-Installation wünschen, schauen Sie sich SSH (Secure Shell) an und folgen Sie Abschnitt 3. Aktivieren Sie SSH auf einem Headless Raspberry Pi (fügen Sie eine Datei zur SD-Karte auf einem anderen Computer hinzu) .

Zur Fehlerbehebung beim Herunterfahren oder zum Überprüfen von Nachrichten aus früheren Startvorgängen können Sie die permanente Protokollierung in Journald für Nachrichten von systemd [1] aktivieren. Da es große Protokolldateien erzeugt und Speicherplatz ein Problem sein kann, empfehle ich, es nur bei Bedarf zu aktivieren. systemd-networkd benötigt es nicht und die Protokollierung der aktuellen Sitzung ist immer verfügbar.

pi@raspberrypi: ~$ sudo mkdir -p /var/log/journal
pi@raspberrypi: ~$ sudo systemd-tmpfiles --create --prefix /var/log/journal

Deaktiviere das alte Zeug. Stoppen Sie keinen Dienst, deaktivieren Sie sie nur! Es wird also erst beim nächsten Start wirksam.

pi@raspberrypi: ~$ sudo -Es

In /etc/resolvconf.confEinsatz dieser Zeilen.

# Set to NO to disable resolvconf from running any subscribers. Defaults to YES.
resolvconf=NO

Deaktivieren Sie dann das klassische Debian-Netzwerk, das mit Dateien verwaltet wird, /etc/network/interfacesund deaktivieren Sie die Standard-Raspbian- dhcpcdNetzwerkverwaltung. Wir maskieren es so, dass sie vollständig deaktiviert sind und nicht von anderen Diensten gestartet werden können.

root@raspberrypi: ~# systemctl mask networking.service
root@raspberrypi: ~# mv /etc/network/interfaces /etc/network/interfaces~
root@raspberrypi: ~# systemctl mask dhcpcd.service

Und aktivieren Sie systemd-networkd:

root@raspberrypi: ~# systemctl enable systemd-networkd.service
root@raspberrypi: ~# systemctl enable systemd-resolved.service
root@raspberrypi: ~# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

♦ Schritt 2: Richten Sie die kabelgebundene Ethernet-Schnittstelle ein (eth0)

Erstellen Sie diese Datei mit Ihren Einstellungen. Sie können dies einfach kopieren und in einen Block in Ihre Befehlszeile einfügen, beginnend mit catund einschließlich beider EOF (Trennzeichen EOF wird nicht Teil der Datei):

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

root@raspberrypi: ~# exit
pi@raspberrypi: ~$

Neustart, aber nur wenn du ein Ethernet-Kabel angeschlossen hast ;-)

Es ist möglich, dass das RasPi eine neue IP-Adresse erhält, sodass Sie möglicherweise nach der nächsten Verbindung mit ssh suchen müssen .


♦ Schritt 3: WLAN-Schnittstelle einrichten (wlan0)

Erstellen Sie diese Datei mit Ihren Einstellungen:

pi@raspberrypi:~ $ sudo -Es
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

root@raspberrypi:~ #

Richten Sie wpa_supplicant mit dieser Datei und Ihren Einstellungen für ssid=und ein psk=und aktivieren Sie sie:

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 wpa_supplicant@wlan0.service
root@raspberrypi:~ # rfkill unblock 0
root@raspberrypi:~ # exit
root@raspberrypi:~ $

Starten Sie neu, wenn Sie eine WLAN-Verbindung haben. Die meisten von euch werden haben. Viel Glück ...

Es ist möglich, dass das RasPi eine neue IP-Adresse erhält, sodass Sie möglicherweise nach der nächsten Verbindung mit ssh suchen müssen .


♦ Schritt 4: Verkabelung und WLAN-Schnittstelle für Failover verbinden

Sie sollten beide Schnittstellen wie oben beschrieben einrichten und ausführen. Es ist kein Problem, wenn beide Schnittstellen aktiv sind. Der Kernel verwendet zuerst die Schnittstelle mit der niedrigsten Metrik . Hier wird zuerst die Ethernet-Schnittstelle verwendet. Dies hat jedoch einen großen Nachteil. Wie Sie sehen ~$ ip addrkönnen, hat jede Schnittstelle ihre eigene IP-Adresse. Wenn der Kernel die Schnittstelle wechselt, weil eine ausgefallen ist, verwendet er auch seine neue Quell-IP-Adresse. Dadurch wird jede etablierte zustandsbehaftete TCP-Kommunikation unterbrochen, z. B. SSH, Streaming, Anmeldesitzungen usw. Sie können eine neue Verbindung von der geänderten Quell-IP-Adresse verwenden, aber die alten Verbindungen bleiben hängen. Das wollen wir nicht wirklich.

Die Lösung dieses Problems ist das Kleben . Wir erstellen eine Zwischenschnittstelle bond0, deren Einstellungen nicht geändert werden. Die Kabel- und WLAN-Schnittstelle wechselt zu bond0.

Deaktivieren Sie zuerst die einzelnen Ethernet- und WLAN-Netzwerkdateien:

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~

Richten Sie dann die Verbindung mit diesen vier Dateien ein:

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

root@raspberrypi:~ # exit
pi@raspberrypi:~ $

Jetzt ist es Zeit, neu zu starten.

Es ist möglich, dass das RasPi eine neue IP-Adresse erhält, sodass Sie möglicherweise nach der nächsten Verbindung mit ssh suchen müssen.

Dann können Sie den Verbindungsstatus überprüfen:

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): 1000
Down Delay (ms): 1000

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: b8:27:eb:53:bd:de
Slave queue ID: 0

Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: b8:27:eb:06:e8:8b
Slave queue ID: 0

Testbindung: Mit dem obigen Bindungsstatus sehen Sie, dass sich die Bindung Currently Active Slave:ändert und die nicht mehr MII Status:funktioniert.

Wenn du kopflos bist, nicht downbeide Schnittstellen zusammen ;-)

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

Seien Sie geduldig, nachdem Sie wlan0 eingerichtet haben. Es kann einige Zeit dauern, bis ich mich wieder mit dem Router verbunden und das Bonding verwaltet habe. Diese Zeit sshwird nicht funktionieren.

Für eine eingehendere Überprüfung der Bindung sehen Sie sich möglicherweise das dynamische Netzwerk-Failover an, bei dem WLAN Vorrang vor Ethernet hat .


♦ Schritt 5: Aufräumen

Lösche das alte Zeug:

pi@raspberrypi:~ $ sudo apt --autoremove purge openresolv
pi@raspberrypi:~ $ sudo apt --autoremove purge ifupdown
pi@raspberrypi:~ $ sudo apt --autoremove purge dhcpcd5
pi@raspberrypi:~ $ sudo apt --autoremove purge isc-dhcp-client isc-dhcp-common


Referenzen:
[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


Hinweis zum ersten Zitat oben: Raspbian hat NetworkManager nie verwendet. Es ist eher ein Artefakt von Fedora und abgeleiteten Systemen (dies war der erste Ort, an dem systemd, ein von Redhat unterstütztes Projekt, bereitgestellt wurde).
Goldlöckchen

Gilt auch für andere Debian-basierte Systeme, die nicht unbedingt auf ARM ausgeführt werden :) Vielen Dank für die kurze Erklärung.
TCB13

Dies funktionierte für mich auf der Strecke, aber auf Buster stieß ich auf das Problem, dass mein Gerät keine Domain auflösen kann. Irgendwelche Ideen, was die Ursache sein könnte?
user5950

@ user5950 Vielleicht hat sich mit Buster etwas geändert? Ich werde es mir ansehen. Einen kleinen Moment bitte.
Ingo

@Ingo Danke für die schnelle Wiederholung. Ich könnte das Problem lösen, indem ich die Zeile DNS=192.168.1.1zu hinzufüge /etc/systemd/network/04-eth.network. (Ich verwende ein Setup mit statischer IP)…
user5950

4

Um die Antwort von @Ingo zu erläutern: Verwenden Sie bitte den Link

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

anstelle des Links zu /run/systemd/resolve/resolv.conf. Dies aktiviert den "integrierten" DNS-Stub und aktiviert Dinge wie den DNS-Server pro Schnittstelle, die wichtig sein können, wenn Sie VPNs verwenden, die ihren eigenen DNS-Server mit nicht öffentlichen Einträgen versehen.


Sehr interessant, danke für das Feedback. Gibt es Unterlagen und / oder Quellen dafür? Wenn ja, bearbeiten Sie bitte Ihre Antwort (über den Link darunter) und fügen Sie sie dort hinzu.
Ingo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.