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
.
따라서 질문은 다음과 같습니다.
systemd-networkd-wait-online
SocketCAN 인터페이스와 함께 사용할 수도 있나요 ?- 이것이 사실이라면, 내가 뭘 잘못하고 있는 걸까요?
- 그렇지 않은 경우
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.