どのモジュールがusbデバイスに関連付けられているかを調べますか?


35

どのドライバーがUSBデバイスに使用されているかを把握する方法をお勧めしますか。lspci -kコマンドに相当するusbのソート。

回答:


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に使用されているドライバーを見つけようとします。この質問には2つの答えがあることに注意してください。カーネルが使用するドライバーと、現在使用中のドライバーです。ユーザースペースは、カーネルに別のドライバーを使用するように指示できます(私の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を使用する(ルートが必要)

debugfsがマウントされている場合、カーネルはでusb-devices出力されるのと同じ形式でファイルを維持します/sys/kernel/debug/usb/devices。あなたが見ることができますlessdebugfsのインターフェースは非常に異なるカーネルのバージョンが異なる形式で印刷したり、完全にファイルを欠落している可能性があり、安定していないことなど、注意を。

繰り返しますが、これは現在のドライバーのみを表示し、デフォルトではありません。

方法3:基本ユーティリティのみを使用して/ sysを直接読み取る(スクリプト作成または回復に最適)

あなたは情報を得ることができますが/sys、それよりも苦痛だと思いましたlspci。これらの/sysインターフェイスはかなり安定している必要があるため、シェルスクリプトを記述している場合は、おそらくこれが目的です。

最初は、lsusb1 /sysから0 までのデバイスをカウントするようです。したがって、10-2は、APC UPS lsusbがバス10、デバイス3として提供する場所の適切な推測値です。デバイス番号がそうでなくても。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これらを表示します)を見ると、モーダリアスファイルとドライバーのシンボリックリンクがあります。

$ 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さんはusbhid-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対Linuxの友人とのこれまでの議論でゆるんでいます:)。より簡単なソリューションが登場するかどうかを確認するために数日を与えます。努力してくれてありがとう。
TheMeaningfulEngineer

@アランOK、私はさらに2つの方法を見つけました、そのうちの1つは非常に簡単です。また、「どのドライバー?」に対する2つの可能な答えのうちのどちらを明確にした。各メソッドが提供します。
デロバート

デバイスの配置に関するあなたの主張/sys/bus/usb/devicesは正しいとは思いません。バス1にusb-devicesデバイス12と言うデバイスがありますが/sys/bus/usb/devices/1-11、システムにはありません。
セリン

@Cerinは確かにそうではありません。もっと良いものを入れます。ありがとうございました。
デロバート

13

lsusb良い結果を得ることができます。コンパクト出力Iの使用のために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

derobertが書いたことに加えて、私は自分自身が

lsusb -t

これにより、役立つ「ドライバー」部分を含む、接続されたデバイスに関するさまざまな情報を含むツリーが印刷されます。

そして

dmesg | grep driver

最新のプラグインデバイスのドライバーが一覧表示されます。

長所は、これら2つのコマンドがすべてのディストリビューションにインストールされていることです。


0

またlshw、USB、PCIなどを含むすべてのバス上のデバイスを列挙するために使用することもできます。これにより、使用するドライバーとその関連IDを確認できます。

sudo lshw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.