Информация в /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? и т. д. Вы не сможете предсказать все угловые случаи, поэтому убедитесь, что не удалось изящно.