カーネルドライバを探す

カーネルドライバを探す

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できます。lessdebugfs インターフェイスは不安定なため、異なるカーネルバージョンが異なる形式で印刷されたり、ファイルが完全に失われる可能性があります。

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

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

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

最初は、デバイスがlsusb1から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 

:110-2:1.0(「設定」、.0インターフェース - 単一のUSBデバイスが複数の操作を実行でき、複数のドライバがある)を見ると、lsusb -vモダリアファイルとドライバのシンボリックリンクがあります。

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

したがって、現在のドライバはusbfsmodinfoモーダルに依頼して基本ドライバを見つけることができます。

$ /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出力形式オプションを使用できます)。

おすすめ記事