Como o by-id é criado no Linux?

5

Colocar um microcontrolador USB na porta (semelhante ao Arduino) cria esses dois arquivos:

/dev/serial/by-id/usb-MBED_MBED_CMSIS-DAP_10105a42e87da33c103dccfb6bc235360a97-if01
/dev/disk/by-id/usb-MBED_microcontrolleur_10105a42e87da33c103dccfb6bc235360a97-0:0

Os ids, neste caso, são gerados dinamicamente por um programa ou são codificados em algum lugar do próprio dispositivo?

Se for criado imediatamente:

  1. Como exatamente é criado?
  2. Existirá apenas em máquinas Linux?
por Pithikos 13.11.2014 / 17:38

2 respostas

2

O nome do arquivo é gerado pelo udev, mas o id dentro dele vem do próprio dispositivo:

Se você executar lsusb -v e pesquisar por ele, verá que é o ID serial do dispositivo:

...
iManufacturer        MBED
iProduct             microcontrolleur
iSerial              10105a42e87da33c103dccfb6bc235360a97

ou algo similar.

Como isso acontece?

Digamos que o stick usb seja montado em /mnt/tmp . No meu sistema eu recebo:

$ udevadm info --device-id-of-file /mnt/tmp
8:17

Agora, execute isso e pesquise 8:17 :

$ udevadm info --export-db | less
...
P: /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1
N: sdb1
W: 61
S: block/8:17
S: disk/by-id/usb-pqi_IntelligentStick_AA04212900042956-0:0-part1

Isso nos dá o caminho do dispositivo para usar com o udevadm. Execute isso e pesquise seu ID de dispositivo ( AA042... no meu caso)

$ udevadm test /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 2>&1 | less
...
udev_rules_apply_to_event: LINK 'disk/by-id/usb-pqi_IntelligentStick_AA04212900042956-0:0-part1' /lib/udev/rules.d/60-persistent-storage.rules:31

Isso nos dá todas as regras do udev + números de linha aplicados ( 60-persistent-storage.rules:31 etc)

E aqui é de onde vem o nome do arquivo:

$ /lib/udev/usb_id /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb
pqi_IntelligentStick_AA04212900042956-0:0
    
por 14.11.2014 / 18:52
3
Os

by-id links simbólicos são criados pelas regras udev (e são específicos dos sistemas operacionais que usam udev )

Você pode encontrar as regras específicas em /lib/udev/rules.d :

para serial de dispositivos em 60-persistent-serial.rules :

ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}"
ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$env{ID_USB_INTERFACE_NUM}-port$env{.ID_PORT}"

e para os dispositivos disk em 60-persistent-storage.rules :

KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
    
por 14.11.2014 / 00:16

Tags