Klipper CAN bus 설정
[ Directory '/etc/network/interfaces.d/can0' does not exist ]
오류 해결 방법
오류 발생 원인
Klipper 공식 문서의 CANBUS설정은 /etc/network/interfaces.d/can0에 아래 내용을 저장하도록 하고 있다.
allow-hotplug can0
iface can0 can static
bitrate 1000000
up ip link set $IFACE txqueuelen 128
막상 sudo nano /etc/network/interfaces.d/can0 로 해당 파일을 수정하려 하면
[ Directory '/etc/network/interfaces.d/can0' does not exist ]
이렇게 파일이 존재하지 않는다고 에러가 나타난다.
이런 /etc/network/interfaces.d에 network interface를 구성하는 방법은 network deamon으로 ifupdown을 사용하던 Raspbian 8 이하 버전에서 사용하는 방식이다.
Rsapberry Pi OS 12이상, Debian 12 Bookworm이상의 최신 OS에서는 network deamon으로 NetworkManager를 사용하기 때문에 위 방식은 사용할 수 없다.
또 NetworkManager는 CAN interface를 지원하지 않기 때문에 systemd-networkd를 CAN 연결에만 사용하는 방식으로 CAN bus를 구성할 것이다.
사전 확인
우선 systemctl을 통해 NetworkManager, systemd-networkd, ifupdown의 사용 여부를 확인한다.
sudo systemctl status NetworkManager systemd-networkd networkingNetworkManager는 active, 나머지는 inactive 일 것이다.
NetworkManager가 can0를 무시하도록 설정
NetworkManager는 can interface를 지원하지 않기에 이미 사용되고 있는 NetworkManager가 아닌 systemd-networkd를 이용해 can interface를 구성한다.
두 deamon이 동시에 작동하기 때문에 충돌을 피하기 위해 NetworkManager에서는 can0를 무시하도록 설정 한다.
NetworkManager설정파일 생성
sudo nano /etc/NetworkManager/conf.d/99-ignore-can0.conf열린 nano 편집기를 통해 아래 내용 입력 후 ctrl + x -> y로 저장 후 종료
[keyfile]
unmanaged-devices=interface-name:can0systemd-networkd 설정 파일 생성
CAN network 생성
sudo nano /etc/systemd/network/80-can.network아래 내용 입력 후 저장
[Match]
Name=can0
[CAN]
BitRate=1000000CAN link 생성
sudo nano /etc/systemd/network/80-can.link
아래 내용 입력 후 저장
[Match]
Type=can
[Link]
TransmitQueueLength=256서비스 활성화 및 재시작
# systemd-networkd
sudo systemctl enable systemd-networkd
sudo systemctl restart systemd-networkd
# NetworkManager restart
sudo systemctl restart NetworkManagernetwork 구성이 제대로 되었는지 확인한다.
ip -details link show can0정상적으로 구성이 되었다면 아래와 같이 나타난다
can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can promiscuity 0 minmtu 0 maxmtu 0
can state ERROR-ACTIVE restart-ms 0
bitrate 500000 sample-point 0.875
tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
gs_usb: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1
clock 48000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 parentbus usb parentdev 1-2:1.0Transmit queue length 설정(optional)
ip -details link show can0에서 qlen이 10으로 되어있는걸 볼 수 있다.
Transmit queue 가 10밖에 되지 않으므로 갑자기 많은 패킷이 넘어간다면 이를 처리하지 못 할 것이다.
udev rule 수정
sudo nano /etc/udev/rules.d/99-canbus.rules아래 내용 입력 후 저장
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="can0" ATTR{tx_queue_len}="256"재시작
sudo reboot now재시작 후 구성을 다시 확인하면 qlen이 256으로 되어있을 것이다.
ip -details link show can0