找出哪些模块与USB设备关联?


Answers:


57

查找内核驱动程序

受害者设备

$ 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具有)。

方法1:使用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是一个很好的猜想,用于查找lsusb作为设备10总线3给出的APC UPS。即使没有设备号也是如此。该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阅读以下文件,我们可以确定这是正确的设备:

$ 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。您可以通过询问modinfomodalias 来找到默认驱动程序:

$ /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,这是正确的,因为nutusbhid-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输出格式化选项)。


我绝对会和我的Windows vs Linux的朋友一起进行这场辩论:)。请花几天时间,看看是否会弹出一个更简单的解决方案。感谢您的努力。
TheMeaningfulEngineer

@Alan OK,我发现了另外两种方法,其中一种很简单。另外,我已经阐明了“哪个驱动程序”的两个可能答案中的哪个?每种方法都提供。
derobert 2013年

我认为您关于放置设备的说法不/sys/bus/usb/devices正确。总线1上有一个设备usb-devices为12的设备,但是/sys/bus/usb/devices/1-11系统上没有。
塞林(Cerin)

@Cerin确实不是。我会放一个更好的。谢谢。
derobert

13

lsusb本身可以为您带来良好的效果。对于紧凑的输出,我使用lsusb -t,其中-t将设备显示为树。此格式也会报告驱动程序。

输出示例:

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

如果未使用驱动程序,则该行将如下所示(示例中的设备是我确实从内核中删除了驱动程序的照相机):

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

0

除了德罗伯特写的东​​西,我发现自己在用

lsusb -t

它将打印出一棵树,其中包含有关已连接设备的各种信息,包括有用的《驱动程序》部分。

dmesg | grep driver

它将列出您最新的插入设备的驱动程序。

优点是这两个命令随所有发行版一起安装。


0

也可以使用lshw它将枚举包括USB,PCI等在内的所有总线上的设备,因此您可以查看其使用的驱动程序及其关联的ID:

sudo lshw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.