找出哪些模組與 USB 設備相關聯?
您能否推荐一種方法來確定 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
我們可以通過
cat
ing 一些文件來確定這是正確的設備:$ 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 輸出格式選項)。