Bisakah Anda merekomendasikan cara untuk mencari tahu driver mana yang sedang digunakan untuk perangkat USB. Semacam setara dengan lspci -k
perintah usb .
Bisakah Anda merekomendasikan cara untuk mencari tahu driver mana yang sedang digunakan untuk perangkat USB. Semacam setara dengan lspci -k
perintah usb .
Jawaban:
$ 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
Kami akan mencoba mencari tahu driver apa yang digunakan untuk APC UPS. Perhatikan bahwa ada dua jawaban untuk pertanyaan ini: Driver yang akan digunakan kernel, dan driver yang saat ini digunakan. Userspace dapat menginstruksikan kernel untuk menggunakan driver yang berbeda (dan dalam kasus UPS APC saya, nut
miliki).
The usbutils
paket (pada Debian, setidaknya) termasuk script yang disebut usb-devices
. Jika Anda menjalankannya, output informasi tentang perangkat pada sistem, termasuk driver yang digunakan:
$ 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
⋮
Perhatikan bahwa ini mencantumkan driver saat ini, bukan yang default. Tidak ada cara untuk menemukan yang default.
Jika Anda telah menginstal debugfs, kernel menyimpan file dalam format yang sama dengan usb-devices
print out di /sys/kernel/debug/usb/devices
; Anda dapat melihat less
, dll. Perhatikan bahwa antarmuka debugfs tidak stabil, sehingga versi kernel yang berbeda dapat mencetak dalam format yang berbeda, atau kehilangan file seluruhnya.
Sekali lagi, ini hanya menunjukkan driver saat ini, bukan default.
Anda dapat memperoleh informasi dari /sys
, pikir itu lebih menyakitkan daripada lspci
. /sys
Antarmuka ini harusnya cukup stabil, jadi jika Anda menulis skrip shell, ini mungkin yang ingin Anda lakukan.
Awalnya, lsusb
tampaknya menghitung perangkat dari 1, /sys
dari 0. Jadi 10-2 adalah perkiraan yang baik untuk menemukan di mana APS UPS lsusb berikan sebagai bus 10, perangkat 3. Sayangnya, seiring waktu pemetaan itu rusak — sysfs menggunakan kembali angka-angka bahkan ketika nomor perangkat tidak. Isi devnum
file akan cocok dengan nomor perangkat yang diberikan oleh lsusb, sehingga Anda dapat melakukan sesuatu seperti ini:
$ 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
Jadi, dalam hal ini, sudah pasti 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
Kami dapat memastikan ini adalah perangkat yang tepat dengan cat
memasukkan beberapa file:
$ cat idVendor idProduct manufacturer product
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9
Jika Anda melihat 10-2: 1.0 ( :1
adalah "konfigurasi", .0
antarmuka — satu perangkat USB dapat melakukan banyak hal, dan memiliki beberapa driver; lsusb -v
akan menunjukkan ini), ada file modalias dan symlink driver:
$ cat 10-2\:1.0/modalias
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs
Jadi, driver saat ini usbfs
. Anda dapat menemukan driver default dengan bertanya modinfo
tentang modalias:
$ /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)
Jadi, UPS APC default ke hid
driver, yang memang benar. Dan saat ini menggunakan usbfs, yang benar karena nut
's usbhid-ups
adalah pemantauan itu.
Ketika driver usbfs
, itu pada dasarnya berarti program userspace (non-kernel) berfungsi sebagai driver. Menemukan program mana yang membutuhkan root (kecuali program tersebut berjalan sebagai pengguna Anda) dan cukup mudah: program mana saja yang membuka file perangkat.
Kita tahu bahwa perangkat "korban" kami adalah bus 10, perangkat 3. Jadi file perangkat itu /dev/bus/usb/010/003
(setidaknya pada Debian modern), dan lsof
memberikan jawabannya:
# 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
Dan memang, itu usbhid-ups
seperti yang diharapkan (lsof memotong nama perintah untuk membuat tata letak cocok, jika Anda memerlukan nama lengkap, Anda dapat menggunakan ps 4951
untuk mendapatkannya, atau mungkin beberapa opsi format output lsof).
/sys/bus/usb/devices
itu benar. Saya memiliki perangkat di bus 1 yang usb-devices
mengatakan perangkat 12, tetapi tidak ada /sys/bus/usb/devices/1-11
di sistem saya.
lsusb
itu sendiri bisa memberi Anda hasil yang baik. Untuk output ringkas yang saya gunakan lsusb -t
, di mana -t
menunjukkan perangkat sebagai pohon; format ini melaporkan driver juga.
Contoh output:
$ 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
...
Jika tidak ada driver yang digunakan, baris akan terlihat seperti ini (perangkat dalam contoh saya adalah kamera yang saya hapus driver dari kernel):
|__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
Selain apa yang ditulis derobert, saya menemukan diri saya menggunakan
lsusb -t
Yang akan mencetak pohon dengan berbagai info tentang perangkat yang terhubung termasuk bagian «Driver» yang bermanfaat.
dan
dmesg | grep driver
yang akan mencantumkan Anda driver perangkat terhubung terbaru.
Kelebihannya adalah bahwa kedua perintah ini dipasang dengan semua distribusi.