我的 udev 规则之一运行一个有关删除 USB 存储设备的脚本。此脚本执行一些常规清理并删除存储设备的安装点目录。问题是我希望能够从我的 C++ 应用程序以编程方式触发此逻辑(而不是在 USB 闪存驱动器被热插拔移除时触发,这似乎为时已晚)。
实现这一点的正确方法似乎是直接将事件添加到 udev 事件队列上。我能够使用 udevadm 实现所需的操作,但在 libudev 库中没有看到等效的 API。
udevadm trigger --action=remove --property-match=DEVNAME=/dev/sda1
有没有办法通过 dbus 访问 udev 来实现这一点?有没有一个图书馆可以让我这样做?这最终不是 udev 应该如何工作吗?我应该卸载并清理应用程序中的块设备,而不是让 udev 这样做吗?
答案1
看来您正在寻找的是sysfs 文件系统uevent
中的伪文件/sys
。
通过向该文件写入命令(例如"remove"
),内核会将这些命令转发到设备事件的用户空间处理程序,即 udevd。
因此,执行与以下代码片段等效的操作(以 shell 为例)应该可以完成您想要的操作,请求 udev 删除设备/dev/sda1
:
# echo -n "remove" >/sys/class/block/sda1/uevent
您可以使用 libudev API(例如,udev_device_get_syspath(3)帮助您找到给定设备的正确 sysfs 路径。
您可以在下面找到内核方面的一些文档对象。
您还可以在 udev 的文档中找到一些提及“uevents”的内容,例如“systemd-udevd 监听内核 uevents”udevd 的手册页。
但似乎没有很多关于uevent
sysfs 伪文件的文档......