重命名 CAN 接口

重命名 CAN 接口

我有一个包含多个 CAN 设备的系统,我们使用这些设备来控制自动化环境中的其他设备,我想为它们提供持久名称以帮助调试和配置。我一直在尝试使用 udev 让它工作,但只取得了部分成功。

我们正在使用 IXXAT USB 转 CAN v2 设备,尽管我对其他 socketcan 设备也有同样的问题(也在 kvasser dongle 上尝试过)

设备的 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

相关内容