Как создается by-id в Linux?

6501
Pithikos

Прикрепление 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?
5

2 ответа на вопрос

3
Alex P.

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

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

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

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

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

KERNEL=="sd*|sr*|cciss*", ENV=="disk", ENV=="?*", SYMLINK+="disk/by-id/$env-$env" 
2
lemonsqueeze

Имя файла генерируется 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т. Д.)

And here's where the file name comes from:

$ /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 
Вопрос в том, как lsusb получает эту информацию ... потому что он может использовать `udev`, как` udisks`. Pithikos 10 лет назад 0
Вы можете убедиться, что серийный номер действительно исходит от самого устройства, запустив ChipGenius под Windows. lemonsqueeze 10 лет назад 0
как показал alex, `udev` просто объединяет серийный идентификатор ядра в большую строку. `lsusb` или` lsblk` используют один и тот же серийный идентификатор. предательства не происходит. не стесняйтесь доверять встроенным командам `ls`; в противном случае, что вы можете доверять? underscore_d 9 лет назад 0

Похожие вопросы