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がどのドライバを使用しているかを見てみましょう。この質問に対する答えは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を使用する(rootが必要)
debugfsがインストールされると、カーネルはusb-devices
出力と同じ形式でファイルを保持し、などを使用して表示/sys/kernel/debug/usb/devices
できます。less
debugfs インターフェイスは不安定なため、異なるカーネルバージョンが異なる形式で印刷されたり、ファイルが完全に失われる可能性があります。
繰り返しますが、これはデフォルトドライバではなく現在のドライバのみを表示します。
方法3:基本ユーティリティのみを使用して/ sysを直接読み込む(スクリプトまたは回復に最適)
情報を見つけることができますが/sys
、これは思ったよりも痛いですlspci
。これらの/sys
インタフェースはかなり安定している必要があるため、シェルスクリプトを作成する場合はこれがおそらく必要なものです。
最初は、デバイスがlsusb
1から0まで/sys
計算されるようです。したがって、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
:1
10-2:1.0(「設定」、.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
ユーザ空間(カーネルではなく)プログラムがドライバとして機能するという意味です。どのプログラムであるかを見つけるには、ルートが必要であり(プログラムがユーザーとして実行されていない限り)、かなり簡単です。どのプログラムがデバイスファイルを開いたままでも構いません。
私たちは、「被害者」デバイスがバス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出力形式オプションを使用できます)。