커널 드라이버 찾기

커널 드라이버 찾기

USB 장치가 어떤 드라이버를 사용하고 있는지 확인하는 방법을 추천해 주실 수 있나요? USB lspci -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가 어떤 드라이버를 사용하는지 알아 보겠습니다. 이 질문에 대한 답은 두 가지입니다. 커널이 사용할 드라이버와 현재 사용 중인 드라이버입니다. 사용자 공간은 커널에 다른 드라이버를 사용하도록 지시할 수 있습니다(내 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 사용(루트 필요)

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

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

답변2

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

답변3

DeRobert가 쓴 것 외에도 나는 다음을 사용하고 있습니다.

lsusb -t

그러면 유용한 "드라이버" 섹션을 포함하여 연결된 장치에 대한 다양한 정보가 포함된 트리가 인쇄됩니다.

그리고

dmesg | grep driver

그러면 장치에 연결된 최신 드라이버가 나열됩니다.

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

답변4

또한 모든 버스(USB, PCI 등 포함)의 장치를 열거하는 데 사용할 수 있으므로 lshw사용하는 드라이버와 관련 ID를 확인할 수 있습니다.

sudo lshw

관련 정보