udev 中的内核在重新启动后不会持续存在

udev 中的内核在重新启动后不会持续存在

我正在尝试使用 udev 匹配设备,并在每次连接设备时运行命令(通过RUNS)。该设备(V4L2 USB 摄像头)始终连接到同一个 USB 端口,因此我认为我可以依靠该KERNELS属性来匹配它。我一直认为设备的 sysfs 路径是持久的,但我看到KERNELS连接到同一 USB 端口的同一设备有不同的路径和值:

$ udevadm info -a /dev/video0
...
  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.4/3-1.4:1.0/video4linux/video0':
    KERNEL=="video0"
    SUBSYSTEM=="video4linux"
    DRIVER==""
...

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.4/3-1.4:1.0':
    KERNELS=="3-1.4:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="uvcvideo"
...

现在,重新启动后,我得到了不同的值:

$ udevadm info -a /dev/video0
...
  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/video4linux/video0':
    KERNEL=="video0"
    SUBSYSTEM=="video4linux"
    DRIVER==""
...

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0':
    KERNELS=="1-3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="uvcvideo"
...

如何编写与连接到该 USB 端口的设备相匹配的可靠 udev 规则?

我注意到即使路径发生/dev/v4l/by-path变化,路径也不会改变/sysfs:(/dev/v4l/by-path/pci-0000:00:14.0-usb-0:3:1.0-video-index0但我不知道如何利用它来发挥我的优势)。

答案1

事实证明,这些KERNELS属性对于进行此类基于 USB 端口的匹配并不可靠。然而,我想出了如何利用该by-path符号链接:Match via SYMLINK=="..."

对于有问题的设备,这将显示为

SYMLINK=="v4l/by-path/pci-0000:00:14.0-usb-0:3:1.0-video-index0"

还有ID_PATH可以以类似方式使用的设备属性。

可以使用列出符号链接和设备属性

udevadm info -q all [device_path_or_name]

相关内容