Klipper CAN bus 설정

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
CANBUS - Klipper documentation

막상 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 networking

NetworkManager는 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:can0

systemd-networkd 설정 파일 생성

CAN network 생성

sudo nano /etc/systemd/network/80-can.network

아래 내용 입력 후 저장

[Match]
Name=can0

[CAN]
BitRate=1000000

CAN 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 NetworkManager

network 구성이 제대로 되었는지 확인한다.

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.0

Transmit 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