Cómo migrar de la red a systemd-networkd con conmutación por error dinámica

14

Los Systemd systemd-networkdse pueden usar para reemplazar el sistema de red existente en Raspbian.

¿Cómo funciona con Raspbian en una Raspberry Pi con dos interfaces para ethernet y wlan? ¿Puedo realizar también una conmutación por error dinámica para ellos?

Ingo
fuente

Respuestas:

28

Probado en un Raspberry Pi 4B con
Raspbian Buster Lite 2020-02-05 actualizado en 2020-02-13.
Raspbian Buster Lite 2019-07-10 actualizado el 2019-08-15.
Actualizaciones realizadas con sudo apt update && sudo apt full-upgrade && sudo reboot.

¡No funcionará con Raspbian Stretch !
Aquí encontrará la última revisión probada para Raspbian Stretch Lite .


Por supuesto, es posible usarlo en systemd-networkdlugar del predeterminado dhcpcd. Pero no es significativo en todos los casos.

networkd es un servicio pequeño y delgado para configurar interfaces de red, diseñado principalmente para casos de uso de servidores en un mundo con redes conectadas en caliente y virtualizadas. Su configuración es similar en nivel de espíritu y abstracción a ifupdown, pero no necesita ningún paquete adicional para configurar puentes, enlaces, vlan, etc. Todavía no es muy adecuado para administrar redes WLAN; NetworkManager es aún mucho más apropiado para tales casos de uso de escritorio. [1]

Pero para un raspi cerca de un televisor o amplificador y hacer su trabajo 24/7 para transmitir audio o video o para una cámara, etc., systemd-networkdes una buena opción. Pero tienes que hacer un cambio completo. No hay forma de mezclarse con networkingy / o dhcpcd.


♦ Paso 1: preparación

Como referencia, uso una tarjeta SD actualizada de Raspbian Buster Lite 2019-07-10 .

Prestaré atención a una instalación sin cabeza solo con ssh. Si está utilizando esto, revise los errores tipográficos o de lo contrario se perderá con una conexión interrumpida. Si desea una instalación sin cabeza, mire SSH (Secure Shell) y siga la sección 3. Habilite SSH en una Raspberry Pi sin cabeza (agregue el archivo a la tarjeta SD en otra máquina) .

Para solucionar problemas de apagado o para verificar los mensajes de las botas anteriores, puede habilitar el registro persistente en journald para los mensajes de systemd [1]. Debido a que produce grandes archivos de registro y el lugar de almacenamiento puede ser un problema, sugiero habilitarlo solo si es necesario. systemd-networkd no lo necesita y el registro de la sesión actual siempre está disponible.

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

Desactiva las cosas viejas. ¡No detengas ningún servicio, solo deshabilítalos! Por lo tanto, solo tendrá efecto en el próximo arranque.

pi@raspberrypi: ~$ sudo -Es

En /etc/resolvconf.confinsertar estas líneas.

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

Luego deshabilite la red clásica de Debian que se administra con un archivo /etc/network/interfacesy deshabilite la dhcpcdadministración de red predeterminada de Raspbian . Lo ocultamos para que estén completamente deshabilitados y otros servicios no puedan iniciarlo.

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

Y habilite 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

♦ Paso 2: Configurar la interfaz de Ethernet con cable (eth0)

Crea este archivo con tu configuración. Simplemente puede copiar y pegar esto en un bloque a su línea de comando comenzando con cate incluyendo ambos EOF (el delimitador EOF no obtendrá parte del archivo):

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

Reinicie, pero solo si tiene un cable de ethernet conectado ;-)

Es posible que RasPi obtenga una nueva dirección IP, por lo que es posible que tenga que buscarla para la próxima conexión con ssh .


♦ Paso 3: Configurar la interfaz wlan (wlan0)

Cree este archivo con su configuración:

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 de instalación con este archivo y su configuración para ssid=y psk=y le permiten:

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

Reinicia si tienes una conexión wifi. La mayoría de ustedes lo tendrá. Buena suerte ...

Es posible que RasPi obtenga una nueva dirección IP, por lo que es posible que tenga que buscarla para la próxima conexión con ssh .


♦ Paso 4: vinculación de la interfaz cableada y wifi para la conmutación por error

Debe tener ambas interfaces configuradas y en ejecución como se describe anteriormente. No hay problema cuando ambas interfaces están activas. El núcleo usará la interfaz con la métrica más baja primero. Aquí la interfaz de ethernet se usará primero. Pero esto tiene una gran desventaja. Como puede ver con ~$ ip addrcada interfaz tiene su propia dirección IP. Si el kernel cambia la interfaz porque uno se ha caído, también usa su nueva dirección IP de origen. Esto interrumpirá cualquier comunicación TCP con estado establecida, por ejemplo, ssh, transmisión, sesiones de inicio de sesión, etc. Puede usar una nueva conexión desde la dirección IP de origen modificada pero las conexiones antiguas están atascadas. Eso no es realmente lo que queremos.

La solución de este problema es la vinculación . Creamos una interfaz provisional bond0que no cambia su configuración. La interfaz cableada y wifi cambiará a bond0.

Primero deshabilite los archivos de red única ethernet y 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~

Luego configure la vinculación con estos cuatro archivos:

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

Ahora es el momento de reiniciar.

Es posible que RasPi obtenga una nueva dirección IP, por lo que es posible que tenga que buscarla para la próxima conexión con ssh.

Luego puede verificar el estado de la vinculación:

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

Prueba de vinculación: con el estado de vinculación anterior, verá que Currently Active Slave:cambiará y que MII Status:está inactivo.

Si no tiene cabeza, no las downdos interfaces juntas ;-)

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

Sea paciente después de configurar wlan0. Puede que me tome un tiempo volver a conectarme al enrutador y administrar la vinculación. Esta vez sshno funcionará.

Para una revisión más profunda de la vinculación, puede echar un vistazo a la conmutación por error de red dinámica priorizar wifi sobre ethernet .


♦ Paso 5: limpiar

Purga las cosas viejas:

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


referencias:
[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
fuente
Nota con respecto a la primera cita: Raspbian nunca usó NetworkManager. Es más un artefacto de Fedora y sistemas derivados (que fue el primer lugar donde se implementó systemd, un proyecto apoyado por Redhat).
Ricitos de oro
También aplicable a otros sistemas basados ​​en Debian que no necesariamente se ejecutan en ARM :) Gracias por la explicación concisa.
TCB13
Esto funcionó para mi en estiramiento pero en buster encontré el problema, que mi dispositivo no puede resolver ningún dominio. ¿Alguna idea de cuál podría ser la causa?
user5950
@ user5950 ¿Quizás haya cambiado algo con buster? Voy a mirarlo. Un momento por favor.
Ingo
@Ingo Gracias por la rápida reproducción. Podría resolver el problema agregando la línea DNS=192.168.1.1a /etc/systemd/network/04-eth.network. (Estoy usando una configuración con IP estática) ...
user5950
4

Para elaborar la respuesta de @Ingo: considere usar el enlace

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

en lugar del enlace a /run/systemd/resolve/resolv.conf. Esto habilita el código auxiliar de DNS "integrado" y habilita cosas como el servidor DNS por interfaz que podría ser importante si usa VPN que proporcionan a su propio servidor DNS entradas no públicas.

Robert James
fuente
Muy interesante, gracias por sus comentarios. ¿Hay alguna documentación y / o fuentes de esto? Si es así, edite su respuesta (usando el enlace debajo) y agréguela allí.
Ingo