我已经配置了一个 SocketCAN 接口can0
(使用 确认工作can-utils
)。我有以下.network
配置文件,以便systemd-networkd
在启动时显示界面。
#/etc/systemd/network/80-can.network
[Match]
Name=can0
[CAN]
BitRate=250K
RestartSec=100ms
[Link]
Unmanaged=no
RequiredForOnline=yes
启动后,我可以看到接口已启动(注意UP
标志设置)
$ ip link show can0
5: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 65536
link/can
或者
$ ifconfig can0
can0: flags=193<UP,RUNNING,NOARP> mtu 16
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 65536 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我想在systemd-networkd
网络启动后运行一次性服务。一些搜索表明我应该修改systemd-networkd-wait-online
服务以传递 flag -i [interface]
,我已经这样做了
$ sudo systemctl edit systemd-networkd-wait-online
#/etc/systemd/system/systemd-networkd-wait-online.service.d/override.conf
[Service]
ExecStart=
ExecStart=/lib/systemd/systemd-networkd-wait-online -i can0 --timeout=5
在我的定制服务中我使用
[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service
但是,systemd-networkd-wait-online
启动时失败,当我单独运行该命令时,它会在超时后失败:
$ /lib/systemd/systemd-networkd-wait-online -i can0 --timeout=5
Event loop failed: Connection timed out
作为比较,它在通过时“立即”成功-i eth0
。
那么,问题:
- 甚至可以
systemd-networkd-wait-online
与 SocketCAN 接口一起使用吗? - 如果确实如此,我做错了什么?
- 如果没有,在
systemd-networkd
启动界面后的某个时刻触发服务的功能方式是什么?
答案1
警告:下面的解决方案使用“-backports”套件升级 systemd。这是一个关键的软件,在我自己应用这些更改后,我无法再重新启动我的设备,而不得不重新刷新它。仅当您知道如何修复/恢复您正在做的事情可能产生的后果时,才执行这些步骤!
我相信我找到了这个问题的答案。阅读完我认为相关的 systemd 源代码后(https://github.com/systemd/systemd/blob/v241/src/network/networkd-link.c),这似乎是由 systemd v241 中的错误引起的,它是 Debian buster 套件 (Debian 10) 的最新稳定发行版本。
在 systemd v241 中,can 链接永远不会离开“挂起”状态。systemd-networkd-wait-online
如果等待托管 can 接口达到“已配置”状态,这会导致始终超时。要确认这确实是同样的问题,自然要先检查systemd的版本是否为241( systemd --version
),然后SETUP
通过运行来检查can链接的状态networkctl
。pending
即使 can 链接已正确配置并正常工作,它也会显示。
$ networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 eth0 ether routable configured
3 eth1 ether no-carrier unmanaged
4 pileft ether no-carrier unmanaged
5 can0 n/a carrier pending
如果使用 Debian 10,我发现的解决方案是将 systemd 升级到 v247.3,可以从buster-backports 套件获取。将此行添加到/etc/apt/sources.list
:
deb http://deb.debian.org/debian buster-backports main
需要为其添加一些键:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131
然后从 buster-backports 升级 systemd:
$ sudo apt update
$ sudo apt install systemd/buster-backports
升级后,验证systemd版本已更改为247(systemd --version
),然后networkctl
再次运行。然后它应该正确识别 can 链接为configured
(not pending
):
$ networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 eth0 ether routable configured
3 eth1 ether no-carrier unmanaged
4 pileft ether no-carrier unmanaged
5 can0 can carrier configured
然后,重新启动systemd-networkd-wait-online
服务不应再给您显示超时错误消息:
$ sudo systemctl restart systemd-networkd-wait-online
$ systemctl status systemd-networkd-wait-online
● systemd-networkd-wait-online.service - Wait for Network to be Configured
Loaded: loaded (/lib/systemd/system/systemd-networkd-wait-online.service; enabled; vendor preset: disabled)
Active: active (exited) since Thu 2023-09-07 00:17:41 CEST; 1s ago
Docs: man:systemd-networkd-wait-online.service(8)
Process: 5824 ExecStart=/lib/systemd/systemd-networkd-wait-online (code=exited, status=0/SUCCESS)
Main PID: 5824 (code=exited, status=0/SUCCESS)
Sep 07 00:17:41 systemd[1]: Starting Wait for Network to be Configured...
Sep 07 00:17:41 systemd[1]: Finished Wait for Network to be Configured.