我创建了一个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
就我而言,这是luks
UUID。
在我的系统上,当我编辑规则时,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