Come migrare dalla rete a systemd-networkd con failover dinamico


14

Systemd's systemd-networkdpuò essere utilizzato per sostituire il sistema di rete esistente su Raspbian.

Come funziona con Raspbian su un Raspberry Pi con due interfacce per Ethernet e WLAN? Posso anche realizzare un failover dinamico per loro?

Risposte:


28

Testato su un Raspberry Pi 4B con
Raspbian Buster Lite 2020-02-05 aggiornato il 2020-02-13.
Raspbian Buster Lite 2019-07-10 aggiornato il 15-08-2019.
Aggiornamenti effettuati con sudo apt update && sudo apt full-upgrade && sudo reboot.

Non funzionerà con Raspbian Stretch !
Qui troverai l' ultima revisione testata per Raspbian Stretch Lite .


L'utilizzo al systemd-networkdposto del default dhcpcdè ovviamente possibile. Ma non è significativo in tutti i casi.

networkd è un servizio piccolo e snello per configurare le interfacce di rete, progettato principalmente per i casi d'uso dei server in un mondo con reti hotplugged e virtualizzate. La sua configurazione è simile nello spirito e nel livello di astrazione di ifupdown, ma non sono necessari pacchetti aggiuntivi per configurare bridge, bond, vlan ecc. Non è ancora molto adatto per la gestione delle WLAN; NetworkManager è ancora molto più appropriato per tali casi d'uso del desktop. [1]

Ma per un raspi che si trova vicino a una TV o un amplificatore e fa il suo lavoro 24 ore su 24, 7 giorni su 7 per lo streaming di audio o video o per una fotocamera, ecc., systemd-networkdÈ una buona scelta. Ma devi fare un passaggio completo. Non c'è modo di mescolare con networkinge / o dhcpcd.


♦ Passaggio 1: Preparazione

Per riferimento uso una nuova SD card flashizzata di Raspbian Buster Lite 2019-07-10 .

Avrò attenzione ad un'installazione senza testa solo con ssh. Se lo stai usando, ricontrolla gli errori di battitura o così altrimenti ti perdi con una connessione interrotta. Se si desidera un'installazione senza testa, guardare SSH (Secure Shell) e seguire la sezione 3. Abilitare SSH su un Raspberry Pi senza testa (aggiungere il file alla scheda SD su un altro computer) .

Per la risoluzione dei problemi relativi allo spegnimento o per controllare i messaggi dagli stivali precedenti, è possibile abilitare la registrazione permanente in journald per i messaggi da systemd [1]. Poiché produce file di registro di grandi dimensioni e il luogo di archiviazione potrebbe essere un problema, suggerisco di abilitarlo solo se necessario. systemd-networkd non ne ha bisogno e la registrazione della sessione corrente è sempre disponibile.

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

Disabilita le cose vecchie. Non interrompere alcun servizio, disabilitalo solo! Quindi avrà effetto solo al prossimo avvio.

pi@raspberrypi: ~$ sudo -Es

In /etc/resolvconf.confinserto queste linee.

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

Quindi disabilita la classica rete Debian gestita con file /etc/network/interfacese disabilita la dhcpcdgestione della rete Raspbian predefinita . Lo mascheriamo in modo che siano completamente disabilitati e non possano essere avviati da altri servizi.

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

E abilita 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

♦ Passaggio 2: configurare l'interfaccia Ethernet cablata (eth0)

Crea questo file con le tue impostazioni. Puoi semplicemente copiarlo e incollarlo in un blocco nella riga di comando a partire da cate includendo entrambi EOF (il delimitatore EOF non otterrà parte del file):

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: ~$

Riavvia, ma solo se hai un cavo Ethernet collegato ;-)

È possibile che RasPi ottenga un nuovo indirizzo IP, quindi potrebbe essere necessario cercarlo per la prossima connessione con ssh .


♦ Passaggio 3: impostazione dell'interfaccia wlan (wlan0)

Crea questo file con le tue impostazioni:

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:~ #

