Linux: Comment trouver le pilote de périphérique utilisé pour un périphérique?

59

Si ma cible a un périphérique connecté et plusieurs pilotes pour ce périphérique chargés, comment puis-je savoir quel périphérique utilise quel pilote?

Alexios
la source

Réponses:

46

Il suffit d'utiliser /sys.

Exemple. Je veux trouver le pilote pour ma carte 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

C'est ça r8169.

Je dois d'abord trouver les coordonnées de l'appareil à l'aide de lspci; puis je trouve le pilote qui est utilisé pour les périphériques avec ces coordonnées.

Igor Chubin
la source
35
lspci -vle fait par lui-même.
poige
7
lspci -nkvous montrera les pilotes attachés. En général, le système est le bon endroit pour chercher.
0andriy
@AndyShevchenko merci! Ce sera une grande économie de temps pour moi :-D
pepoluan
1
Je sais que l'OP a demandé "les pilotes utilisés", mais que se passe-t-il si le pilote n'est pas installé ni utilisé? Comment savoir juste par le vendorID:productID? De plus, que se passe-t-il si ce n'est pas un périphérique PCI et que vous ne le voyez que dans, lsusbpar exemple?
Dr Beco
1
@DrBeco: Mais si le pilote n'est pas installé, que voulez-vous trouver? Vous devriez juste google dans ce cas
Igor Chubin
24

Voici un petit script que j'ai écrit :

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

Exemple de sortie:

$ ~/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
la source
1
Je préfère de loin la lecture de liens à la recherche / grepping. Belle solution.
Chris Mendez le
Merci! Bien meilleur que le peu fiable 'dmesg | grep' (tampon de sonnerie ...)
Dominik R
Je voudrais trouver une solution qui trouverait aussi vethet d'autres pilotes virtuels. IMHO la seule solution est d'utiliser ethtoolou lshw.
Pevik
8

sudo lspci -vva le montrer. comme ça:

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

Vous pouvez également le combiner avec grepcomme ceci:

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

Si vous voulez simplement utiliser sysfs et ne voulez pas gérer toutes ces commandes qui finissent par regarder à l'intérieur de sysfs, voici comment:

dis, quel est le module / pilote pour eth6? "sfc" c'est

# 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

ou mieux encore .. laissez readlink résoudre le chemin pour vous.

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

alors ... pour savoir quels sont les pilotes pour toutes vos interfaces réseau:

# 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
la source
en quoi celui-ci est-il meilleur que celui de Jonathan Reinhart? unix.stackexchange.com/a/225496/47663
nhed le
1
Probablement la même chose ... mais j'aime une seule doublure ... Je peux facilement ajuster les choses directement en ligne de commande ... juste pour ceux qui n'ont pas le temps d'ouvrir un fichier et d'écrire un script.
Monty Montemayor le
3

Vous pouvez utiliser la lsmodcommande pour obtenir l'état des pilotes de modules / périphériques chargés dans le noyau Linux.

Pour un appareil spécifique, vous pouvez également dmesg |grep <device-name>obtenir les détails.


la source
1
Merci. Mais si j'ai chargé deux pilotes pour un périphérique avec le même numéro majeur et un numéro différent, et si un seul pilote est utilisé pour le périphérique, comment puis-je savoir quel pilote est utilisé pour ce périphérique?
Peut - être que cette question SO peut vous aider davantage.
Si votre système n'a pas été en ligne si longtemps que la mémoire tampon en anneau a été redémarrée, assurez-vous que dmesg | grep <nom-appareil> fonctionnera; cela ne fonctionne sur aucun de mes routeurs, cependant.
Cjac
3

Pour les périphériques USB, vous pouvez voir le nom du pilote en utilisant la lsusbcommande:

lsusb -t

Et / ou vous utilisez lshwqui énumère les périphériques sur tous les bus, y compris USB, PCI, etc. afin que vous puissiez voir quel pilote il utilise:

sudo lshw
Pierz
la source