Systemd的systemd-networkd可用于替换Raspbian上的现有网络系统。

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

#1 楼

在Raspberry Pi 4B上进行了测试,并于2020-04-11更新了Raspbian Buster Lite 2020-02-13。
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混淆。另请注意,Raspbian不支持NetworkManager。

♦步骤1:准备工作
作为参考,我使用来自** Raspbian Buster Lite **的新闪存SD卡。 。
我将只注意使用ssh进行无头安装。如果使用此功能,请仔细检查错别字,否则您将因连接断开而迷路。如果要进行无头安装,请查看SSH(安全外壳),然后按照第3节进行操作。在无头Raspberry Pi上启用SSH(将文件添加到另一台计算机上的SD卡中)。
禁用旧内容。不要停止任何服务,只能禁用它们!因此它将仅在下次启动时生效。只需遵循



,将systemd-networked用于常规网络即可,但仅此部分♦快速步骤并返回此处。


♦步骤2:设置有线以太网接口(eth0)
使用您的设置创建此文件。您可以将其复制并粘贴到一个以`cat`开头并包含两个EOF的命令行中的一个块中(定界符EOF将不会成为文件的一部分):
pi@raspberrypi: ~$ sudo -Es   # if not already done
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


♦步骤3:设置wlan界面(wlan0)
使用您的设置创建此文件:
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

使用此文件以及您对country=ssid=psk=的设置来设置wpa_supplicant并启用它:
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:~ $

重新启动,祝你好运;-)
RasPi可能会获得一个新的IP地址,因此您可能需要查看它才能与ssh建立下一个连接。

♦步骤4:绑定有线和wifi接口以进行故障转移
您应该同时如上所述设置和运行接口。两个接口都打开时没有问题。内核将首先使用最低指标的接口。此处将首先使用以太网接口。但这具有很大的缺点。如您在`ip -4 -brief 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
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

但这还不是全部。 systemd-networkd在继续进行依赖于启动的服务之前,检查所有接口是否都已启动。通过绑定,我们具有从接口(eth0,wlan0),这些接口从不发出信号。如果连接了至少一个从属服务器,则它将出现的唯一绑定接口。因此,检查将因错误而失败,并且需要长时间等待启动。要管理此问题,您必须修改systemd-networkd-wait-online.service。操作方法,请按照

上的说明进行操作。开始作业正在等待网络配置完毕。

如果完成,就可以重新启动了。
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): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: dc:a6:32:4c:08:1b
Slave queue ID: 0

Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: dc:a6:32:4c:08:1c
Slave queue ID: 0

测试绑定:在上面的绑定状态下,您会看到Currently Active Slave:将会更改并且MII Status:处于关闭状态。
如果您无头,请不要将down的两个接口都放在一起;设置完wlan0之后。我可能需要一些时间才能重新连接到路由器并管理绑定。这次ssh将不会响应。
对于绑定的更深入的了解,您可以看看动态网络故障转移优先于以太网的wifi。

参考文献:
[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和派生系统的产物(这是部署了Redd支持的项目systemd的第一个地方)。

–金锁♦
18-2-10在12:49



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

–TCB13
19年6月29日在16:29

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

–user5950
19年7月17日在12:40

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

– Ingo
19年7月17日在12:46

@Ingo谢谢您的快速回放。我可以通过将DNS = 192.168.1.1行添加到/etc/systemd/network/04-eth.network来解决该问题。 (我正在使用带有静态IP的设置)…

–user5950
19年7月17日在19:20

#2 楼

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

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


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

评论


非常有趣,谢谢您的反馈。是否有任何文档和/或资料来源?如果是这样,请编辑您的答案(使用下面的链接),然后将其添加到此处。

– Ingo
19年11月11日在9:18