在当前的 Linux 发行版(如 Debian/CentOS/Fedora)下,通过 USB 设备插件自动执行自定义脚本的最先进方法是什么?
例如,如果您想根据 UUID(或设备 ID 等)自动挂载/复制某些文件/卸载 USB 大容量存储设备。
答案1
将这样的行放入以下文件中/etc/udev/rules.d
:
KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"
添加一个子句,例如NAME="subdir/mydisk%n"
如果您想在 下使用自定义条目路径/dev
。
运行udevadm info -a -n sdb
以查看可以匹配哪些属性(attribute=="value"
;替换sdb
为自动分配给磁盘的设备名称,对应于/dev
插入磁盘时创建的新条目)。请注意,您可以使用ATTRS
任意子句一stanza:您可以选择任何节,但ATTRS
子句必须全部来自同一节,不能混合搭配。您可以将ATTRS
子句与不同节中列出的其他类型的子句混合使用。
答案2
我查找了/lib/udev/rules.d
磁盘相关规则的示例。在 Ubuntu 系统上,一个规则文件提供了ID_FS_UUID_ENC
可以在自己的规则文件中使用的环境变量。
因此我将自定义规则文件放在/etc/udev/rules.d/foodevice.rules
.由于它没有数字前缀,因此最后由 udev 运行。顺便说一句,udev 守护进程会监视/etc/udev/rules.d
更改,这样您就不需要在文件更改时重新启动它。
其内容/etc/udev/rules.d/foodevice.rules
为:
ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"
(这是一条规则 - 您必须删除 ENV 子句后的换行符,因为 udev 没有行继续机制)
由 udev 启动的程序会阻塞守护进程 - 因此它不会运行很长时间。我通过以下方式解决了这个问题at
- 即通过脱离实际工作的流程:
$ cat /home/juser/path/script.sh
#!/bin/sh
echo /path/to/mountcopystuff.sh | at now