USB 连接/分离的 udev 规则未触发

jay*_*ren 5 udev

我正在运行 RHEL6,我正在尝试编写一个在插入和移除 USB 设备时触发的 udev 规则。我创建了一个名为80-usb.rulesin的文件,/etc/udev/rules.d/并给了它以下内容(到目前为止没有什么太具体的,只是想测试一下):

ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
Run Code Online (Sandbox Code Playgroud)

我保存了文件并插入 USB 驱动器进行测试。但是,/tmp/test未创建该文件。

我认为我的 udev 规则应该与我的 USB 驱动器匹配,因为我可以udevadm info在 USB 驱动器上运行并且至少一个父设备具有属性SUBSYSTEMS=="usb".

为什么 udev 规则可能不会被触发?

我试着运行udevadm test --action=add /path/to/device,很明显.rules我写的文件正在处理并且我的规则正在匹配。以下是输出中的一些相关行:

parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'
Run Code Online (Sandbox Code Playgroud)

但是,仍然/tmp/test不存在。我感到很困惑。很明显,这条规则正在被匹配,规则正在被应用。那么为什么不RUN执行指定的命令呢?

小智 1

您必须确保以下几点:

  • 命令中的路径RUN应该是绝对路径
  • 该文件必须是可执行的
  • 环境PATH限制在您命令的执行范围内

首先将此脚本文件添加到/lib/udev/touch.sh

vim /lib/udev/touch.sh
Run Code Online (Sandbox Code Playgroud)

在该文件中写入:

#!/bin/bash
touch /tmp/test
Run Code Online (Sandbox Code Playgroud)

使其可执行:

chmod +x /lib/udev/touch.sh
Run Code Online (Sandbox Code Playgroud)

并将您的规则文件更改为:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"
Run Code Online (Sandbox Code Playgroud)

重新加载你的 udev 规则

udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)

这将再次读取您的规则/lib/udev/rules.d/*。直到现在,更改才适用。

请注意,udev 在简化的环境中执行您的脚本PATH。您必须确保任何不在配置路径内的二进制文件都必须使用完整路径进行访问。您还可以扩展PATH脚本中的环境。

set通过将包装器脚本的输出记录到日志文件来检查定义的路径:

set >>/tmp/udev-env-test
Run Code Online (Sandbox Code Playgroud)

它可能看起来像这样:

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
Run Code Online (Sandbox Code Playgroud)