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として提供する場所を見つけるための良い推測です。マッピングが機能しなくなったとき—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
ingすることで、これが正しいデバイスであることを確認できます。
$ 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を使用していますが、これは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出力フォーマットオプションを使用できます)。 。
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
デロベルトが書いたものに加えて、私は自分自身を使っている
lsusb -t
役立つ"Driver"パーツを含む、接続されたデバイスに関するさまざまな情報を含むツリーを印刷します。
そして
dmesg | grep driver
最新のプラグインデバイスのドライバーが一覧表示されます。
長所は、これらの2つのコマンドがすべてのディストリビューションにインストールされることです。
USB、PCIなどを含むすべてのバス上のデバイスを列挙するlshw
を使用して、使用するドライバーとそれに関連するIDを確認することもできます。
Sudo lshw