Como migrar da rede para a systemd-networkd com failover dinâmico

14

Os Systemd systemd-networkdpodem ser usados ​​para substituir o sistema de rede existente no Raspbian.

Como ele funciona com o Raspbian em um Raspberry Pi com duas interfaces para Ethernet e WLAN? Também posso realizar failover dinâmico para eles?

Ingo
fonte

Respostas:

28

Testado em um Raspberry Pi 4B com o
Raspbian Buster Lite 2020-02-05 atualizado em 2020-02-13.
Raspbian Buster Lite 2019-07-10 atualizado em 2019-08-15.
Atualizações feitas com sudo apt update && sudo apt full-upgrade && sudo reboot.

Não funcionará com Raspbian Stretch !
Aqui você encontrará a última revisão testada do Raspbian Stretch Lite .


Usar em systemd-networkdvez do padrão dhcpcdé obviamente possível. Mas não é significativo em todos os casos.

networkd é um serviço pequeno e enxuto para configurar interfaces de rede, projetado principalmente para casos de uso de servidor em um mundo com rede virtualizada e com hotplugging. Sua configuração é semelhante em nível de espírito e abstração ao ifupdown, mas você não precisa de nenhum pacote extra para configurar pontes, vínculos, vlan etc. Não é muito adequado para gerenciar WLANs ainda; O NetworkManager ainda é muito mais apropriado para esses casos de uso da área de trabalho. [1]

Mas para um raspi próximo a uma TV ou amplificador e fazendo seu trabalho 24 horas por dia, 7 dias por semana para transmitir áudio ou vídeo ou para uma câmera etc., systemd-networkdé uma boa escolha. Mas você precisa fazer uma troca completa. Não há como se misturar com networkinge / ou dhcpcd.


♦ Etapa 1: Preparação

Para referência, uso um novo cartão SD do Raspbian Buster Lite 2019-07-10 .

Eu terei atenção a uma instalação sem cabeça apenas com ssh. Se você estiver usando isso, verifique erros de digitação ou, caso contrário, você estará perdido com uma conexão interrompida. Se você deseja uma instalação sem cabeça, consulte o SSH (Secure Shell) e siga a seção 3. Habilite o SSH em um Raspberry Pi sem cabeça (adicione o arquivo ao cartão SD em outra máquina) .

Para solucionar problemas no desligamento ou para verificar mensagens de inicializações anteriores, você pode ativar o log persistente no journald para obter mensagens do systemd [1]. Como ele produz grandes arquivos de log e o local de armazenamento pode ser um problema, sugiro habilitá-lo apenas se necessário. O systemd-networkd não precisa dele e o log da sessão atual está sempre disponível.

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

Desative as coisas antigas. Não pare nenhum serviço, apenas desative-o! Portanto, ele entrará em vigor apenas na próxima inicialização.

pi@raspberrypi: ~$ sudo -Es

Em /etc/resolvconf.confinserir essas linhas.

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

Em seguida, desative a rede Debian clássica que é gerenciada com arquivos /etc/network/interfacese desative o dhcpcdgerenciamento de rede Raspbian padrão . Nós o ocultamos para que sejam completamente desativados e não possam ser iniciados por outros serviços.

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

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

♦ Etapa 2: Configurar a interface Ethernet com fio (eth0)

Crie este arquivo com suas configurações. Você pode simplesmente copiar e colar isso em um bloco na sua linha de comando, começando com cate incluindo os dois EOF (o delimitador EOF não fará parte do arquivo):

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

Reinicialize, mas somente se você tiver um cabo Ethernet conectado ;-)

É possível que o RasPi obtenha um novo endereço IP, para que você precise procurar a próxima conexão com o ssh .


♦ Etapa 3: Configurar a interface wlan (wlan0)

Crie este arquivo com suas configurações:

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 configuração com este arquivo e suas configurações para ssid=e psk=e habilitá-lo:

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

Reinicie se você tiver uma conexão wifi. A maioria de vocês terá. Boa sorte ...

É possível que o RasPi obtenha um novo endereço IP, para que você precise procurar a próxima conexão com o ssh .


♦ Etapa 4: Ligação da interface com fio e wifi para failover

Você deve ter as duas interfaces configuradas e em execução, conforme descrito acima. Não há problema quando as duas interfaces estão ativadas. O kernel usará a interface com a métrica mais baixa primeiro. Aqui, a interface Ethernet será usada primeiro. Mas isso tem uma grande desvantagem. Como você pode ver, ~$ ip addrcada interface possui seu próprio endereço IP. Se o kernel alterna a interface porque um deles caiu, ele também usa seu novo endereço IP de origem. Isso interromperá qualquer comunicação TCP estabelecida no estado, por exemplo, ssh, streaming, sessões de login e assim por diante. Você pode usar uma nova conexão a partir do endereço IP de origem alterado, mas as conexões antigas estão bloqueadas. Isso não é realmente o que queremos.

A solução deste problema é a ligação . Criamos uma interface provisória bond0que não altera suas configurações. A interface com fio e wifi mudará para bond0.

Primeiro desative os arquivos de rede Ethernet e Wi-Fi únicos:

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~

Em seguida, configure a ligação com estes quatro arquivos:

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

Agora é hora de reiniciar.

É possível que o RasPi obtenha um novo endereço IP, para que você precise procurar a próxima conexão com o ssh.

Então você pode verificar o status da ligação:

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

Teste de ligação: com o status de ligação acima, você verá que a Currently Active Slave:alteração será alterada e a MII Status:queda.

Se você estiver sem cabeça, não faça as downduas interfaces ;-)

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

Seja paciente depois de configurar o wlan0. Pode demorar algum tempo para me reconectar ao roteador e gerenciar a ligação. Desta vez sshnão vai funcionar.

Para uma revisão mais aprofundada da ligação, você pode dar uma olhada em Failover dinâmico da rede, priorizando o wifi sobre a Ethernet .


♦ Etapa 5: limpar

Limpe o material antigo:

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


referências:
[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
fonte
Observe em relação à primeira citação no topo: O Raspbian nunca usou o NetworkManager. É mais um artefato do Fedora e sistemas derivados (que foi o primeiro local em que o systemd, um projeto suportado pelo Redhat, foi implantado).
goldilocks
Também aplicável a outros sistemas baseados no Debian que não necessariamente executam o ARM :) Obrigado pela explicação concisa.
TCB13 29/06/19
Isso funcionou para o meu no estiramento, mas no buster eu encontrei o problema, que meu dispositivo não pode resolver qualquer domínio. Alguma idéia do que poderia ser a causa?
user5950
@ user5950 Talvez algo tenha mudado com o buster? Eu irei analisar. Um momento por favor.
Ingo
@ Ingo Obrigado pela repetição rápida. Eu poderia resolver o problema adicionando a linha DNS=192.168.1.1a /etc/systemd/network/04-eth.network. (Estou usando uma instalação com IP estático)…
user5950 17/07/19
4

Para elaborar a resposta do @Ingo: considere usar o link

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

em vez do link para /run/systemd/resolve/resolv.conf. Isso habilita o stub DNS "integrado" e habilita coisas como servidor DNS por interface, o que pode ser importante se você usar VPNs que forneçam entradas não públicas ao seu servidor DNS.

Robert James
fonte
Muito interessante, obrigado pelo feedback. Existe alguma documentação e / ou fontes disso? Nesse caso, edite sua resposta (usando o link abaixo) e adicione-a lá.
Ingo