我认为会发生什么
根据我的理解,当我将 USB 设备连接到计算机时会发生以下情况:
- 内核识别出我插入了 USB 设备
- 内核为新设备设置非常低级的东西,例如驱动程序等。
uevent
内核向守护进程发送一个udev
。- Udev 守护进程使用发送的信息来填充
/dev
.
我想做的事
我当时想也许我可以直接跳到步骤3通过手动向 udev 发送 uevent。由于 uevent 是通过 netlink 发送的并且netlink是基于socket的,理论上这应该是可能的,因为我只需要知道要写入哪个套接字。任何人都知道这是否可行以及如何运作?
答案1
udevadm 触发器
1. 尝试一下
sudo udevadm trigger --verbose --action=remove --property-match='DEVNAME=/dev/sdd'
会触发一个/dev/sdd
remove uevent,内容为
remove@/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd
SUBSYSTEM=block
MAJOR=8
MINOR=48
DEVNAME=sdd
DEVTYPE=disk
SEQNUM=12589
2.strace
它
看看他服用什么剂量:
sudo strace udevadm trigger --verbose --action=remove --property-match='DEVNAME=/dev/sdd'
...
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 37), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0596a7000
write(1, "/sys/devices/pci0000:00/0000:00:"..., 101/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd
) = 101
open("/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd/uevent", O_WRONLY) = 3
write(3, "remove", 6) = 6
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++
3.总结
实际上,它只是
echo 'remove' | sudo tee /sys/block/sdd/uevent
这种方式仍然依赖于sysfs:
- 设备 sysfs 必须存在
- 无法完全自定义uevent消息体
sysfs uevent 文件:
cat /sys/block/sdd/uevent
MAJOR=8
MINOR=48
DEVNAME=sdd
DEVTYPE=disk
参考文献:
http://fibrevillage.com/sysadmin/93-udevadm-useage-examples
http://arakilab.media.eng.hokudai.ac.jp/~msylw/2013/07/using-udev-to-trigger-events-in-example/