Finden Sie heraus, welche Module einem USB-Gerät zugeordnet sind?

35

Könnten Sie einen Weg empfehlen, um herauszufinden, welcher Treiber für ein USB-Gerät verwendet wird. Eine Art USB-Äquivalent zum lspci -kBefehl.

TheMeaningfulEngineer
quelle

Antworten:

57

Kernel-Treiber finden

Das Opfergerät

$ 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

Wir werden versuchen herauszufinden, welcher Treiber für die APC-USV verwendet wird. Beachten Sie, dass es zwei Antworten auf diese Frage gibt: Den Treiber, den der Kernel verwenden würde, und den Treiber, der derzeit verwendet wird. Userspace kann den Kernel anweisen, einen anderen Treiber zu verwenden (und hat im Fall meiner APC UPS nut).

Methode 1: Verwenden von usbutils (einfach)

Das usbutilsPaket (zumindest unter Debian) enthält ein Skript namens usb-devices. Wenn Sie es ausführen, werden Informationen zu den Geräten im System ausgegeben, einschließlich des verwendeten Treibers:

$ 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
⋮

Beachten Sie, dass hier der aktuelle Treiber aufgeführt wird, nicht der Standardtreiber. Es gibt keine Möglichkeit, die Standardeinstellung zu finden.

Methode 2: Verwenden von debugfs (erfordert root)

Wenn Sie Debugfs gemountet haben, behält der Kernel eine Datei im selben Format usb-devicesbei /sys/kernel/debug/usb/devices, in dem sie ausgedruckt wurde . Sie können mit lessusw. anzeigen . Beachten Sie, dass debugfs-Schnittstellen nicht stabil sind, sodass verschiedene Kernelversionen möglicherweise in einem anderen Format gedruckt werden oder die Datei vollständig fehlt.

Auch hier wird nur der aktuelle Treiber angezeigt, nicht der Standard.

Methode 3: Verwenden nur grundlegender Dienstprogramme, um / sys direkt zu lesen (am besten für Skripterstellung oder Wiederherstellung)

Sie können die Informationen herausholen /sys, dachte es ist schmerzhafter als lspci. Diese /sysSchnittstellen sollten einigermaßen stabil sein. Wenn Sie also ein Shell-Skript schreiben, möchten Sie dies wahrscheinlich auch tun.

Scheint anfangs die lsusbGeräte von 1 bis /sys0 zu zählen. 10-2 ist also eine gute Vermutung, wo sich die APC-USV befindet, die lsusb als Bus 10, Gerät 3, ausgibt auch wenn die Gerätenummern nicht sind. Der devnumInhalt der Datei stimmt mit der von lsusb angegebenen Gerätenummer überein. Sie können also folgendermaßen vorgehen:

$ 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

Also, in diesem Fall ist es definitiv 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

Wir können anhand cateiniger Dateien sicher sein, dass dies das richtige Gerät ist :

$ cat idVendor idProduct manufacturer product 
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9 

Wenn Sie in 10-2: 1.0 nachsehen ( :1ist die "Konfiguration", .0die Schnittstelle - ein einzelnes USB-Gerät kann mehrere lsusb -vAufgaben ausführen und verfügt über mehrere Treiber; diese werden angezeigt), gibt es eine Modaliendatei und einen Treibersymbollink:

$ cat 10-2\:1.0/modalias 
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs

Der aktuelle Treiber ist also usbfs. Sie können den Standardtreiber finden, indem Sie modinfonach den Modalien fragen:

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

Die APC-USV verwendet daher standardmäßig den hidTreiber, was in der Tat richtig ist. Und seine Zeit als usbfs, die seit richtig ist nut‚s usbhid-upsüberwacht sie.

Was ist mit Userbasistreibern?

Wenn der Treiber installiert ist usbfs, bedeutet dies im Wesentlichen, dass ein Userspace-Programm (kein Kernel-Programm) als Treiber fungiert. Um herauszufinden, welches Programm es ist, ist root erforderlich (es sei denn, das Programm wird als Benutzer ausgeführt). Dies ist recht einfach: Welches Programm auch immer die Gerätedatei geöffnet hat.

Wir wissen, dass unser "Opfer" -Gerät Bus 10, Gerät 3 ist. Die Gerätedatei ist also /dev/bus/usb/010/003(zumindest auf einem modernen Debian) und lsofliefert die Antwort:

# 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

Und tatsächlich ist es usbhid-upswie erwartet (lsof hat den Befehlsnamen abgeschnitten, damit das Layout passt. Wenn Sie den vollständigen Namen benötigen, können Sie ps 4951ihn abrufen, oder wahrscheinlich einige lsof-Ausgabeformatierungsoptionen).

derobert
quelle
Ich werde definitiv in meiner Debatte mit meinem Freund von Windows gegen Linux mit diesem einen verlieren :). Ich werde ein paar Tage warten, um zu sehen, ob eine einfachere Lösung herauskommt. Danke für die Mühe.
TheMeaningfulEngineer
@Alan OK, ich habe zwei weitere Möglichkeiten gefunden, eine davon ist recht einfach. Außerdem habe ich geklärt, welche von zwei möglichen Antworten auf "welchen Fahrer?" Jede Methode bietet.
Derobert
Ich glaube nicht, dass Ihre Behauptung, das Gerät zu lokalisieren, /sys/bus/usb/devicesrichtig ist. Ich habe ein Gerät an Bus 1, auf dem usb-devicessteht, dass es sich um Gerät 12 handelt, aber /sys/bus/usb/devices/1-11auf meinem System befindet sich kein Gerät .
Cerin
@Cerin ist es in der Tat nicht. Ich werde eine bessere einsetzen. Vielen Dank.
Derobert
13

lsusbselbst können Sie gute Ergebnisse erzielen. Für die kompakte Ausgabe verwende ich lsusb -t, wobei -tdie Geräte als Baum angezeigt werden; In diesem Format wird auch der Treiber gemeldet.

Beispielausgabe:

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

Wenn kein Treiber verwendet wird, sieht die Zeile folgendermaßen aus (das Gerät in meinem Beispiel ist eine Kamera, für die ich den Treiber aus dem Kernel entfernt habe):

    |__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
nert
quelle
0

Neben dem, was derobert geschrieben hat, benutze ich

lsusb -t

Daraufhin wird ein Baum mit verschiedenen Informationen zu den angeschlossenen Geräten gedruckt, einschließlich eines hilfreichen Teils „Treiber“.

und

dmesg | grep driver

Hier werden die Treiber der neuesten angeschlossenen Geräte aufgelistet.

Der Vorteil ist, dass diese beiden Befehle mit allen Distributionen installiert werden.

FuzzyTern
quelle
0

Sie können auch angeben, lshwwelche Geräte an allen Bussen einschließlich USB, PCI usw. aufgelistet werden sollen, damit Sie sehen können, welchen Treiber er verwendet und welche IDs ihm zugeordnet sind:

sudo lshw
Pierz
quelle