どのドライバーがUSBデバイスに使用されているかを把握する方法をお勧めしますか。lspci -k
コマンドに相当する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に使用されているドライバーを見つけようとします。この質問には2つの答えがあることに注意してください。カーネルが使用するドライバーと、現在使用中のドライバーです。ユーザースペースは、カーネルに別のドライバーを使用するように指示できます(私のAPC UPSの場合はnut
持っています)。
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
⋮
これは、デフォルトではなく現在のドライバーをリストすることに注意してください。デフォルトのものを見つける方法はありません。
debugfsがマウントされている場合、カーネルはでusb-devices
出力されるのと同じ形式でファイルを維持します/sys/kernel/debug/usb/devices
。あなたが見ることができますless
debugfsのインターフェースは非常に異なるカーネルのバージョンが異なる形式で印刷したり、完全にファイルを欠落している可能性があり、安定していないことなど、注意を。
繰り返しますが、これは現在のドライバーのみを表示し、デフォルトではありません。
あなたは情報を得ることができますが/sys
、それよりも苦痛だと思いましたlspci
。これらの/sys
インターフェイスはかなり安定している必要があるため、シェルスクリプトを記述している場合は、おそらくこれが目的です。
最初は、lsusb
1 /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
基本的にユーザースペース(非カーネル)プログラムがドライバーとして機能していることを意味します。それがどのプログラムであるかを見つけるには、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出力フォーマットオプションを使用できます)。
/sys/bus/usb/devices
は正しいとは思いません。バス1にusb-devices
デバイス12と言うデバイスがありますが/sys/bus/usb/devices/1-11
、システムにはありません。
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