पता करें कि कौन से मॉड्यूल एक usb डिवाइस से जुड़े हैं?


35

क्या आप यह पता लगाने का कोई तरीका सुझा सकते हैं कि USB डिवाइस के लिए किस ड्राइवर का उपयोग किया जा रहा है। एक usb lspci -kकमांड के समतुल्य ।

जवाबों:


57

कर्नेल ड्राइवर ढूंढना

पीड़ित डिवाइस

$ 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

हम यह पता लगाने की कोशिश करने जा रहे हैं कि एपीसी यूपीएस के लिए ड्राइवर का क्या उपयोग किया जाता है। ध्यान दें कि इस प्रश्न के दो उत्तर हैं: चालक जो कर्नेल का उपयोग करेगा, और वह ड्राइवर जो वर्तमान में उपयोग में है। यूजरस्पेस कर्नेल को एक अलग ड्राइवर (और मेरे एपीसी यूपीएस के मामले 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: डीबगफ़ का उपयोग करना (रूट की आवश्यकता है)

यदि आपके पास डिबगफ़्यू माउंटेड है, तो कर्नेल एक फ़ाइल को उसी प्रारूप में रखता है जिस usb-devicesपर प्रिंट होता है /sys/kernel/debug/usb/devices; आप के साथ देख सकते हैं less, आदि ध्यान दें कि डीबगफ इंटरफेस स्थिर नहीं हैं, इसलिए अलग-अलग कर्नेल संस्करण एक अलग प्रारूप में प्रिंट हो सकते हैं, या फ़ाइल को पूरी तरह से गायब कर सकते हैं।

एक बार फिर, यह केवल वर्तमान ड्राइवर दिखाता है, डिफ़ॉल्ट नहीं।

विधि 3: सीधे पढ़ने के लिए केवल मूल उपयोगिताओं का उपयोग / sys (स्क्रिप्टिंग या रिकवरी के लिए सर्वोत्तम)

आप इस जानकारी को प्राप्त कर सकते हैं /sys, इसकी तुलना में अधिक दर्दनाक है lspci। ये /sysइंटरफेस यथोचित रूप से स्थिर होना चाहिए, इसलिए यदि आप एक शेल स्क्रिप्ट लिख रहे हैं, तो संभवतः यह है कि आप इसे कैसे करना चाहते हैं।

प्रारंभ में, lsusb1 से उपकरणों को गिनने लगता है, /sysइसलिए 0. 10-2 एक अच्छा अनुमान है जहां एपीसी यूपीएस खोजने के लिए बस 10 के रूप में देता है lsusb, डिवाइस 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इनको दिखाएगा), एक मोडलैस फ़ाइल और एक ड्राइवर सिमलिंक है:

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

तो, वर्तमान चालक है usbfs। आप modinfomodalias के बारे में पूछकर डिफ़ॉल्ट ड्राइवर पा सकते हैं :

$ /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यह निगरानी कर रहा है।

Userspace (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 बनाम लिनक्स के अपने दोस्त के साथ मेरी बहस में ढीला जा रहा हूँ :)। यह देखने के लिए कुछ दिन दे देंगे कि क्या एक सरल समाधान बाहर निकलता है। आपके परिश्रम के लिए धन्यवाद।
TheMeaningfulEngineer

@Alan ठीक है, मैंने दो और तरीके ढूंढे हैं, उनमें से एक काफी सरल है। इसके अलावा, मैंने स्पष्ट किया है कि "कौन से ड्राइवर" के दो संभावित उत्तर हैं? प्रत्येक विधि प्रदान करता है।
व्युत्पन्न

मुझे नहीं लगता कि डिवाइस को खोजने के बारे में आपका दावा /sys/bus/usb/devicesसही है। मेरे पास बस 1 पर एक उपकरण है जो usb-devicesकहता है कि डिवाइस 12 है, लेकिन /sys/bus/usb/devices/1-11मेरे सिस्टम पर कोई नहीं है।
सेरिन

@Cerin वास्तव में यह नहीं है। मैं एक बेहतर में डाल देंगे। धन्यवाद।
व्युत्पन्न

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, इत्यादि सहित सभी बसों में उपकरणों का उपयोग करने के लिए एक का उपयोग किया जा सकता है , ताकि आप देख सकें कि यह किस चालक का उपयोग करता है और इससे संबंधित आईडी:

sudo lshw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.