Comment migrer du réseau vers systemd-networkd avec basculement dynamique


14

Systemd systemd-networkdpeut être utilisé pour remplacer le système de mise en réseau existant sur Raspbian.

Comment ça marche avec Raspbian sur un Raspberry Pi avec deux interfaces pour Ethernet et WLAN? Puis-je également réaliser un basculement dynamique pour eux?

Réponses:


28

Testé sur un Raspberry Pi 4B avec
Raspbian Buster Lite 2020-02-05 mis à jour le 2020-02-13.
Raspbian Buster Lite 2019-07-10 mis à jour le 2019-08-15.
Mises à jour effectuées avec sudo apt update && sudo apt full-upgrade && sudo reboot.

Cela ne fonctionnera pas avec Raspbian Stretch !
Vous trouverez ici la dernière révision testée de Raspbian Stretch Lite .


L'utilisation systemd-networkdau lieu de la valeur par défaut dhcpcdest bien sûr possible. Mais cela n'a pas de sens dans tous les cas.

networkd est un service petit et léger pour configurer les interfaces réseau, conçu principalement pour les cas d'utilisation de serveurs dans un monde avec des réseaux branchés à chaud et virtualisés. Sa configuration est similaire au niveau de l'esprit et de l'abstraction à ifupdown, mais vous n'avez pas besoin de packages supplémentaires pour configurer les ponts, les liaisons, le vlan, etc. Il n'est pas encore très approprié pour gérer les WLAN; NetworkManager est encore beaucoup plus approprié pour de tels cas d'utilisation de bureau. [1]

Mais pour un raspi allongé près d'un téléviseur ou d'un amplificateur et faisant son travail 24h / 24 et 7j / 7 pour diffuser de l'audio ou de la vidéo ou pour une caméra, etc., systemd-networkdc'est un bon choix. Mais vous devez faire un changement complet. Il n'y a aucun moyen de mélanger avec networkinget / ou dhcpcd.


♦ Étape 1: Préparation

Pour référence, j'utilise une nouvelle carte SD flashée de Raspbian Buster Lite 2019-07-10 .

Je ferai attention à une installation sans tête uniquement avec ssh. Si vous l'utilisez, revérifiez les fautes de frappe, sinon vous êtes perdu avec une connexion rompue. Si vous voulez une installation sans tête, regardez SSH (Secure Shell) et suivez la section 3. Activez SSH sur un Raspberry Pi sans tête (ajoutez un fichier à la carte SD sur une autre machine) .

Pour le dépannage à l'arrêt ou pour vérifier les messages des démarrages précédents, vous pouvez activer la journalisation persistante dans journald pour les messages de systemd [1]. Parce qu'il produit de gros fichiers journaux et que l'espace de stockage peut être un problème, je suggère de l'activer uniquement si nécessaire. systemd-networkd n'en a pas besoin et la journalisation de la session en cours est toujours disponible.

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

Désactivez les vieux trucs. N'arrêtez aucun service, désactivez-les seulement! Il ne prendra donc effet qu'au prochain démarrage.

pi@raspberrypi: ~$ sudo -Es

En /etc/resolvconf.confinsérer ces lignes.

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

Ensuite, désactivez la mise en réseau Debian classique qui est gérée avec un fichier /etc/network/interfaceset désactivez la dhcpcdgestion de réseau Raspbian par défaut . Nous le masquons afin qu'ils soient complètement désactivés et ne puissent pas être démarrés par d'autres services.

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

Et activez 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

♦ Étape 2: configuration de l'interface Ethernet filaire (eth0)

Créez ce fichier avec vos paramètres. Vous pouvez simplement copier et coller ceci dans un bloc sur votre ligne de commande en commençant par catet en incluant les deux EOF (le délimiteur EOF n'obtiendra pas une partie du fichier):

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

Redémarrez, mais seulement si vous avez un cordon Ethernet connecté ;-)

Il est possible que le RasPi obtienne une nouvelle adresse IP, vous devrez donc la consulter pour la prochaine connexion avec ssh .


♦ Étape 3: configuration de l'interface wlan (wlan0)

Créez ce fichier avec vos paramètres:

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

