GNU/Linux >> Tutoriels Linux >  >> Linux

Linux – Comment trouver le pilote (module) associé à un périphérique sous Linux ?

Sous Linux, donné :

  • un appareil, par exemple /dev/sda ,
  • et ses nombres majeur et mineur, par exemple 8, 0 ,

comment puis-je savoir quel module/pilote le "pilote" ?

Puis-je creuser dans /sys ou /proc découvrir ça ?

Réponse acceptée :

Pour obtenir ces informations depuis sysfs pour un fichier de périphérique, déterminez d'abord le numéro majeur/mineur en regardant la sortie de ls -l , par exemple

 $ ls -l /dev/sda
 brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda

Le 8, 0 nous indique que le nombre majeur est 8 et le mineur est . Le b au début de la liste nous indique également qu'il s'agit d'un périphérique de bloc. D'autres appareils peuvent avoir un c pour le périphérique de caractère au début.

Si vous regardez ensuite sous /sys/dev , vous verrez qu'il y a deux répertoires. Un appelé block et un appelé char . L'évidence ici est que ceux-ci sont respectivement destinés aux périphériques de bloc et de caractère. Chaque appareil est alors accessible par son numéro majeur/mineur dans ce répertoire. Si un pilote est disponible pour le périphérique, il peut être trouvé en lisant la cible du driver lien dans ce ou le device sous-répertoire. Par exemple, pour mon /dev/sda Je peux simplement faire :

$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

Cela montre que le sd pilote est utilisé pour le périphérique. Si vous ne savez pas si le périphérique est un périphérique bloc ou caractère, dans le shell, vous pouvez simplement remplacer cette partie par un * . Cela fonctionne aussi bien :

$ readlink /sys/dev/*/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

Les périphériques de bloc sont également accessibles directement via leur nom via /sys/block ou /sys/class/block . Ex :

$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd

Notez que l'existence de divers répertoires dans /sys peut changer en fonction de la configuration du noyau. De plus, tous les appareils n'ont pas un device sous-dossier. Par exemple, c'est le cas pour les fichiers de périphérique de partition comme /dev/sda1 . Ici, vous devez accéder au périphérique pour l'ensemble du disque (malheureusement, il n'y a pas de sys liens pour cela).

Une dernière chose qui peut être utile est de lister les pilotes de tous les périphériques pour lesquels ils sont disponibles. Pour cela, vous pouvez utiliser des globs pour sélectionner tous les répertoires dans lesquels les liens du pilote sont présents. Ex :

$ ls -l /sys/dev/*/*/device/driver && ls -l /sys/dev/*/*/driver 
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/block/11:0/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:16/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:32/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:0/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:1024/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:128/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:256/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:384/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:512/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:513/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:514/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:640/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:643/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:768/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:896/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/21:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:0/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:1/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:2/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/252:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/254:0/device/driver -> ../../../bus/pnp/drivers/rtc_cmos
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/29:0/device/driver -> ../../../bus/platform/drivers/simple-framebuffer
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:64/device/driver -> ../../../bus/pnp/drivers/serial
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:65/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:66/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:67/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/6:0/device/driver -> ../../../bus/pnp/drivers/parport_pc
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/99:0/device/driver -> ../../../bus/pnp/drivers/parport_pc

Enfin, pour diverger un peu de la question, j'ajouterai un autre /sys glob pour avoir une perspective beaucoup plus large sur quels pilotes sont utilisés par quels périphériques (mais pas nécessairement ceux avec un fichier de périphérique) :

find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls

Mettre à jour

En regardant de plus près la sortie de udevadm , il semble fonctionner en trouvant le /sys canonique répertoire (comme vous l'obtiendriez si vous déréférenciez les répertoires majeurs/mineurs ci-dessus), puis remontez l'arborescence des répertoires, en imprimant toutes les informations qu'il trouve. De cette façon, vous obtenez des informations sur les appareils parents et sur les pilotes qu'ils utilisent également.

Connexe :Linux – Arrêtez de regarder la sortie d'un programme particulier après avoir utilisé la commande watch ?

Pour expérimenter cela, j'ai écrit le script ci-dessous pour parcourir l'arborescence des répertoires et afficher des informations à chaque niveau pertinent. udev semble rechercher des fichiers lisibles à chaque niveau, leurs noms et contenus étant incorporés dans ATTRS . Au lieu de faire cela, j'affiche le contenu du uevent fichiers à chaque niveau (apparemment, la présence de ceci définit un niveau distinct plutôt qu'un simple sous-répertoire). Je montre également le nom de base de tous les liens de sous-système que je trouve et cela montre comment le périphérique s'intègre dans cette hiérarchie. udevadm n'affiche pas les mêmes informations, c'est donc un bel outil complémentaire. Les informations sur le périphérique parent (par exemple, PCI information) est également utile si vous souhaitez faire correspondre la sortie d'autres outils comme lshw aux appareils de niveau supérieur.

#!/bin/bash

dev=$(readlink -m $1)

# test for block/character device
if [ -b "$dev" ]; then
  mode=block
elif [ -c "$dev" ]; then
  mode=char
else
  echo "$dev is not a device file" >&2
  exit 1
fi

# stat outputs major/minor in hex, convert to decimal
data=( $(stat -c '%t %T' $dev) ) || exit 2
major=$(( 0x${data[0]} ))
minor=$(( 0x${data[1]} ))

echo -e "Given device:     $1"
echo -e "Canonical device: $dev"
echo -e "Major: $major"
echo -e "Minor: $minor\n"

# sometimes nodes have been created for devices that are not present
dir=$(readlink -f /sys/dev/$mode/$major\:$minor)
if ! [ -e "$dir" ]; then
  echo "No /sys entry for $dev" >&2
  exit 3
fi

# walk up the /sys hierarchy one directory at a time
# stop when there are three levels left 
while [[ $dir == /*/*/* ]]; do

  # it seems the directory is only of interest if there is a 'uevent' file
  if [ -e "$dir/uevent" ]; then
    echo "$dir:"
    echo "  Uevent:"
    sed 's/^/    /' "$dir/uevent"

    # check for subsystem link
    if [ -d "$dir/subsystem" ]; then
        subsystem=$(readlink -f "$dir/subsystem")
        echo -e "\n  Subsystem:\n    ${subsystem##*/}"
    fi

    echo
  fi

  # strip a subdirectory
  dir=${dir%/*}
done

Linux
  1. Comment installer un pilote de périphérique sous Linux

  2. Comment auditer les autorisations avec la commande find

  3. Comment utiliser la commande Linux find pour rechercher des fichiers

  4. Comment diriger les résultats de 'find' vers mv sous Linux

  5. Comment trouver le driver (module) associé à un périphérique sous Linux ?

Comment trouver des applications installées avec une taille installée sous Linux

Comment trouver le numéro de port d'un service sous Linux

Comment trouver la taille totale d'un répertoire sous Linux

Comment rechercher des fichiers avec la commande fd sous Linux

Comment trouver la liste des référentiels installés sous Linux

Comment changer le mot de passe root sous Linux