您能否推荐一种方法来确定 USB 设备正在使用哪个驱动程序。类似于 USBlspci -k
命令。
答案1
查找内核驱动程序
受害设备
$ 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 是一个很好的猜测,可以猜测在哪里可以找到 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
我们可以通过查看一些文件来确定这是正确的设备:
$ 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 输出格式化选项)。
答案2
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
答案3
除了德罗伯特写的之外,我发现自己使用
lsusb -t
这将打印一棵树,其中包含有关连接设备的各种信息,包括有用的“驱动程序”部分。
和
dmesg | grep driver
这将列出最新插入设备的驱动程序。
优点是这两个命令随所有发行版一起安装。
答案4
还可以使用lshw
它将枚举所有总线上的设备(包括 USB、PCI 等),以便您可以查看它使用的驱动程序及其关联的 ID:
sudo lshw