Configuration wpa_supplicant avec ce fichier et vos paramètres pour ssid=et psk=et lui permettent:

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

Redémarrez si vous avez une connexion wifi. La plupart d'entre vous en auront. Bonne chance ...

Il est possible que le RasPi obtienne une nouvelle adresse IP, vous devrez donc la consulter pour la prochaine connexion avec ssh .


♦ Étape 4: liaison de l'interface filaire et wifi pour le basculement

Vous devez avoir les deux interfaces configurées et exécutées comme décrit ci-dessus. Ce n'est pas un problème lorsque les deux interfaces sont actives. Le noyau utilisera d'abord l'interface avec la métrique la plus basse . Ici, l'interface Ethernet sera utilisée en premier. Mais cela a un grand inconvénient. Comme vous pouvez le voir, ~$ ip addrchaque interface a sa propre adresse IP. Si le noyau change d'interface parce qu'une est en panne, il utilise également sa nouvelle adresse IP source. Cela interrompra toute communication TCP établie, par exemple ssh, streaming, sessions de connexion, etc. Vous pouvez utiliser une nouvelle connexion à partir de l'adresse IP source modifiée, mais les anciennes connexions sont bloquées. Ce n'est pas vraiment ce que nous voulons.

La solution de ce problème est le collage . Nous créons une interface intermédiaire bond0qui ne modifie pas ses paramètres. L'interface filaire et wifi basculera sur bond0.

Désactivez d'abord les fichiers réseau Ethernet et WiFi uniques:

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~

Ensuite, configurez la liaison avec ces quatre fichiers:

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

Il est maintenant temps de redémarrer.

Il est possible que le RasPi obtienne une nouvelle adresse IP, vous devrez donc la consulter pour la prochaine connexion avec ssh.

Ensuite, vous pouvez vérifier l'état de la liaison:

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 de liaison: avec le statut de liaison ci-dessus, vous verrez que la Currently Active Slave:volonté changera et que le MII Status:sera en baisse.

Si vous êtes sans tête, ne faites pas les downdeux interfaces ensemble ;-)

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

Soyez patient après avoir configuré wlan0. Je peux prendre un certain temps pour me reconnecter au routeur et gérer la liaison. Cette fois sshne fonctionnera pas.

Pour un examen plus approfondi de la liaison, vous pouvez consulter le basculement du réseau dynamique en donnant la priorité au wifi sur Ethernet .


♦ Étape 5: nettoyer

Purger les vieux trucs:

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


références:
[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


Remarque concernant la première citation en haut: Raspbian n'a jamais utilisé NetworkManager. Il s'agit plus d'un artefact de Fedora et de systèmes dérivés (qui a été le premier endroit où systemd, un projet soutenu par Redhat, a été déployé).
goldilocks

Également applicable à d'autres systèmes basés sur Debian ne fonctionnant pas nécessairement sur ARM :) Merci pour l'explication concise.
TCB13

Cela a fonctionné pour mon étirement mais sur buster, j'ai rencontré le problème, que mon appareil ne peut pas résoudre n'importe quel domaine. Des idées quelle pourrait être la cause?
user5950

@ user5950 Peut-être que quelque chose a changé avec buster? Je vais regarder. Un instant s'il vous plaît.
Ingo

@Ingo Merci pour la relecture rapide. Je pourrais résoudre le problème en ajoutant la ligne DNS=192.168.1.1à /etc/systemd/network/04-eth.network. (J'utilise une configuration avec une adresse IP statique)…
user5950

4

Pour élaborer la réponse de @Ingo: veuillez envisager d'utiliser le lien

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

au lieu du lien vers /run/systemd/resolve/resolv.conf. Cela active le stub DNS "intégré" et permet des choses comme le serveur DNS par interface qui pourraient être importantes si vous utilisez des VPN qui fournissent à leur propre serveur DNS des entrées non publiques.


Très intéressant, merci pour vos commentaires. Existe-t-il une documentation et / ou des sources à ce sujet? Dans l'affirmative, veuillez modifier votre réponse (en utilisant le lien ci-dessous) et l'ajouter ici.
Ingo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.