USB 장치와 관련된 모듈을 찾으십니까?


34

USB 장치에 어떤 드라이버가 사용되고 있는지 알아내는 방법을 추천 해 주시겠습니까? lspci -k명령에 해당하는 USB의 종류 .

답변:


56

커널 드라이버 찾기

희생자 장치

$ 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).

방법 1 : usbutils 사용 (쉬운)

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
⋮

여기에는 기본 드라이버가 아닌 현재 드라이버가 나열됩니다. 기본 설정을 찾을 수있는 방법이 없습니다.

방법 2 : debugfs 사용 (루트 필요)

debugfs가 마운트되어 있다면 커널은 파일을 usb-devices출력 할 때와 같은 형식으로 유지합니다 /sys/kernel/debug/usb/devices. 당신이 함께 볼 수 있습니다 lessdebugfs의 인터페이스는 매우 다른 커널 버전은 다른 형식으로 인쇄하거나 전체 파일 누락 될 수있다, 안정되지 것을 등 참고.

다시 한 번, 이것은 기본값이 아닌 현재 드라이버 만 표시합니다.

방법 3 : 기본 유틸리티 만 사용하여 / sys를 직접 읽음 (스크립트 또는 복구에 가장 적합)

당신은 밖으로 정보를 얻을 수 /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) 드라이버는 어떻습니까?

드라이버가 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 출력 형식 옵션을 사용할 수 있습니다).


나는 이것과 함께 Windows 대 Linux의 내 친구와의 토론에서 분명히 풀릴 것입니다 :). 더 간단한 솔루션이 나오는지 며칠 동안 알 수 있습니다. 노력해 주셔서 감사합니다.
TheMeaningfulEngineer

@ Alan 좋아요, 두 가지 방법을 더 찾았습니다. 그중 하나는 매우 간단합니다. 또한, "어떤 드라이버?"에 대한 두 가지 가능한 답변 중 어떤 것이 있는지 분명히했습니다. 각 방법이 제공합니다.
derobert

장치를 찾는 것에 대한 귀하의 주장 /sys/bus/usb/devices이 정확 하다고 생각하지 않습니다 . 버스 1 usb-devices에 장치 12라는 장치가 있지만 /sys/bus/usb/devices/1-11시스템 에는 없습니다 .
Cerin

@Cerin은 실제로 그렇지 않습니다. 나는 더 좋은 것을 넣을 것이다. 고맙습니다.
derobert

13

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

0

derobert가 쓴 것 외에도

lsusb -t

유용한«드라이버»파트를 포함하여 연결된 장치에 대한 다양한 정보가있는 트리를 인쇄합니다.

dmesg | grep driver

최신 플러그인 장치의 드라이버가 표시됩니다.

장점은이 두 명령이 모든 배포판과 함께 설치된다는 것입니다.


0

lshwUSB, PCI 등을 포함하여 모든 버스의 장치를 열거하는을 사용할 수도 있으므로 사용 하는 드라이버 및 관련 ID를 확인할 수 있습니다.

sudo lshw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.