udev 规则在任何硬盘驱动器热插拔时运行 shell 脚本

udev 规则在任何硬盘驱动器热插拔时运行 shell 脚本

sh每次将硬盘驱动器热插拔到我的计算机时,我都想运行自定义脚本,无论驱动器的品牌、型号或其他规格如何。

我的 udev 规则如下/etc/udev/rules.d/10-TEST-RULE.rules

ACTION=="add", KERNEL=="sd*", RUN+="/usr/loca/bin/DRIVE_INSERT_MESSAGE.sh"

我重新加载了udev规则几次,并在大多数更改后重新启动了我的设备。出什么问题了?

答案1

问题的性质

您遇到的问题是,udevd默认情况下,Ubuntu 中不会在根 Linux 内核命名空间中运行。

# ps -axe -o user,pid,ipcns,mntns,netns,pidns,userns,utsns,comm | awk '$3!="-"' | grep -E "udevd|$$|MNTNS"
USER         PID      IPCNS      MNTNS      NETNS      PIDNS     USERNS      UTSNS COMMAND
root         477 4026531839 4026532239 4026531840 4026531836 4026531837 4026532259 systemd-udevd
root     1663933 4026531839 4026531841 4026531840 4026531836 4026531837 4026531838 bash

任何安装udevd对于计算机上运行的其余进程都是不可见的。您的DRIVE_INSERT_MESSAGE.sh脚本在无法与系统的许多其他部分通信的命名空间中运行。

要进一步调试您的问题,请运行sudo nsenter --all -t $(pgrep systemd-udevd) /bin/bash它将带您进入一个与udevd.然后您可以探索并调整您的DRIVE_INSERT_MESSAGE.sh脚本。

也可以看看

  • /usr/lib/udev/rules.d供参考 udev 规则
  • udevadm用于与 udev 交互,EG 在故障排除时触发 udev 事件
  • sudo systemctl edit systemd-udevd调整 udevd systemctl 单元
  • udevadm test-builtin --help列出内置 udev 模块

长话短说

您的脚本很可能正在运行,但它在受限的内核命名空间中运行。

相关内容