Könnten Sie einen Weg empfehlen, um herauszufinden, welcher Treiber für ein USB-Gerät verwendet wird. Eine Art USB-Äquivalent zum lspci -k
Befehl.
Könnten Sie einen Weg empfehlen, um herauszufinden, welcher Treiber für ein USB-Gerät verwendet wird. Eine Art USB-Äquivalent zum lspci -k
Befehl.
Antworten:
$ 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
).
Das usbutils
Paket (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.
Wenn Sie Debugfs gemountet haben, behält der Kernel eine Datei im selben Format usb-devices
bei /sys/kernel/debug/usb/devices
, in dem sie ausgedruckt wurde . Sie können mit less
usw. 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.
Sie können die Informationen herausholen /sys
, dachte es ist schmerzhafter als lspci
. Diese /sys
Schnittstellen sollten einigermaßen stabil sein. Wenn Sie also ein Shell-Skript schreiben, möchten Sie dies wahrscheinlich auch tun.
Scheint anfangs die lsusb
Geräte von 1 bis /sys
0 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 devnum
Inhalt 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 cat
einiger 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 ( :1
ist die "Konfiguration", .0
die Schnittstelle - ein einzelnes USB-Gerät kann mehrere lsusb -v
Aufgaben 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 modinfo
nach 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 hid
Treiber, was in der Tat richtig ist. Und seine Zeit als usbfs, die seit richtig ist nut
‚s usbhid-ups
überwacht sie.
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 lsof
liefert 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-ups
wie erwartet (lsof hat den Befehlsnamen abgeschnitten, damit das Layout passt. Wenn Sie den vollständigen Namen benötigen, können Sie ps 4951
ihn abrufen, oder wahrscheinlich einige lsof-Ausgabeformatierungsoptionen).
/sys/bus/usb/devices
richtig ist. Ich habe ein Gerät an Bus 1, auf dem usb-devices
steht, dass es sich um Gerät 12 handelt, aber /sys/bus/usb/devices/1-11
auf meinem System befindet sich kein Gerät .
lsusb
selbst können Sie gute Ergebnisse erzielen. Für die kompakte Ausgabe verwende ich lsusb -t
, wobei -t
die 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
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.