自動化環境で他のデバイスを制御するために使用される複数の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を介して行うことができます。
まず、次の2つのファイルを作成します。/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