Answers:
在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
。
作为参考,我使用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
使用您的设置创建此文件。您可以将其复制并粘贴到以cat
EOF 开头(包括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建立下一个连接。
使用您的设置创建此文件:
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建立下一个连接。
您应该同时如上所述设置和运行接口。两个接口都打开时没有问题。内核将首先使用度量最低的接口。此处将首先使用以太网接口。但这具有很大的缺点。如您所见,~$ 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。
清除旧内容:
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
DNS=192.168.1.1
来/etc/systemd/network/04-eth.network
。(我使用的是带有静态IP的设置)…