Не могли бы вы порекомендовать способ выяснить, какой драйвер используется для устройства USB. Вроде USB-эквивалент lspci -k
команды.
Не могли бы вы порекомендовать способ выяснить, какой драйвер используется для устройства USB. Вроде USB-эквивалент lspci -k
команды.
Ответы:
$ lsusb
Bus 010 Device 002: ID 046d:c01e Logitech, Inc. MX518 Optical Mouse
Bus 010 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Мы попытаемся выяснить, какой драйвер используется для ИБП APC. Обратите внимание, что есть два ответа на этот вопрос: драйвер, который будет использовать ядро, и драйвер, который используется в данный момент. Userspace может поручить ядру использовать другой драйвер (и в случае с моим ИБП APC nut
).
usbutils
Пакет (на Debian, по крайней мере) включает в себя скрипт usb-devices
. Если вы запустите его, он выведет информацию об устройствах в системе, включая используемый драйвер:
$ usb-devices
⋮
T: Bus=10 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 3 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=051d ProdID=0002 Rev=01.06
S: Manufacturer=American Power Conversion
S: Product=Back-UPS RS 1500 FW:8.g9 .D USB FW:g9
S: SerialNumber=XXXXXXXXXXXX
C: #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=24mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbfs
⋮
Обратите внимание, что здесь указан текущий драйвер, а не драйвер по умолчанию. Нет способа найти способ по умолчанию.
Если у вас смонтированы debugfs, ядро поддерживает файл в том же формате, в котором usb-devices
распечатывается /sys/kernel/debug/usb/devices
; вы можете просматривать сless
и т. д. Обратите внимание, что интерфейсы debugfs нестабильны, поэтому разные версии ядра могут печатать в другом формате или полностью отсутствовать в файле.
Еще раз, это показывает только текущий драйвер, а не по умолчанию.
Вы можете получить информацию /sys
, думал, что это более болезненно, чем lspci
. Эти /sys
интерфейсы должны быть достаточно стабильными, поэтому, если вы пишете сценарий оболочки, возможно, именно так вы и захотите это сделать.
Первоначально, lsusb
кажется, считает устройства от 1 до /sys
0. Таким образом, 10-2 является хорошим предположением о том, где найти ИБП APC, который lsusb выдает как шину 10, устройство 3. К сожалению, со временем это отображение прерывается - sysfs повторно использует числа даже когда номера устройств нет. В devnum
содержимом файле будет совпадать с номером устройства , данный lsusb, так что вы можете сделать что - то вроде этого:
$ grep -l '^3$' /sys/bus/usb/devices/10-*/devnum # the ^ and $ to prevent also matching 13, 31, etc.
/sys/bus/usb/devices/10-2/devnum
Так что, в этом случае, это определенно 10-2
.
$ cd /sys/bus/usb/devices/10-2
$ ls
10-2:1.0 bDeviceClass bMaxPower descriptors ep_00 maxchild remove urbnum
authorized bDeviceProtocol bNumConfigurations dev idProduct power serial version
avoid_reset_quirk bDeviceSubClass bNumInterfaces devnum idVendor product speed
bcdDevice bmAttributes busnum devpath ltm_capable quirks subsystem
bConfigurationValue bMaxPacketSize0 configuration driver manufacturer removable uevent
Мы можем быть уверены, что это правильное устройство, cat
используя несколько файлов:
$ cat idVendor idProduct manufacturer product
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9
Если вы посмотрите в 10-2: 1.0 ( :1
это «конфигурация», .0
интерфейс - одно USB-устройство может делать несколько вещей и иметь несколько драйверов; lsusb -v
покажет их), есть файл modalias и символическая ссылка на драйвер:
$ cat 10-2\:1.0/modalias
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs
Итак, текущий драйвер есть usbfs
. Вы можете найти драйвер по умолчанию, задав вопрос modinfo
о модальностях:
$ /sbin/modinfo `cat 10-2\:1.0/modalias`
filename: /lib/modules/3.6-trunk-amd64/kernel/drivers/hid/usbhid/usbhid.ko
license: GPL
description: USB HID core driver
author: Jiri Kosina
author: Vojtech Pavlik
author: Andreas Gal
alias: usb:v*p*d*dc*dsc*dp*ic03isc*ip*in*
depends: hid,usbcore
intree: Y
vermagic: 3.6-trunk-amd64 SMP mod_unload modversions
parm: mousepoll:Polling interval of mice (uint)
parm: ignoreled:Autosuspend with active leds (uint)
parm: quirks:Add/modify USB HID quirks by specifying quirks=vendorID:productID:quirks where vendorID, productID, and quirks are all in 0x-prefixed hex (array of charp)
Таким образом, ИБП APC по умолчанию настроен на hid
драйвер, что действительно правильно. И в настоящее время он использует usbfs, что правильно, поскольку nut
s usbhid-ups
контролирует его.
Когда драйвер есть usbfs
, это в основном означает, что программа пользователя (не ядро) работает как драйвер. Поиск нужной программы требует наличия пользователя root (если программа не выполняется от имени вашего пользователя), и это довольно просто: какая бы программа не открывала файл устройства.
Мы знаем, что нашим «жертвенным» устройством является шина 10, устройство 3. Итак, файл устройства /dev/bus/usb/010/003
(по крайней мере, на современном Debian) lsof
дает ответ:
# lsof /dev/bus/usb/010/003
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
usbhid-up 4951 nut 4u CHR 189,1154 0t0 8332 /dev/bus/usb/010/003
И действительно, это usbhid-ups
как и ожидалось (lsof урезал имя команды для подгонки макета, если вам нужно полное имя, вы можете использовать его ps 4951
для получения или, возможно, некоторые параметры форматирования вывода lsof).
/sys/bus/usb/devices
является правильным. У меня есть устройство на шине 1, которое usb-devices
говорит , что это устройство 12, но в /sys/bus/usb/devices/1-11
моей системе его нет.
lsusb
Сам может дать вам хорошие результаты. Для компактного вывода я использую lsusb -t
, где-t
показывает устройства в виде дерева; этот формат сообщает драйвер также.
Пример вывода:
$ lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
...
Если драйвер не используется, строка будет выглядеть следующим образом (устройство в моем примере - это камера, для которой я удалил драйвер из ядра):
|__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
Помимо того, что написал Дероберт, я использую
lsusb -t
Который напечатает дерево с различной информацией о подключенных устройствах, включая полезную часть «Драйвер».
а также
dmesg | grep driver
который перечислит вам драйверы последних подключенных устройств.
Плюсы в том, что эти две команды поставляются со всеми дистрибутивами.