Drivers

找出哪些模組與 USB 設備相關聯?

  • January 8, 2018

您能否推荐一種方法來確定 USB 設備正在使用哪個驅動程序。lspci -k類似於命令的 USB 等價物。

查找核心驅動程序

受害設備

$ 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 UPS 使用的驅動程序。請注意,這個問題有兩個答案:核心將使用的驅動程序和目前正在使用的驅動程序。使用者空間可以指示核心使用不同的驅動程序(對於我的 APC UPS,nut有)。

方法一:使用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介面應該相當穩定,所以如果您正在編寫一個 shell 腳本,這可能就是您想要的方式。

最初,lsusb似乎從 1 開始計數設備,/sys從 0 開始。因此 10-2 是一個很好的猜測,可以很好地猜測在哪裡可以找到 APC UPS 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

我們可以通過cating 一些文件來確定這是正確的設備:

$ 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 UPS預設hid驅動,確實是正確的。並且它目前正在使用usbfs,這是正確的,因為nut’susbhid-ups正在監視它。

使用者空間(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 輸出格式選項)。

引用自:https://unix.stackexchange.com/questions/60078