Linux: Wie finde ich den für ein Gerät verwendeten Gerätetreiber?

59

Wenn an meinem Ziel ein Gerät angeschlossen ist und viele Treiber für dieses Gerät geladen sind, wie kann ich nachvollziehen, welches Gerät welchen Treiber verwendet?

Alexios
quelle

Antworten:

46

Verwenden Sie einfach /sys.

Beispiel. Ich möchte den Treiber für meine Ethernet-Karte finden:

$ sudo lspci
...
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
$ find /sys | grep drivers.*02:00
/sys/bus/pci/drivers/r8169/0000:02:00.0

Das ist r8169.

Zuerst muss ich die Koordinaten des Geräts mithilfe von finden lspci. dann finde ich treiber, die für die geräte mit diesen koordinaten verwendet werden.

Igor Chubin
quelle
35
lspci -vmacht es von selbst.
Poige
7
lspci -nkzeigt Ihnen angehängte Treiber. Im Allgemeinen ist das sysfs der richtige Ort zum Suchen.
18.
@ AndyShevchenko danke! Dies wird eine großartige Zeitersparnis für mich sein :-D
pepoluan
1
Ich weiß, dass das OP nach "verwendeten Treibern" gefragt hat, aber was ist, wenn der Treiber nicht installiert ist oder nicht verwendet wird? Wie kann man das nur durch die herausfinden vendorID:productID? Was ist auch, wenn es sich nicht um ein PCI-Gerät handelt und Sie es nur lsusbzum Beispiel sehen?
Dr. Beco
1
@ DrBeco: Aber wenn der Treiber nicht installiert ist, was möchten Sie finden? Sie sollten in diesem Fall nur googeln
Igor Chubin
24

Hier ist ein kleines Skript, das ich geschrieben habe :

#!/bin/bash
for f in /sys/class/net/*; do
    dev=$(basename $f)
    driver=$(readlink $f/device/driver/module)
    if [ $driver ]; then
        driver=$(basename $driver)
    fi
    addr=$(cat $f/address)
    operstate=$(cat $f/operstate)
    printf "%10s [%s]: %10s (%s)\n" "$dev" "$addr" "$driver" "$operstate"
done

Beispielausgabe:

$ ~/what_eth_drivers.sh 
      eth0 [52:54:00:aa:bb:cc]: virtio_net (up)
      eth1 [52:54:00:dd:ee:ff]: virtio_net (up)
      eth2 [52:54:00:99:88:77]: virtio_net (up)
        lo [00:00:00:00:00:00]:            (unknown)
Jonathon Reinhart
quelle
1
Ich lese viel lieber Links als zu finden / zu greifen. Gute Lösung.
Chris Mendez
Vielen Dank! Weitaus besser als das unzuverlässige 'dmesg | grep' (ring buffer ...)
Dominik R
Ich möchte eine Lösung finden, die auch vethund andere virtuelle Treiber finden würde . IMHO ist die einzige Lösung zu verwenden ethtooloder lshw.
Pevik
8

sudo lspci -vwerde es zeigen. so was:

$ sudo lspci -v
00:01.0 VGA compatible controller: Advanced Micro  Devices, Inc......
...
Kernel driver in use: radeon
Kernel modules: radeon

Sie können es auch so kombinieren grep:

$ sudo lspci -v | grep -A 20 VGA
mlibre
quelle
4

Wenn Sie einfach sysfs verwenden und nicht mit all diesen Befehlen umgehen möchten, die irgendwann in sysfs auftauchen, gehen Sie wie folgt vor:

Was ist das Modul / der Treiber für eth6? "sfc" ist es

# ls -l /sys/class/net/eth6/device/driver
lrwxrwxrwx 1 root root 0 Jan 22 12:30 /sys/class/net/eth6/device/driver ->
../../../../bus/pci/drivers/sfc

oder noch besser ... lass readlink den Pfad für dich auflösen.

# readlink -f /sys/class/net/eth6/device/driver
/sys/bus/pci/drivers/sfc 

Um herauszufinden, welche Treiber für all Ihre Netzwerkschnittstellen erforderlich sind, gehen Sie wie folgt vor:

# ls -1 /sys/class/net/ | grep -v lo | xargs -n1 -I{} bash -c 'echo -n {} :" " ; basename `readlink -f /sys/class/net/{}/device/driver`'

eth0 : tg3
eth1 : tg3
eth10 : mlx4_core
eth11 : mlx4_core
eth2 : tg3
eth3 : tg3
eth4 : mlx4_core
eth5 : mlx4_core
eth6 : sfc
eth7 : sfc
eth8 : sfc
eth9 : sfc
Monty Montemayor
quelle
Wie ist dieser besser als der von Jonathan Reinhart? unix.stackexchange.com/a/225496/47663
nhed
1
Wahrscheinlich dasselbe ... aber ich liebe einen Liner ... Ich kann die Dinge einfach direkt an der Befehlszeile anpassen ... nur für diejenigen, die keine Zeit haben, eine Datei zu öffnen und ein Skript zu schreiben.
Monty Montemayor
3

Mit dem lsmodBefehl können Sie den Status geladener Module / Gerätetreiber im Linux-Kernel abrufen.

Für ein bestimmtes Gerät können Sie auch dmesg |grep <device-name>die Details abrufen.


quelle
1
Vielen Dank. Aber wenn ich zwei Treiber für ein Gerät mit derselben Hauptnummer und einer anderen Nebennummer geladen habe und nur ein Treiber für das Gerät verwendet wird, wie kann ich dann herausfinden, welcher Treiber für dieses Gerät verwendet wird?
Vielleicht kann Ihnen diese SO-Frage weiterhelfen.
Wenn Ihr System noch nicht so lange online war, dass der Ringpuffer neu gestartet wurde, stellen Sie sicher, dass dmesg | grep <Gerätename> funktioniert; Dies funktioniert jedoch auf keinem meiner Router.
CJAC
3

Bei USB-basierten Geräten können Sie den Treibernamen mit dem folgenden lsusbBefehl anzeigen:

lsusb -t

Und / oder Sie verwenden eine lshwAuflistung der Geräte an allen Bussen, einschließlich USB, PCI usw., damit Sie sehen können, welcher Treiber verwendet wird:

sudo lshw
Pierz
quelle