我试图匹配使用udev的设备,并在设备每次连接时(通过RUNS)运行一个命令。设备(一个V4L2 USB摄像头)总是连接到同一个USB端口,所以我想我可以依靠KERNELS属性来匹配它。我一直认为设备的sysfs路径将是持久的,但是对于连接到同一个USB端口的同一设备,我看到了不同的路径和KERNELS值:
$ 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 (但我不知道如何利用它来实现我的优势)。
发布于 2023-04-14 07:52:21
结果表明,KERNELS属性对基于USB端口的匹配是不可靠的。然而,我想出了如何利用by-path符号链接:通过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]https://unix.stackexchange.com/questions/742675
复制相似问题