udev 规则不起作用

udev 规则不起作用

我创建了一个udev规则,应该安装 USB 设备、备份一些数据并清理所有内容。我实际上正在Debian服务器上工作。

这里有关于我的 USB 设备的信息lsusb

总线 001 设备 003:ID 054c:0243 Sony Corp. MicroVault 闪存驱动器

(实际上lsusb返回更多总线/设备,但我必须手工编写它们,因为我不是从我的 Debian 机器发布:))

然后我写了我的udev规则:

10-usb_back.rules

进入:

/etc/udev/rules.d/

(我使用 95 是因为备份脚本需要几秒钟,我想尽可能晚地运行它以避免延迟其他事情)

最后是规则本身:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="054c", ATTR{idProduct}=="0243", RUN+="/usr/local/bin/mount_usb"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="054c", ATTR{idProduct}=="0243", RUN+="/usr/local/bin/backup_database"

我也尝试过这个:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="0234", RUN+="bash /usr/local/bin/mount_usb"

不成功 :(

然后我重新启动udev

sudo /etc/init.d/udev restart

当我插入 USB 设备时,我收到了这条奇怪的消息:

[1348.295280] sd 6:0:0:0: [sdc] 假设驱动器缓存:直写

两次

但什么也没发生。未安装 USB 设备,未备份数据。

I looked with tail -f /var/log/message

USB 驱动器看起来已检测到:

usb 1-3: Product Storage Media 
usb 1-3 Manufacturer Sony`
...

一定是某个地方出了问题,但我不知道是什么,也不知道在哪里:(

编辑:由于我有点懒,因为我无法重写服务器上的所有内容,因此如果需要,请询问更多信息,例如脚本或更多日志消息:)

答案1

这是我在热插拔上执行备份的工作 udev 规则:

SUBSYSTEM=="block" ACTION=="add" \
      ENV{DEVTYPE}=="partition" \
      ENV{ID_FS_UUID}=="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
      TAG+="store" \
      RUN+="/usr/bin/python3 /etc/systemd/autoback.py --udev"

/dev/sde1请注意,我不是匹配 USB 设备,而是匹配该 USB 设备的大容量存储端点上的分区(即)。 USB 热插拔后,磁盘准备就绪并枚举分区需要几秒钟的时间,因此这是适合我的用例的“正确”事件,如果您尝试进行备份,也可能是您的用例。与该分区ID_FS_UUID报告的相同。blkid就我而言,这是luksUUID。

在我的系统上,当我编辑规则时,udev 似乎无法自动正确重新加载,但我发现有效的(这对于调试也很有用)是:

udevadm test /sys/dev/block/8:65

强制重新加载/重新应用 udev 规则。请注意,我是8:65通过找到的ls -l /dev/block | grep sde1。还

udevadm info --query=property /dev/sde1

有助于查看我的规则是否适用,并且

注意:我在OP发布五年后发布这个答案,所以现在的情况可能与那时不同。我的系统是arm64上的ubuntu 16.04.4 (xenial)。

答案2

您拼写错误 ATTR,在本例中应该是 ATTRS。

答案3

尝试查看输出,udevadm info --path=path/to/device --attribute-walk它会告诉您对设备有效的每个属性和子系统。例如,我的 USB 设备有一个SUBSYSTEM="tty", 来识别您需要放置的该设备的 USB SUBSYSTEMS=="usb"(注意:复数子系统*s*)。我怀疑这里可能就是这样的情况。无论哪种方式udevadm info --attribute-walk对于调试 udev 问题都是非常有用的工具。

另外 ATTR{key} 无效,请使用 ATTRS{key} (之前提到过,但您的一些示例仍然使用不正确的形式。)

答案4

idProduct规则部分不是有错别字吗?

你有这个:

ATTR{idProduct}=="0234"

不应该是这样吗:

ATTR{idProduct}=="0243"

基于此行的输出:

Bus 001 Device 003: ID 054c:0243 Sony Corp. MicroVault Flash Drive

相关内容