如何通过动态故障转移从网络迁移到系统联网


14

Systemd systemd-networkd可以用来代替Raspbian上的现有网络系统。

它在具有两个用于以太网和wlan接口的Raspberry Pi上如何与Raspbian一起工​​作?我还能为他们实现动态故障转移吗?

Answers:


28

在Raspberry Pi 4B上测试,并于
2020-02-13更新了Raspbian Buster Lite 2020-02-05。
Raspbian Buster Lite 2019-07-10更新于2019-08-15。
使用完成的更新sudo apt update && sudo apt full-upgrade && sudo reboot

它不适用于Raspbian Stretch
在这里,您将找到Raspbian Stretch Lite最新测试版本


当然可以使用systemd-networkd而不是默认值dhcpcd。但这并不是在所有情况下都有意义。

networkd是用于配置网络接口的小型精益服务,主要用于具有热插拔和虚拟化网络的世界中的服务器用例。它的配置在本质和抽象层次上与ifupdown相似,但是您不需要任何额外的程序包即可配置网桥,绑定,VLAN等。它现在还不太适合管理WLAN。NetworkManager仍然更适合于此类桌面用例。[1]

但是对于在电视或放大器附近放置的raspi,并以24/7的速度进行工作以传输音频或视频或摄像机等,systemd-networkd是一个不错的选择。但是您必须进行一次完整的切换。无法与networking和/或混淆dhcpcd


♦步骤1:准备

作为参考,我使用Raspbian Buster Lite 2019-07-10的新闪存 SD卡。

我将注意仅使用ssh的无头安装。如果使用此功能,请仔细检查错别字,否则您将因连接断开而迷路。如果要进行无头安装,请查看SSH(安全外壳),然后按照部分3。在无头Raspberry Pi上启用SSH(将文件添加到另一台计算机上的SD卡中)

要在关机时进行故障排除或检查以前的启动消息,您可以在日志中启用持久日志记录,以记录systemd [1]中的消息。因为它会生成大量日志文件,并且存储位置可能是个问题,所以我建议仅在需要时才启用它。systemd-networkd不需要它,并且当前会话的日志记录始终可用。

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

禁用旧的东西。不要停止任何服务,只能禁用它们!因此它将仅在下次启动时生效。

pi@raspberrypi: ~$ sudo -Es

/etc/resolvconf.conf插入这些行。

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

然后禁用通过文件管理的经典Debian网络,/etc/network/interfaces并禁用默认的Raspbian dhcpcd网络管理。我们将其屏蔽,以使它们完全被禁用,并且不能由其他服务启动。

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

并启用systemd-networked:

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

♦步骤2:设置有线以太网接口(eth0)

使用您的设置创建此文件。您可以将其复制并粘贴到以catEOF 开头(包括EOF在内)的一个块中(分隔符EOF不会成为文件的一部分):

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

重新启动,但仅在连接了以太网线的情况下;-)

RasPi可能会获得一个新的IP地址,因此您可能必须查看它才能与ssh建立下一个连接。


◆步骤3:设置wlan接口(wlan0)

使用您的设置创建此文件:

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

使用此文件以及您对ssid=和的设置来设置wpa_supplicant psk=并启用它:

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

如果您有wifi连接,请重新启动。你们大多数人都会。祝好运 ...

RasPi可能会获得一个新的IP地址,因此您可能必须查看它才能与ssh建立下一个连接。


♦步骤4:绑定有线和wifi接口以进行故障转移

您应该同时如上所述设置和运行接口。两个接口都打开时没有问题。内核将首先使用度量最低的接口。此处将首先使用以太网接口。但这具有很大的缺点。如您所见,~$ ip addr每个接口都有其自己的ip地址。如果内核由于一个接口断开而切换了接口,它也会使用其新的源ip地址。这将中断任何已建立的全状态TCP通信,例如ssh,流式传输,登录会话等。您可以使用更改后的源IP地址中的新连接,但旧连接会卡住。那不是我们真正想要的。

解决这个问题的方法是粘接。我们创建一个bond0不会更改其设置的临时界面。有线和wifi接口将切换到bond0

首先禁用单个以太网和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~

然后设置与这四个文件的绑定:

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

现在该重启了。

RasPi可能会获得一个新的IP地址,因此您可能需要查看它才能与ssh建立下一个连接。

然后可以检查绑定状态:

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

测试绑定:在上面的绑定状态下,您会看到Currently Active Slave:将会更改而MII Status:向下。

如果您没有头,请不要将down两个界面都放在一起;-)

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

设置wlan0后要耐心等待。我可能需要一些时间才能重新连接到路由器并管理绑定。这次ssh将不起作用。

要更深入地了解绑定,您可以查看动态网络故障转移优先于以太网的wifi


♦步骤5:清理

清除旧内容:

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


参考:
[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


关于第一个引用:Raspbian从未使用过NetworkManager。它更像是Fedora和派生系统的产物(这是systemd,一个Redhat支持的项目被部署的第一个地方)。
goldilocks

也适用于不一定在ARM上运行的其他基于Debian的系统:)感谢您的简要说明。
TCB13

这对我的工作很有帮助,但在遇到麻烦时,我遇到了问题,我的设备无法解析任何域。任何想法可能是什么原因?
user5950 '19

@ user5950也许克星有一些改变?我会看的。请稍等片刻。
Ingo,

@Ingo谢谢您的快速回放。我可以通过增加线路解决问题DNS=192.168.1.1/etc/systemd/network/04-eth.network。(我使用的是带有静态IP的设置)…
user5950 '19

4

要详细说明@Ingo的答案,请考虑使用链接

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

而不是的链接/run/systemd/resolve/resolv.conf。这将启用“集成的” DNS存根,并启用诸如每接口DNS服务器之类的功能,如果您使用向其自己的DNS服务器提供非公共条目的VPN,这可能很重要。


非常有趣,谢谢您的反馈。是否有任何文档和/或资料来源?如果是这样,请编辑您的答案(使用下面的链接)并将其添加到那里。
Ingo,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.