GNU/Linux >> Tutoriels Linux >  >> Linux

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

Pour obtenir ces informations depuis sysfs pour un fichier de périphérique, déterminez d'abord le nombre 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 0 . 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 blocage 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 tout le 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.

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 l'appareil 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

Vous pouvez utiliser le udevadm outil pour le découvrir.
La commande serait udevadm info -a -n /dev/sda , puis regardez le DRIVER== paramètres.

# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'  
sd
ahci

Cela montre qu'il y a en fait 2 pilotes impliqués dans la fourniture de ce périphérique, sd et ahci . Le premier, sd est directement responsable du /dev/sda périphérique, mais il utilise le ahci pilote en dessous.

La sortie du udevadm La commande ressemble à ceci et inclut une description de son fonctionnement.

# udevadm info -a -n /dev/sda      

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="500118192"
    ATTR{stat}=="   84786     1420  3091333    40215   966488    12528 14804028  2357668        0  1146934  2396653"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}==""
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="0"
    ATTR{capability}=="50"
    ATTR{events_async}==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="VZJ4"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{model}=="LITEONIT LMT-256"
    ATTRS{state}=="running"
    ATTRS{queue_type}=="simple"
    ATTRS{iodone_cnt}=="0x10daad"
    ATTRS{iorequest_cnt}=="0x10ead1"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{device_busy}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{queue_depth}=="31"
    ATTRS{vendor}=="ATA     "
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{device_blocked}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{iocounterbits}=="32"
    ATTRS{eh_timeout}=="10"

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
    KERNELS=="ata1"
    SUBSYSTEMS==""
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
    KERNELS=="0000:00:1f.2"
    SUBSYSTEMS=="pci"
    DRIVERS=="ahci"
    ATTRS{irq}=="41"
    ATTRS{subsystem_vendor}=="0x144d"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x010601"
    ATTRS{enabled}=="1"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{local_cpus}=="0f"
    ATTRS{device}=="0x1e03"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0xc0d3"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Utilisez la commande hwinfo et le modèle de sortie et le pilote. S'il n'y a pas de pilote, il ne sera pas affiché. Par exemple pour les disques :

# hwinfo --block | grep -Ei "driver\:|model\:"
  Model: "Floppy Disk"
  Model: "FUJITSU MHZ2080B"
  Driver: "ahci", "sd"
  Model: "Partition"
  Model: "Partition"
  Model: "Partition"
  Model: "Generic Multi-Card"
  Driver: "ums-realtek", "sd"
  Model: "Realtek USB2.0-CRW"
  Driver: "ums-realtek"

Pour les cartes réseau :

# hwinfo --netcard | grep -Ei "driver\:|model\:"
  Model: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe"
  Driver: "tg3"
  Model: "Intel Wireless WiFi Link 5100"
  Driver: "iwlwifi"

Pour les périphériques USB :

# hwinfo --usb | grep -Ei "driver\:|model\:"
  Model: "Linux 3.11.10-7-desktop uhci_hcd UHCI Host Controller"
  Driver: "hub"
  Model: "Linux 3.11.10-7-desktop uhci_hcd UHCI Host Controller"
  Driver: "hub"
  Model: "IDEACOM IDC 6680"
  Driver: "usbhid"
  [...]

Utilisez hwinfo --help pour savoir quels autres types d'appareils vous pouvez interroger. hwinfo est installé par défaut, par ex. sur SUSE Linux.


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

  2. Comment savoir si le disque est un SSD ou un disque dur sous Linux

  3. Comment auditer les autorisations avec la commande find

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

  5. Comment diriger les résultats de 'find' vers mv 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