Os Systemd systemd-networkd
podem 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?
Os Systemd systemd-networkd
podem 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?
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-networkd
vez 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 networking
e / ou dhcpcd
.
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.conf
inserir 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/interfaces
e desative o dhcpcd
gerenciamento 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
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 cat
e 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 .
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 .
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 addr
cada 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 bond0
que 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 down
duas 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 ssh
nã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 .
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
DNS=192.168.1.1
a/etc/systemd/network/04-eth.network
. (Estou usando uma instalação com IP estático)…Para elaborar a resposta do @Ingo: considere usar o link
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.fonte