我可以伪装内核 uevent 吗?

我可以伪装内核 uevent 吗?

我认为会发生什么

根据我的理解,当我将 USB 设备连接到计算机时会发生以下情况:

  1. 内核识别出我插入了 USB 设备
  2. 内核为新设备设置非常低级的东西,例如驱动程序等。
  3. uevent内核向守护进程发送一个udev
  4. Udev 守护进程使用发送的信息来填充/dev.

我想做的事

我当时想也许我可以直接跳到步骤3通过手动向 udev 发送 uevent。由于 uevent 是通过 netlink 发送的并且netlink是基于socket的,理论上这应该是可能的,因为我只需要知道要写入哪个套接字。任何人都知道这是否可行以及如何运作?

答案1

udevadm 触发器

1. 尝试一下

sudo udevadm trigger --verbose --action=remove --property-match='DEVNAME=/dev/sdd'

会触发一个/dev/sddremove 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/

相关内容