我希望在驱动器(特定驱动器或任何驱动器)热插拔时自动运行特定命令。我正在运行无头 Debian 系统。
更具体地说,我想自动安装驱动器。我可以使用 AutoFS 来实现这一点,但这是一个 Truecrypt 驱动器,据我所知,AutoFS 无法与该驱动器配合使用。因此,每当驱动器连接时,我都需要执行某种脚本,该脚本将检测驱动器并运行必要的命令。
我如何才能在驱动器连接时自动执行某些操作?那么,我如何才能在驱动器被移除时执行其他操作?
答案1
这其实很简单:你需要编写一个自定义的 udev 规则,你可以将其放在
/etc/udev/rules.d/10-local.rules
这样做的好处是您的自定义规则将在其他规则之前被读取。
该文件将包含此形式的一行。
<conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
这句话的意思是:
- “需满足的条件”是一系列特定于您的磁盘的条件,它们可以唯一地标识该磁盘,以便在插入不同的硬盘时不会执行任何操作;
- KERNEL=="sd?1" 告诉 udev 仅在检测到新分区 /dev/sda1、/dev/sdb1、... 时才开始检查此规则。如果需要,您可以对设备而不是分区执行相同操作,在这种情况下 KERNEL=="sd?" 是合适的语句。
- NAME="my_usb_adapter" 将在 /dev/my_usb_adapter 创建一个持久节点,这样如果您需要挂载它,您就知道在哪里可以找到要挂载的设备。
- RUN 规则是不言而喻的。记住,
my_program
无需终端输入或输出即可执行。
您可以使用以下命令获取执行匹配所需的信息:
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
如果您的磁盘是 /dev/sdb,否则请根据需要进行修改。这将提供大量信息。我会搜索
ATTRS{idVendor}=="18a5"
ATTRS{idProduct}=="0302"
ATTRS{serial}=="TT0E4E008XW3DT9H"
(这些值是我的一个 USB 加密狗的,您的值会有所不同)。一个重要的警告:匹配规则必须取自相同的父设备,您不能混合它们。
现在我们可以将最终规则写成:
ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0302", ATTRS{serial}=="TT0E4E008XW3DT9H", KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
请记住,udev 文件不能换行:如果换行,udev 会将换行视为两个单独的规则。终端不会有任何输出。另外,我在区分 、 和 时非常小心=
:==
请+=
确保您不会在此引入任何错误。