คุณช่วยแนะนำวิธีการพิจารณาว่าจะใช้ไดรเวอร์ใดสำหรับอุปกรณ์ USB เรียงลำดับของlspci -k
คำสั่งusb เทียบเท่า
คุณช่วยแนะนำวิธีการพิจารณาว่าจะใช้ไดรเวอร์ใดสำหรับอุปกรณ์ USB เรียงลำดับของlspci -k
คำสั่งusb เทียบเท่า
คำตอบ:
$ 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
)
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
⋮
โปรดทราบว่านี่จะแสดงรายการไดรเวอร์ปัจจุบันไม่ใช่ค่าเริ่มต้น ไม่มีวิธีในการค้นหาค่าเริ่มต้น
ถ้าคุณมี debugfs ติดเคอร์เนลรักษาแฟ้มในรูปแบบเดียวกับusb-devices
การพิมพ์ออกที่/sys/kernel/debug/usb/devices
; คุณสามารถดูด้วยless
ฯลฯ โปรดทราบว่าส่วนต่อประสาน debugfs ไม่มั่นคงดังนั้นรุ่นเคอร์เนลที่แตกต่างกันอาจพิมพ์ในรูปแบบที่แตกต่างกันหรือหายไปไฟล์ทั้งหมด
อีกครั้งนี่จะแสดงเฉพาะไดรเวอร์ปัจจุบันไม่ใช่ค่าเริ่มต้น
คุณจะได้รับข้อมูลของคิดว่ามันเจ็บปวดมากกว่า/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
คือการตรวจสอบมัน
เมื่อไดรเวอร์คือ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 บางส่วน)
/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
นอกจากสิ่งที่ Derobert เขียนฉันพบว่าตัวเองกำลังใช้
lsusb -t
ซึ่งจะพิมพ์ต้นไม้ด้วยข้อมูลต่าง ๆ เกี่ยวกับอุปกรณ์ที่เชื่อมต่อรวมถึงส่วน«ไดรเวอร์»ที่เป็นประโยชน์
และ
dmesg | grep driver
ซึ่งจะแสดงรายการไดรเวอร์ของอุปกรณ์ที่เสียบล่าสุด
ข้อดีคือคำสั่งทั้งสองนี้มาพร้อมกับการแจกแจงทั้งหมด
หนึ่งสามารถใช้lshw
ซึ่งจะระบุอุปกรณ์บนรถบัสทั้งหมดรวมถึง USB, PCI, ฯลฯ เพื่อให้คุณสามารถดูว่าไดรเวอร์ใดที่ใช้และ ID ที่เกี่ยวข้อง:
sudo lshw