Linux: Как сопоставить блочное устройство с USB-устройством? - PullRequest
4 голосов
/ 16 августа 2010

если я подключаю USB-накопитель, я вижу новую папку в / sys / bus / usb / devices ... таким образом, новое USB-устройство.

Также я вижу новую папку в / sys / block ... таким образом, новое блочное устройство.

Мой вопрос: как я могу получить водонепроницаемое отображение между этими двумя устройствами? Средства: Если я получу новое устройство в / sys / bus / usb / devices, как мне программно (например, проверяя / sys / ...) узнать, какое блочное устройство сопоставлено / связано с этим usb-устройством и наоборот? !

Ответы [ 2 ]

5 голосов
/ 16 августа 2010

Информация в /sys организована несколькими способами (по водителю, по шине и т. Д.), И существует много символических ссылок для перехода из одной иерархии в другую.

Показательный пример (пример на ядре 2.6.26): начиная с блочного устройства в /sys/block/sdc, символическая ссылка /sys/block/sdc/device указывает внутри иерархии для каждого типа устройства. Вы можете видеть, что это устройство USB, потому что цель ссылки - что-то вроде

../../devices/pci0000:00/0000:00:1d.7/usb8/8-2/8-2:1.0/host9/target9:0:0/9:0:0:0

И наоборот, USB-устройства перечислены в /sys/bus/usb/devices, и мы видим, что 8-2:1.0 является дискообразным устройством, поскольку /sys/bus/usb/devices/8-2:1.0/driver ссылается на usb-storage. Чтобы выяснить, что представляет собой связанное блочное устройство, нам нужно перейти в каталог /sys/bus/usb/devices/8-2:1.0/host9/target9:0:0/9:0:0:0, который содержит символическую ссылку block:sdc, цель которого /sys/block/sdc.

ДОБАВЛЕНО : Внимание: точная структура /sys меняется с версии ядра на версию ядра. Например, с ядром 2.6.32 /sys/block/sdc/device указывает прямо на /dev/bus/scsi без прохождения USB-прыжка.


Другой подход - вызвать команду udevadm info. udevadm info -p /sys/block/sdc --query=… предоставляет информацию об устройстве на основе его записи /sys, а udevadm info -n sdc --query=… - информацию об устройстве /dev/sdc.

Информация включает в себя информацию об автобусе, например, udevadm info -p /sys/block/sdc --query=env показывает

ID_BUS=usb
ID_PATH=pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0

Документация udev может содержать больше информации, которая вас интересует.


Последнее слово предостережения: существуют всевозможные сложные футляры, которые могут сделать все, что вы делаете, не таким водонепроницаемым. Как ваша программа будет работать с одним USB-устройством, которое представляет собой массив дисков, которым назначено несколько блочных устройств? И наоборот, как ваша программа будет работать с RAID-массивом, собранным из нескольких устройств (возможно, некоторые из них USB, а некоторые нет)? Вы заботитесь о других типах сменных носителей, таких как Firewire и e-SATA? и т. д. Вы не сможете предсказать все угловые случаи, поэтому убедитесь, что не удалось изящно.

0 голосов
/ 25 августа 2010

Насколько я понял, доступ к информации udev возможен через библиотеку "libudev".В сети также есть хороший пример: http://www.signal11.us/oss/udev/

Я смог изменить его так, чтобы он считывал все устройства "/ dev / sd *" и получал их Vendor-ID, Product-ID, а такжеСерийный номер.Я думаю, что это решение достаточно независимое от ядра / linux.Но я все еще должен это проверить.

...