关于udev规则中ATTRS与ATTR的区别及区分原因的技术问询
关于udev规则中ATTR与ATTRS的区别解答
1. 核心区别:作用的设备对象完全不同
ATTR{}:只匹配当前你编写规则针对的那个设备节点本身的属性。比如你给某个USB键盘写规则,ATTR{idVendor}就是直接读取这个键盘设备节点下的idVendor属性,只会在当前节点找,不会往上找。ATTRS{}:会在**当前设备的整个父设备链(从当前节点往上追溯的所有层级父设备)**里查找匹配的属性。还是拿USB键盘举例,它的父设备可能是USB集线器,再往上是主板上的USB控制器,ATTRS{idVendor}会检查这条链上所有设备的idVendor属性,只要其中一个符合就算匹配成功。
2. 为什么要做这样的区分?
这得从Linux设备模型的层级逻辑说起:
- 很多外设的关键属性并不全存在于自身的设备节点中。比如有些USB设备的部分标识信息可能存储在它的上游集线器或者控制器节点里,这时候用
ATTR{}根本拿不到这些属性,必须用ATTRS{}去父链里检索。 - 另外,这种区分能实现更灵活的设备匹配场景:比如你想给连接到某款特定USB控制器的所有设备统一设置权限,就可以用
ATTRS{idVendor}匹配控制器的厂商ID,而不是单个设备的,这样就能批量覆盖符合条件的下游设备。
举两个实际例子帮助理解:
匹配所有连接到某款特定USB集线器的设备,规则会写成:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"这里的
ATTRS就是在父链中定位集线器的属性,而非下游设备自身的属性。
而针对单个设备自身属性的匹配(比如给特定鼠标设置权限):
SUBSYSTEM=="input", ATTR{idVendor}=="abcd", ATTR{idProduct}=="wxyz", MODE="0666"
这里用ATTR就足够,因为我们要匹配的是鼠标自身的标识信息。
内容的提问来源于stack exchange,提问作者RomuloPBenedetti
相关产品推荐
相关产品推荐

