ค้นหาโมดูลที่เกี่ยวข้องกับอุปกรณ์ 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 โปรดทราบว่ามีสองคำตอบสำหรับคำถามนี้: ไดรเวอร์ที่เคอร์เนลจะใช้และไดรเวอร์ที่ใช้งานอยู่ในปัจจุบัน Userspace สามารถสั่งให้เคอร์เนลใช้ไดรเวอร์อื่น (และในกรณีของ 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 /sysจาก 0 ดังนั้น 10-2 จึงเป็นการคาดเดาที่ดีสำหรับการหา APC UPS lsusb ให้เป็น bus 10, อุปกรณ์ 3 แต่น่าเสียดายเมื่อเวลาผ่านไปที่การแบ่งการทำแผนที่ - ตัวเลขใช้ซ้ำ แม้ว่าจะไม่ใช่หมายเลขอุปกรณ์ก็ตาม 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 และ symlink ไดรเวอร์:

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

usbfsดังนั้นไดรเวอร์ปัจจุบันคือ คุณสามารถค้นหาไดรเวอร์เริ่มต้นโดยถามmodinfoเกี่ยวกับ modalias:

$ /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's usbhid-upsคือการตรวจสอบมัน

สิ่งที่เกี่ยวกับไดร์เวอร์ userspace (usbfs)?

เมื่อไดรเวอร์คือusbfsโดยทั่วไปหมายถึงโปรแกรม userspace (ไม่ใช่เคอร์เนล) ทำงานเป็นไดรเวอร์ การค้นหาโปรแกรมที่ต้องการรูท (ยกเว้นว่าโปรแกรมกำลังทำงานในฐานะผู้ใช้ของคุณ) และค่อนข้างง่าย: โปรแกรมใดก็ตามที่เปิดไฟล์อุปกรณ์

เรารู้ว่าอุปกรณ์ "เหยื่อ" ของเราคือบัส 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เป็นไปตามคาด (ตัดชื่อคำสั่งเพื่อให้พอดีกับเลย์เอาต์หากคุณต้องการชื่อเต็มคุณสามารถใช้ps 4951เพื่อรับมันหรืออาจเป็นตัวเลือกการจัดรูปแบบเอาต์พุต lsof บางส่วน)


แน่นอนฉันจะหลวมในการอภิปรายของฉันจะเคยกับเพื่อนของฉัน Windows กับ Linux กับ :) จะให้เวลาสองสามวันเพื่อดูว่าโซลูชันที่เรียบง่ายปรากฏออกมาหรือไม่ ขอบคุณสำหรับความพยายาม
TheMeaningfulEngineer

@Aan ตกลงฉันได้พบอีกสองวิธีหนึ่งในนั้นค่อนข้างง่าย นอกจากนี้ฉันได้ชี้แจงว่าคำตอบที่เป็นไปได้สองข้อสำหรับ แต่ละวิธีมี
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

หนึ่งสามารถใช้lshwซึ่งจะระบุอุปกรณ์บนรถบัสทั้งหมดรวมถึง USB, PCI, ฯลฯ เพื่อให้คุณสามารถดูว่าไดรเวอร์ใดที่ใช้และ ID ที่เกี่ยวข้อง:

sudo lshw
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.