我试图通过查看其他线程来解决我的问题,例如为什么我的 USB 端口修复 udev 规则不起作用和udev 规则不适用于较少数量在其他几篇有关 udev 规则的帖子中,但我检查过的帖子都无法帮助我找出为什么会遇到此问题。
带有 bInterfaceNumber 的 udev 规则不起作用和我遇到的问题非常相似,本质上是一样的,但自 2013 年以来它一直没有答案,我想现在已经被遗忘了。
我有以下非常有效的规则:
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="mos7840", ATTRS{port_number}=="0", SYMLINK+="USB-RS232-0", MODE="0777"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="mos7840", ATTRS{port_number}=="1", SYMLINK+="USB-RS232-1", MODE="0777"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="ftdi_sio", ATTRS{port_number}=="0", SYMLINK+="USB-TTL-0", MODE="0777"
问题是我有 2 个相同的设备,两者属性的唯一区别是序列号,它们甚至具有相同的 VID/PID,因此我需要添加ATTRS{序列号}规则最终得到:
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="mos7840", ATTRS{port_number}=="0", SYMLINK+="USB-RS232-0", MODE="0777"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="mos7840", ATTRS{port_number}=="1", SYMLINK+="USB-RS232-1", MODE="0777"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="ftdi_sio", ATTRS{port_number}=="0", ATTRS{serial}=="AFYS1HLQ", SYMLINK+="USB-TTL-0", MODE="0777"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb-serial", DRIVERS=="ftdi_sio", ATTRS{port_number}=="0", ATTRS{serial}=="FTV8IUSR", SYMLINK+="USB-TTL-1", MODE="0777"
因此添加后ATTRS{序列号}对于最后两条规则,则两者都停止工作。
为什么是这样?
谢谢!!
答案1
关键信息位于udev(7)
手册页的这一段中(我强调):
ATTRS{filename}
向上搜索 devpath 以查找具有匹配 sysfs 属性值的设备。如果指定了多个
ATTRS
匹配,则所有匹配都必须在同一设备上匹配。除非指定的匹配值本身包含尾随空格,否则将忽略属性值中的尾随空格。
因此,如果您有多个ATTRS
规则(如您所做的那样),则所有匹配的属性(文件名)都必须位于同一个设备目录中。
这不需要是与SUBSYSTEMS
或DRIVERS
规则匹配的同一设备。