我尝试通过环境变量获取最后连接的磁盘的路径,即像/dev/sd*
.问题是 DEVNAME 或 DEVPATH 未提供所需的路径。
目标是echo $...... > /var/.....
一旦存储了值,并使用 RUN += 执行不同的操作...我在需要时将其取出。我希望我的解释很清楚,谢谢
在本例中,我试图获取当前磁盘的路径/dev/sd*
。我使用 udev 规则来执行操作
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh" SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"
问题是,当我使用 echo $KERNEL > my-file 检索时,我找不到当前磁盘的路径。我需要这个变量来从刚到达的磁盘执行 smartctl 命令。
在 device_added.sh 中,目标是启动smartctl -a /dev/sd*
命令,除了我们替换/dev/sd*
为最后连接的磁盘,所以现在这是我的问题,我需要恢复最后连接的磁盘/udev
规则检测到的路径。
答案1
我仍然不确定我是否正确理解了这个问题。
问题是“当我在 udev 规则内使用 RUN 执行程序时,如何访问内核为该事件创建的实际设备节点”?如果是,请查看KERNEL
环境变量(请参阅 参考资料man udev
),其中包含实际的内核设备,例如,sda
当您连接或移除硬盘时。
如果这不是您想要的,请解释一下你需要这个做什么,即您想要/dev/sda
出于什么目的执行哪些操作。另请阅读XY问题。
您的问题是您正在匹配 USB 设备的事件(这些设备允许您在 USB 级别与它们通信,并且不只限于磁盘),而不是添加实际磁盘的事件。你需要类似的东西
KERNEL=="sd*", SUBSYSTEMS=="usb", ACTION=="add", ...
要么不带 DEVTYPE,要么带ENV{DEVTYPE}="disk"
.
进一步阅读man udev
,还有环境变量DEVNODE
,它应该包含新创建节点的完整路径(我没有测试这一点)。
最后,如果您想运行命令,请记住smartctl
以下段落:RUN
man udev
这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止该设备或从属设备的所有进一步事件。
启动守护进程或其他长时间运行的进程不适合 udev;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。
所以取决于什么您想要做的事情smartctl
,它可能是也可能不是正确的地方。
我已经尝试过您的规则不起作用,无法识别磁盘并且脚本无法运行。我尝试过
KERNEL=="sd[a-z]"
不工作。
那么您的规则中的其他内容是错误的(例如未满足的附加条件)。如果udev
添加/dev/sd*
,则规则为KERNEL=="sd[a-z]"
将要匹配。
udevadm info -p /sys/class/block/sdx
请编辑您的问题并添加插入磁盘后获得的信息,它显示为/dev/sdx
(sdx
根据需要替换)。与您使用的不起作用的规则进行比较。