Bạn có thể giới thiệu một cách để tìm ra trình điều khiển nào đang được sử dụng cho thiết bị USB. Sắp xếp một usb tương đương với lspci -k
lệnh.
Bạn có thể giới thiệu một cách để tìm ra trình điều khiển nào đang được sử dụng cho thiết bị USB. Sắp xếp một usb tương đương với lspci -k
lệnh.
Câu trả lời:
$ 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
Chúng tôi sẽ cố gắng tìm hiểu trình điều khiển nào được sử dụng cho APC UPS. Lưu ý rằng có hai câu trả lời cho câu hỏi này: Trình điều khiển mà kernel sẽ sử dụng và trình điều khiển hiện đang sử dụng. Không gian người dùng có thể hướng dẫn kernel sử dụng trình điều khiển khác (và trong trường hợp APC UPS của tôi, nut
có).
Các usbutils
gói (trên Debian, ít nhất) bao gồm tập lệnh gọi usb-devices
. Nếu bạn chạy nó, nó sẽ xuất thông tin về các thiết bị trên hệ thống, bao gồm trình điều khiển nào được sử dụng:
$ 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
⋮
Lưu ý rằng điều này liệt kê trình điều khiển hiện tại, không phải trình điều khiển mặc định. Không có cách nào để tìm cái mặc định.
Nếu bạn đã gỡ lỗi được gắn, kernel sẽ duy trì một tệp có cùng định dạng như usb-devices
in ra tại /sys/kernel/debug/usb/devices
; bạn có thể xem với less
, v.v ... Lưu ý rằng giao diện gỡ lỗi không ổn định, do đó các phiên bản kernel khác nhau có thể in ở định dạng khác hoặc thiếu tệp hoàn toàn.
Một lần nữa, điều này chỉ hiển thị trình điều khiển hiện tại, không phải mặc định.
Bạn có thể lấy thông tin ra /sys
, nghĩ rằng nó đau đớn hơn lspci
. Các /sys
giao diện này phải ổn định một cách hợp lý, vì vậy nếu bạn đang viết một kịch bản shell, đây có thể là cách bạn muốn thực hiện.
Ban đầu, lsusb
dường như đếm các thiết bị từ 1, /sys
từ 0. Vì vậy, 10-2 là một dự đoán tốt về nơi tìm thấy APC UPS lsusb đưa ra như bus 10, thiết bị 3. Thật không may, theo thời gian, ánh xạ phá vỡ các sysfs sử dụng lại các số ngay cả khi số thiết bị không. Các devnum
nội dung của tập tin sẽ phù hợp với số lượng thiết bị nhất định bởi lsusb, vì vậy bạn có thể làm một cái gì đó như thế này:
$ 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
Vì vậy, trong trường hợp này, nó chắc chắn 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
Chúng tôi có thể chắc chắn đây là thiết bị phù hợp bằng cách nhập cat
một vài tệp:
$ cat idVendor idProduct manufacturer product
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9
Nếu bạn xem trong 10-2: 1.0 ( :1
là "cấu hình", .0
giao diện, một thiết bị USB duy nhất có thể làm nhiều việc và có nhiều trình điều khiển; lsusb -v
sẽ hiển thị những điều này), có một tệp modalias và liên kết trình điều khiển:
$ cat 10-2\:1.0/modalias
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs
Vì vậy, trình điều khiển hiện tại là usbfs
. Bạn có thể tìm trình điều khiển mặc định bằng cách hỏi modinfo
về phương thức:
$ /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)
Vì vậy, APC UPS mặc định cho người hid
lái xe, điều này thực sự chính xác. Và hiện tại nó đang sử dụng usbfs, điều này đúng vì nut
họ usbhid-ups
đang theo dõi nó.
Khi trình điều khiển là usbfs
, về cơ bản có nghĩa là một chương trình không gian người dùng (không phải kernel) đang hoạt động như trình điều khiển. Tìm chương trình nào là yêu cầu root (trừ khi chương trình đang chạy với tư cách là người dùng của bạn) và khá dễ dàng: chương trình nào có tệp thiết bị mở.
Chúng tôi biết rằng thiết bị "nạn nhân" của chúng tôi là bus 10, thiết bị 3. Vì vậy, tệp thiết bị là /dev/bus/usb/010/003
(ít nhất là trên Debian hiện đại) và lsof
cung cấp câu trả lời:
# 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
Và thực tế, usbhid-ups
như mong đợi (lsof đã cắt bớt tên lệnh để làm cho bố cục phù hợp, nếu bạn cần tên đầy đủ, bạn có thể sử dụng ps 4951
để lấy nó, hoặc có thể một số tùy chọn định dạng đầu ra lsof).
/sys/bus/usb/devices
là chính xác. Tôi có một thiết bị trên bus 1 có nghĩa usb-devices
là thiết bị 12, nhưng không có /sys/bus/usb/devices/1-11
trên hệ thống của tôi.
lsusb
chính nó có thể giúp bạn có kết quả tốt. Đối với đầu ra nhỏ gọn tôi sử dụng lsusb -t
, trong đó -t
hiển thị các thiết bị dưới dạng cây; định dạng này báo cáo trình điều khiển là tốt.
Ví dụ đầu ra:
$ 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
...
Nếu không có trình điều khiển nào được sử dụng, dòng sẽ trông như thế này (thiết bị trong ví dụ của tôi là máy ảnh mà tôi đã gỡ bỏ trình điều khiển khỏi kernel):
|__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
Ngoài những gì derobert viết, tôi thấy mình đang sử dụng
lsusb -t
Sẽ in một cây với thông tin khác nhau về các thiết bị được kết nối, bao gồm cả phần «Trình điều khiển» hữu ích.
và
dmesg | grep driver
trong đó sẽ liệt kê cho bạn các trình điều khiển của các thiết bị cắm mới nhất.
Ưu điểm là hai lệnh này được cài đặt với tất cả các bản phân phối.