Узнайте, какие модули связаны с USB-устройством?

35

Не могли бы вы порекомендовать способ выяснить, какой драйвер используется для устройства USB. Вроде USB-эквивалент lspci -kкоманды.

TheMeaningfulEngineer
источник

Ответы:

57

Поиск драйверов ядра

Устройство жертвы

$ 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).

Способ 1: использование usbutils (легко)

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
⋮

Обратите внимание, что здесь указан текущий драйвер, а не драйвер по умолчанию. Нет способа найти способ по умолчанию.

Способ 2: использование debugfs (требуется root)

Если у вас смонтированы debugfs, ядро ​​поддерживает файл в том же формате, в котором usb-devicesраспечатывается /sys/kernel/debug/usb/devices; вы можете просматривать сless и т. д. Обратите внимание, что интерфейсы debugfs нестабильны, поэтому разные версии ядра могут печатать в другом формате или полностью отсутствовать в файле.

Еще раз, это показывает только текущий драйвер, а не по умолчанию.

Способ 3. Использование только основных утилит для непосредственного чтения / sys (лучше всего подходит для сценариев или восстановления)

Вы можете получить информацию /sys, думал, что это более болезненно, чем lspci. Эти /sysинтерфейсы должны быть достаточно стабильными, поэтому, если вы пишете сценарий оболочки, возможно, именно так вы и захотите это сделать.

Первоначально, lsusbкажется, считает устройства от 1 до /sys0. Таким образом, 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, что правильно, поскольку nuts usbhid-upsконтролирует его.

А как насчет драйверов userpace (usbfs)?

Когда драйвер есть 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).

derobert
источник
Я определенно проиграю в своих постоянных дебатах с моим другом Windows против Linux с этим :). Дадим несколько дней, чтобы посмотреть, появится ли более простое решение. Спасибо за попытку.
TheMeaningfulEngineer
@ Алан Хорошо, я нашел еще два способа, один из которых довольно прост. Кроме того, я уточнил, какой из двух возможных ответов на «какой драйвер?» каждый метод обеспечивает.
Дероберт
Я не думаю, что ваше утверждение о местонахождении устройства /sys/bus/usb/devicesявляется правильным. У меня есть устройство на шине 1, которое usb-devicesговорит , что это устройство 12, но в /sys/bus/usb/devices/1-11моей системе его нет.
15:15
@ Церин действительно нет. Я положу в лучшем. Спасибо.
Дероберт
13

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
Nert
источник
0

Помимо того, что написал Дероберт, я использую

lsusb -t

Который напечатает дерево с различной информацией о подключенных устройствах, включая полезную часть «Драйвер».

а также

dmesg | grep driver

который перечислит вам драйверы последних подключенных устройств.

Плюсы в том, что эти две команды поставляются со всеми дистрибутивами.

FuzzyTern
источник
0

Можно также использовать lshwметод, который будет перечислять устройства на всех шинах, включая USB, PCI и т. Д., Чтобы вы могли видеть, какой драйвер он использует, и связанные с ним идентификаторы:

sudo lshw
Пирз
источник