답변:
$ 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에 어떤 드라이버가 사용되는지 알아 내려고 노력할 것입니다. 이 질문에 대한 답은 커널이 사용할 드라이버와 현재 사용중인 드라이버의 두 가지입니다. 사용자 공간은 커널이 다른 드라이버를 사용하도록 지시 할 수 있습니다 (그리고 APC UPS의 경우 nut
).
usbutils
(데비안, 적어도에) 패키지라는 스크립트를 포함한다 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
인터페이스는 상당히 안정적이어야하므로 쉘 스크립트를 작성하는 경우이 방법을 사용하는 것이 좋습니다.
처음에는 0 lsusb
부터 1까지의 장치 수를 계산하는 것 같습니다. /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
10-2 : 1.0 ( :1
"구성", .0
인터페이스 인 단일 USB 장치는 여러 가지 작업을 수행 할 수 있으며 여러 개의 드라이버 lsusb -v
가있을 수 있습니다)을 보면 modalias 파일과 드라이버 심볼릭 링크가 있습니다.
$ 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
인 경우 기본적으로 사용자 공간 (비 커널) 프로그램이 드라이버로 작동하고 있음을 의미합니다. 어떤 프로그램을 찾으려면 루트가 필요하며 (프로그램이 사용자로 실행되지 않는 한) 장치 파일이 열려있는 프로그램에 관계없이 매우 쉽습니다.
우리는 "희생자"장치가 버스 10, 장치 3이라는 것을 알고 있습니다. 따라서 장치 파일은 /dev/bus/usb/010/003
(적어도 최신 데비안에서는) 있으며 다음과 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
그 자체로 좋은 결과를 얻을 수 있습니다. 컴팩트 한 출력을 위해을 사용하는데 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