此前可正常运行的基础udev规则现在无法触发执行该如何排查?
问题定位步骤
- 先重载udev规则排除缓存问题,执行:
sudo udevadm control --reload-rules - 验证规则文件权限合法性,udev会直接忽略权限不符合要求的规则文件,要求所有者为root,且其他用户无写权限,执行
ls -l /usr/lib/udev/rules.d/99-test.rules检查,权限异常时执行修复:sudo chown root:root /usr/lib/udev/rules.d/99-test.rules && sudo chmod 644 /usr/lib/udev/rules.d/99-test.rules - 核对设备匹配属性,插入USB鼠标后,执行
ls /dev/input/找到新增的event设备(比如event8),执行udevadm info --attribute-walk --path=/sys/class/input/eventX(替换X为实际设备编号),确认输出的ACTION、SUBSYSTEM属性和你写的规则完全一致,udev规则为精确匹配,大小写、符号错误都会导致匹配失败。 - 模拟触发事件测试规则匹配结果,执行
sudo udevadm test /sys/class/input/eventX,输出会显示所有匹配到的规则和待执行的操作,直接确认你的规则是否被加载、RUN指令是否被触发。 - 检查udev服务运行状态,执行
systemctl status systemd-udevd确认服务正常运行,异常时重启服务:sudo systemctl restart systemd-udevd
常见失效原因及修复方案
- 规则被覆盖:/etc/udev/rules.d/ 目录下的规则优先级高于 /usr/lib/udev/rules.d/,如果存在同名的
/etc/udev/rules.d/99-test.rules文件,会直接覆盖你写的规则,可删除冲突文件或合并规则内容。 - RUN指令未用绝对路径:udev运行时的PATH环境变量非常有限,不能依赖系统默认PATH找命令,将你的规则中的RUN字段修改为绝对路径:
ACTION=="add", SUBSYSTEM=="input", RUN+="/usr/bin/touch /tmp/test" - 私有Tmp命名空间隔离:目前多数主流发行版的systemd-udevd服务默认开启PrivateTmp配置,udev写入的
/tmp/test实际保存在专属的隔离tmp目录,不会出现在用户可见的/tmp路径下。验证该问题可将测试文件路径修改为/var/tmp,或关闭udev的私有Tmp配置:
执行sudo systemctl edit systemd-udevd,添加如下配置:[Service]
PrivateTmp=no
保存后执行重载生效:sudo systemctl daemon-reload && sudo systemctl restart systemd-udevd - 匹配被提前终止:如果序号小于99的规则中存在
OPTIONS+="last_rule"配置,会直接终止后续规则的匹配,可检查低序号规则文件是否存在该配置,调整规则序号或删除该配置即可。
内容的提问来源于stack exchange,提问作者sezanzeb
相关产品推荐
相关产品推荐

