CAN 인터페이스 이름 바꾸기

CAN 인터페이스 이름 바꾸기

자동화 환경에서 다른 장치를 제어하는 ​​데 사용하는 여러 CAN 장치가 있는 시스템이 있는데 디버깅 및 구성을 돕기 위해 지속적인 이름을 지정하고 싶습니다. 나는 udev를 사용하여 작동시키려고 노력했지만 부분적으로만 성공했습니다.

우리는 IXXAT USB to CAN v2 장치를 사용하고 있지만 다른 소켓캔 장치에도 동일한 문제가 있습니다(kvasser 동글에서도 시도했습니다)

장치의 UDev 트리는 표준 USB/pci 부분을 생략하고 다음과 같습니다.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/can0':
    KERNEL=="can0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{mtu}=="16"
    ATTR{type}=="280"
    ATTR{netdev_group}=="0"
    ATTR{flags}=="0x40081"
    ATTR{dormant}=="0"
    ATTR{proto_down}=="0"
    ATTR{addr_assign_type}=="0"
    ATTR{dev_id}=="0x0"
    ATTR{gro_flush_timeout}=="0"
    ATTR{iflink}=="6"
    ATTR{addr_len}=="0"
    ATTR{address}==""
    ATTR{operstate}=="unknown"
    ATTR{carrier_changes}=="0"
    ATTR{broadcast}==""
    ATTR{tx_queue_len}=="10"
    ATTR{dev_port}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="6"
    ATTR{link_mode}=="0"
    ATTR{carrier}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0':
    KERNELS=="1-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ixx_usb"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{bNumEndpoints}=="0a"
    ATTRS{authorized}=="1"
    ATTRS{supports_autosuspend}=="0"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="ff"
    ATTRS{devpath}=="1"
    ATTRS{idVendor}=="08d8"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="7"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="300mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bNumConfigurations}=="2"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0100"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="HW486964"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="31"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="IXXAT"
    ATTRS{removable}=="removable"
    ATTRS{idProduct}=="0008"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB-to-CAN V2"

제가 구현하려는 UDEV 규칙은 다음과 같습니다.

SUBSYSTEM=="net", ATTRS{idVendor}=="08d8", ATTRS{idProduct}=="0008", ATTRS{serial}=="HW486964", ACTION=="add", DRIVERS=="?*", NAME="canTest"

장치가 연결되면 어떤 모니터링이 발생합니까?

KERNEL[9271.146978] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1 (usb)
KERNEL[9271.148311] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0 (usb)
KERNEL[9271.653719] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/can0 (net)
KERNEL[9271.654067] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/can0/queues/rx-0 (queues)
KERNEL[9271.654154] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/can0/queues/tx-0 (queues)
UDEV  [9271.674443] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1 (usb)
UDEV  [9271.677002] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0 (usb)
KERNEL[9271.678372] move     /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/canTest (net)
UDEV  [9271.694467] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/canTest (net)
UDEV  [9271.696129] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/can0/queues/rx-0 (queues)
UDEV  [9271.698886] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/can0/queues/tx-0 (queues)
UDEV  [9271.700647] move     /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/net/canTest (net)

장치가 움직이는 것을 볼 수 있지만 인터페이스는 표시되지 않으며 ifup/down에서는 어떤 이름으로도 표시되지 않습니다. ip 명령은 이름으로 장치를 볼 수 있습니다테스트 가능, 그러나 인터페이스는 표시되지 않습니다.

장치가 연결되어 있을 때 커널 식별자를 알고 있고 ip 유틸리티를 사용하여 사용자 정의 이름 바꾸기 규칙을 제거하면 장치에 다른 이름을 지정할 수 있습니다.

sudo ip link set canX down
sudo ip link set canX name canTest
sudo ip link set canTest up

추가 정보 운영 체제: Ubuntu(14.04, 16.04, 18.04) 커널: 3.13.0, 4.4.0, 4.15.0

답변1

이는 systemd-networkd를 통해 수행할 수 있습니다.

먼저 다음 두 파일을 만듭니다./etc/systemd/network/

### /etc/systemd/network/49-cantest.link
[Match]
Property=ID_SERIAL_SHORT=004B003F4733570620353439
[Link]
Name=canTest

바라보다:돕다Property=

### /etc/systemd/network/50-cantest.network
[Match]
Name=canTest
[CAN]
BitRate=500000

다음으로 재부팅하세요. 인터페이스가 canTest나타나야 합니다.

> ip link
...
4: canTest: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can
... 

위 답변에서는 이 ID_SERIAL_SHORT속성을 사용하여 CAN 어댑터를 고유하게 식별했습니다. 다음 명령을 사용하여 CAN 어댑터와 관련된 다른 속성을 찾을 수 있습니다.

udevadm info -p $(udevadm info --query=path --path=/sys/class/net/can0)

관련 출처: https://www.pengutronix.de/en/blog/2022-02-04-initializing-can-interfaces-with-systemd-networkd.html

관련 정보