it-swarm.com.de

Linux: Wie finde ich den Gerätetreiber, der für ein Gerät verwendet wird?

Wie kann ich verstehen, welches Gerät welchen Treiber verwendet, wenn auf meinem Ziel ein Gerät angeschlossen und viele Treiber für dieses Gerät geladen sind?

65
Deepu

Benutz 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 mit lspci finden. dann finde ich treiber, der für die geräte mit diesen koordinaten verwendet wird.

50
Igor Chubin

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)
28

Sudo lspci -v wird 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 wie folgt mit grep kombinieren:

$ Sudo lspci -v | grep -A 20 VGA
11
mlibre

Wenn Sie nur sysfs verwenden möchten und nicht mit all diesen Befehlen umgehen möchten, die schließlich sowieso in sysfs angezeigt werden, 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 .. lassen Sie readlink den Pfad für Sie auflösen.

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

also ... um herauszufinden, was die Treiber für alle Ihre Netzwerkschnittstellen sind:

# 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
4

Mit dem Befehl lsmod können Sie den Status der geladenen Modul-/Gerätetreiber im Linux-Kernel abrufen.

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

3
gkris

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

lsusb -t

Und/oder Sie verwenden lshw, das die Geräte auf allen Bussen einschließlich USB, PCI usw. auflistet, damit Sie sehen können, welchen Treiber es verwendet:

Sudo lshw
3
Pierz