Wpa_supplicant installazione con questo file e le impostazioni per la ssid=ed psk=e consentire:

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:~ $

Riavvia se hai una connessione wifi. Molti di voi avranno. In bocca al lupo ...

È possibile che RasPi ottenga un nuovo indirizzo IP, quindi potrebbe essere necessario cercarlo per la prossima connessione con ssh .


♦ Passaggio 4: collegamento dell'interfaccia cablata e wifi per il failover

Dovresti avere entrambe le interfacce configurate e funzionanti come descritto sopra. Non è un problema quando entrambe le interfacce sono attive. Il kernel utilizzerà prima l'interfaccia con la metrica più bassa . Qui verrà utilizzata per prima l'interfaccia Ethernet. Ma questo ha un grande svantaggio. Come puoi vedere con ~$ ip addrogni interfaccia ha il suo indirizzo IP. Se il kernel cambia l'interfaccia perché non funziona, usa anche il suo nuovo indirizzo IP sorgente. Ciò interromperà qualsiasi comunicazione TCP statefull stabilita, ad esempio ssh, streaming, sessioni di accesso e così via. È possibile utilizzare una nuova connessione dall'indirizzo IP di origine modificato ma le vecchie connessioni sono bloccate. Non è proprio quello che vogliamo.

La soluzione di questo problema è il legame . Creiamo un'interfaccia provvisoria bond0che non cambia le sue impostazioni. L'interfaccia cablata e wifi passerà a bond0.

Innanzitutto disabilita i singoli file di rete ethernet e wifi:

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~

Quindi impostare il collegamento con questi quattro file:

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:~ $

Ora è il momento di riavviare.

È possibile che RasPi ottenga un nuovo indirizzo IP, quindi potrebbe essere necessario cercarlo per la prossima connessione con ssh.

Quindi è possibile verificare lo stato del legame:

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

Test bonding: con lo stato di bonding sopra vedrai che Currently Active Slave:cambierà e MII Status:sarà giù.

Se sei senza testa, non downentrambe le interfacce insieme ;-)

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

Sii paziente dopo aver impostato wlan0. Potrei impiegare del tempo per riconnettermi al router e gestire il collegamento. Questa volta sshnon funzionerà.

Per una revisione più approfondita del collegamento, è possibile dare un'occhiata al failover dinamico della rete dando la priorità al wifi tramite Ethernet .


♦ Passaggio 5: ripulire

Elimina le vecchie cose:

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


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


Nota per quanto riguarda la prima citazione in alto: Raspbian non ha mai usato NetworkManager. È più un artefatto di Fedora e dei sistemi derivati ​​(che è stato il primo posto in cui è stato distribuito systemd, un progetto supportato da Redhat).
Riccioli d'oro

Applicabile anche ad altri sistemi basati su Debian non necessariamente in esecuzione su ARM :) Grazie per la spiegazione concisa.
TCB13

Questo ha funzionato per il mio tratto ma su buster ho riscontrato il problema, che il mio dispositivo non può risolvere alcun dominio. Qualche idea su quale potrebbe essere la causa?
user5950

@ user5950 Forse c'è qualcosa che è cambiato con buster? Lo guarderò. Solo un momento, per favore.
Ingo,

@Ingo Grazie per la rapida riproduzione. Potrei risolvere il problema aggiungendo la riga DNS=192.168.1.1a /etc/systemd/network/04-eth.network. (Sto usando una configurazione con IP statico) ...
user5950

4

Per elaborare la risposta di @Ingo: considera l'utilizzo del link

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

invece del collegamento a /run/systemd/resolve/resolv.conf. Ciò abilita lo stub DNS "integrato" e abilita cose come il server DNS per interfaccia che potrebbe essere importante se si utilizzano VPN che forniscono al proprio server DNS voci non pubbliche.


Molto interessante, grazie per il feedback. Esiste documentazione e / o fonti di questo? In tal caso, modifica la tua risposta (utilizzando il link sottostante) e aggiungila lì.
Ingo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.