我有一个包含多个 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
### /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