Linux: come trovare il driver di dispositivo utilizzato per un dispositivo?


59

Se il mio target ha un dispositivo collegato e molti driver caricati per quel dispositivo, come posso capire quale dispositivo sta usando quale driver?

Risposte:


46

Basta usare /sys.

Esempio. Voglio trovare il driver per la mia scheda Ethernet:

$ 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

Questo è r8169.

Per prima cosa devo trovare le coordinate del dispositivo usando lspci; quindi trovo il driver che viene utilizzato per i dispositivi con queste coordinate.


35
lspci -vlo fa da solo.
poige

7
lspci -nkti mostrerà i driver collegati. In generale il sysfs è il posto giusto per cercare.
0andriy,

@AndyShevchenko grazie! Sarà un grande risparmio di tempo per me :-D
pepoluan il

1
So che l'OP ha chiesto "driver utilizzati", ma cosa succede se il driver non è installato né utilizzato? Come scoprirlo solo dal vendorID:productID? Inoltre, cosa succede se non è un dispositivo PCI e lo vedi solo lsusbad esempio?
Dr Beco,

1
@DrBeco: Ma se il driver non è installato, cosa vuoi trovare? Dovresti semplicemente google in questo caso
Igor Chubin,

24

Ecco una piccola sceneggiatura che ho scritto :

#!/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

Uscita campione:

$ ~/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)

1
Preferisco di gran lunga leggere i link per trovare / grepping. Bella soluzione.
Chris Mendez,

Grazie! Molto meglio dell'inaffidabile 'dmesg | grep' (ring buffer ...)
Dominik R

Vorrei trovare una soluzione che troverebbe anche vethe altri driver virtuali. IMHO l'unica soluzione è usare ethtoolo lshw.
pevik,

8

sudo lspci -vlo mostrerò. come questo:

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

Puoi anche combinarlo con in grepquesto modo:

$ sudo lspci -v | grep -A 20 VGA

4

Se vuoi semplicemente usare sysfs e non vuoi gestire tutti questi comandi che alla fine guardano dentro sysfs, ecco come:

ad esempio, qual è il modulo / driver per eth6? "sfc" lo è

# 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

o meglio ancora .. lascia che readlink ti risolva il percorso.

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

quindi ... per capire quali sono i driver per tutte le tue interfacce di rete:

# 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

in che modo questo è migliore di quello pubblicato da Jonathan Reinhart? unix.stackexchange.com/a/225496/47663
nhed

1
Probabilmente lo stesso ... ma adoro una linea ... Posso facilmente aggiustare le cose direttamente dalla riga di comando ... solo per coloro che non hanno il tempo di aprire un file e scrivere uno script.
Monty Montemayor,

3

È possibile utilizzare il lsmodcomando per ottenere lo stato dei driver di moduli / dispositivi caricati nel kernel di Linux.

Per un dispositivo specifico, è possibile utilizzare anche dmesg |grep <device-name>per ottenere i dettagli.


1
Grazie. Ma se ho caricato due driver per un dispositivo con lo stesso no maggiore e diverso no minore e se per il dispositivo viene utilizzato solo un driver, come posso trovare quale driver viene utilizzato per quel dispositivo?

forse questa domanda SO può aiutarti ulteriormente.

Se il tuo sistema non è online da così tanto tempo che il ring ring è stato riavviato, assicurati dmesg | grep <device-name> funzionerà; questo non funziona su nessuno dei miei router, comunque.
cjac

3

Per i dispositivi basati su USB è possibile visualizzare il nome del driver utilizzando il lsusbcomando:

lsusb -t

E / o usi lshwquale enumera i dispositivi su tutti i bus inclusi USB, PCI, ecc. Così puoi vedere quale driver usa:

sudo lshw
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.