systemd-networkd-wait-online 因 SocketCAN 接口而失败

systemd-networkd-wait-online 因 SocketCAN 接口而失败

我已经配置了一个 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

那么,问题:

  1. 甚至可以systemd-networkd-wait-online与 SocketCAN 接口一起使用吗?
  2. 如果确实如此,我做错了什么?
  3. 如果没有,在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链接的状态networkctlpending即使 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.

相关内容