5

Прикрепление USB-микроконтроллера к порту (аналог Arduino) создает следующие два файла:

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

Идентификаторы в этом случае генерируются программой на лету или они жестко запрограммированы где-то на самом устройстве?

Если он создан на лету:

  1. Насколько точно это создано?
  2. Будет ли он существовать только на машинах Linux?

2 ответа2

3

символические ссылки by-id создаются правилами udev (и специфичны для ОС, использующих udev)

Вы можете найти конкретные правила в /lib/udev/rules.d:

для serial устройств в 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}"

и для disk устройств в 60-persistent-storage.rules:

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

Имя файла генерируется udev, но идентификатор внутри него исходит от самого устройства:

если вы запустите lsusb -v и выполните поиск, вы увидите, что это серийный идентификатор устройства:

...
iManufacturer        MBED
iProduct             microcontrolleur
iSerial              10105a42e87da33c103dccfb6bc235360a97

или что-то подобное.


Как это произошло ?

Допустим, USB-флешка монтируется в /mnt/tmp . В моей системе я получаю:

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

Теперь запустите это и найдите 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

Это дает нам путь к устройству для использования с udevadm. Запустите это и найдите идентификатор вашего устройства (AA042... в моем случае)

$ 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

Это дает нам все применяемые правила udev + номера строк (60-persistent-storage.rules:31 т.д.)

И вот откуда берется имя файла:

$ /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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .