我正在尝试使用 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]