Systemd-networkd-wait-online이 SocketCAN 인터페이스에서 실패함

Systemd-networkd-wait-online이 SocketCAN 인터페이스에서 실패함

can0나는 (Confirmed works를 사용하여 ) SocketCAN 인터페이스를 구성했습니다 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플래그를 전달하도록 서비스를 수정해야 한다고 제안했는데 -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

비교해 보면, pass 시 "즉시" 성공합니다 -i eth0.

따라서 질문은 다음과 같습니다.

  1. systemd-networkd-wait-onlineSocketCAN 인터페이스와 함께 사용할 수도 있나요 ?
  2. 이것이 사실이라면, 내가 뭘 잘못하고 있는 걸까요?
  3. 그렇지 않은 경우 systemd-networkd인터페이스를 시작한 후 특정 시점에 서비스를 트리거하는 기능적 방법은 무엇입니까?

답변1

경고하다: 아래 솔루션은 "-backports" 패키지를 사용하여 systemd를 업그레이드합니다. 이것은 중요한 소프트웨어이며 이러한 변경 사항을 직접 적용한 후에는 장치를 다시 플래시하지 않고는 더 이상 장치를 재부팅할 수 없습니다. 현재 수행 중인 작업으로 인해 발생할 수 있는 결과를 수정/복구하는 방법을 알고 있는 경우에만 이 단계를 수행하십시오!

나는 이 질문에 대한 답을 찾았다고 믿습니다. 관련성이 있다고 생각되는 시스템 소스 코드를 읽은 후(https://github.com/systemd/systemd/blob/v241/src/network/networkd-link.c) 이는 데비안 버스터 제품군(Debian 10)의 최신 안정 릴리스인 systemd v241의 버그로 인해 발생한 것으로 보입니다.

systemd v241에서는 링크가 "보류 중" 상태를 벗어나지 않을 수 있습니다. systemd-networkd-wait-online이로 인해 관리형 캔 인터페이스가 "구성된" 상태에 도달할 때까지 기다리는 경우 일관된 시간 초과가 발생합니다. 이것이 실제로 동일한 문제인지 확인하려면 먼저 systemd 버전이 241( systemd --version)인지 확인한 후 SETUP를 실행하여 캔 링크 상태를 확인하는 것이 당연합니다 networkctl. 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             n/a                carrier     pending

Debian 10을 사용하는 경우 내가 찾은 해결책은 Buster-backports 패키지에서 사용할 수 있는 v247.3으로 systemd를 업그레이드하는 것입니다. 다음 줄을 추가하세요 /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

그런 다음 버스터 백포트에서 systemd를 업그레이드하십시오.

$ sudo apt update
$ sudo apt install systemd/buster-backports

systemd --version업그레이드 후 systemd 버전이 247( ) 로 변경되었는지 확인 하고 networkctl다시 실행하세요. 그런 다음 can 링크를 configured(가 아님 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.

관련 정보