我使用的是 Ubuntu 20.04。
我试图在使用 UUID 识别驱动器的 udev 规则连接特定硬盘驱动器时执行操作。该脚本最终将执行一个例程,它将安装驱动器并运行 rsync。为了排除该过程中的任何错误,我现在只是尝试一个测试命令。
硬盘通过 SATA Hotswap 连接,并且有一个已确认正确的 UUID。我遵循了许多似乎使用此确切语法的指南,但无论我如何尝试,仍然没有任何反应。
以下是我已完成的步骤:
- 在 中创建了一个名为 90-backup.rules 的文件
/etc/udev/rules.d
。内容是:
ACTION=="add", ENV{ID_FS_UUID}=="b527aadc-9dce-4ead-8937-e53ca2cfac84", RUN+="/bin/echo 1 >> /rule.test"
尝试过
udevadm control --reload-rules && udevadm trigger
尝试过
systemctl reload udev
运行
udevadm test /dev/sdX
我可以看到它列出了规则文件:
Reading rules file: /etc/udev/rules.d/90-backup.rules
使用
udevadm info /dev/sdX
确认ID_FS_UUID环境变量正确并且可以读取。尝试在参数
KERNEL=='sd?'
之前添加ACTION
。
由于服务器当前正在使用中,我还没有尝试重新启动它。最好一劳永逸地确定让 udev 在不重新启动的情况下正确重新加载规则所需的内容,以进行正确的调试。
任何帮助表示赞赏。
祝一切顺利,安德烈亚斯
答案1
RUN+="/bin/echo 1 >> /rule.test
udev
不要尝试重定向输出(我认为在规则进程中完成时这实际上不起作用RUN
),而是让RUN
进程使用 shell 脚本来运行您需要的任何命令。
在调试过程中,跟踪脚本何时工作会很有用,因此通过将以下代码保存到/usr/local/bin/myscript.sh
(显然给它任何你想要的名称)来创建一个 shell 脚本:
#!/bin/sh
printf '%s\n' "Script run by udev $( date +%c )" > /tmp/rule-test
每当脚本运行时,上面的脚本都会将当前时间写入目录rule-test
中的文件中。/tmp
但你需要给脚本执行权限:
sudo chmod +x /usr/local/bin/myscript.sh
现在更改您的 udev 规则,以便 RUN 部分包含脚本的完整路径:
ACTION=="add", ENV{ID_FS_UUID}=="b527aadc-9dce-4ead-8937-e53ca2cfac84", RUN+="/usr/local/bin/myscript.sh"
最后重新加载udev
规则:
sudo udevadm control --reload
现在连接您的硬盘并查看时间是否被写入/tmp/rule-test
。
一旦它起作用,您就可以设置myscript.sh
执行您想要的不同操作(rsync
例如运行),并且不必继续更改 udev 规则 - 只需更改 shell 脚本即可。
udev
在不重新启动的情况下正确重新加载规则需要什么
使用sudo udevadm control --reload
。