web-dev-qa-db-ja.com

USBモジュールに関連付けられているモジュールを見つけますか?

USBデバイスに使用されているドライバーを特定する方法をお勧めしますか? lspci -kコマンドに相当するUSB​​の一種。

37

カーネルドライバーの検索

被害者のデバイス

$ 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に出力するのと同じ形式でファイルを維持します。 lessなどで表示できます。debugfsインターフェースは安定していないため、異なるバージョンのカーネルが異なるフォーマットで出力されるか、ファイルが完全に欠落している場合があります。

ここでも、デフォルトではなく、現在のドライバのみが表示されます。

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

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

最初は、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はインターフェイスです。1つのUSBデバイスで複数の処理を実行でき、複数のドライバを使用できます。lsusb -vはこれら)、modaliasファイルとドライバーのシンボリックリンクがあります:

$ cat 10-2\:1.0/modalias 
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs

したがって、現在のドライバーはusbfsです。 modaliasについて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を使用していますが、これは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出力フォーマットオプションを使用できます)。 。

60
derobert

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
13
nert

デロベルトが書いたものに加えて、私は自分自身を使っている

lsusb -t

役立つ"Driver"パーツを含む、接続されたデバイスに関するさまざまな情報を含むツリーを印刷します。

そして

dmesg | grep driver

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

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

0
FuzzyTern

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

Sudo lshw
0
Pierz