Posso mascarar um kernel uevent?

4

O que eu acho que acontece

Pelo que entendi, é isso que acontece quando conecto um dispositivo USB ao meu computador:

  1. O Kernel reconhece que eu conectei um dispositivo USB
  2. O Kernel configura as coisas de muito baixo nível para o novo dispositivo, como drivers etc.
  3. O
  4. Kernel envia um uevent para o daemon udev .
  5. O daemon do Udev usa as informações enviadas para preencher os arquivos apropriados em /dev .

O que eu quero fazer

Eu estava pensando que talvez eu pudesse pular diretamente para o passo 3 enviando manualmente um uevent para o udev. Como o uevent é enviado via netlink e o netlink é baseado em sockets , teoricamente isso deveria ser possível, já que eu só preciso saber qual socket para escrever. Alguém que tenha alguma ideia se isso pode funcionar e como?

    
por Pithikos 23.01.2015 / 15:50

1 resposta

1

disparador do udevadm

1. experimenta

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

acionará /dev/sdd remove uevent, conteúdo como

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 it

veja o que ele dose:

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. resumir

na verdade, só faz

echo 'remove' | sudo tee /sys/block/sdd/uevent

dessa forma ainda depende do sysfs:

    O
  • dispositivo sysfs deve existir
  • não é totalmente personalizado uevent message body

o arquivo sysfs uevent:

cat /sys/block/sdd/uevent
MAJOR=8
MINOR=48
DEVNAME=sdd
DEVTYPE=disk

refs: link link

    
por 24.09.2017 / 07:48