GNU/Linux >> Znalost Linux >  >> Linux

Linux – Jak najít ovladač (modul) spojený se zařízením v Linuxu?

V systému Linux za předpokladu:

  • zařízení, například /dev/sda ,
  • a jeho hlavní a vedlejší čísla, například 8, 0 ,

jak zjistím, který modul/ovladač jej „řídí“?

Mohu se ponořit do /sys nebo /proc zjistit to?

Přijatá odpověď:

Chcete-li získat tyto informace z sysfs u souboru zařízení nejprve určete hlavní/vedlejší číslo pohledem na výstup ls -l , např.

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

8, 0 nám říká, že hlavní číslo je 8 a vedlejší je . b na začátku výpisu nám také říká, že se jedná o blokové zařízení. Ostatní zařízení mohou mít c pro znakové zařízení na začátku.

Pokud se pak podíváte do /sys/dev , uvidíte, že existují dva adresáře. Jeden se nazývá block a jeden s názvem char . Nevadí, že se jedná o bloková a znaková zařízení. Každé zařízení je pak přístupné svým hlavním/vedlejším číslem je tento adresář. Pokud je pro zařízení k dispozici ovladač, lze jej nalézt přečtením cíle driver odkaz v tomto nebo device podadresář. Např. pro můj /dev/sda Mohu jednoduše:

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

To ukazuje, že sd pro zařízení se používá ovladač. Pokud si nejste jisti, zda se jedná o blokové nebo znakové zařízení, můžete v shellu jednoduše nahradit tuto část znakem * . Funguje to stejně dobře:

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

K blokovým zařízením lze také přistupovat přímo pod jejich jménem pomocí /sys/block nebo /sys/class/block . Např.:

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

Všimněte si, že v /sys existují různé adresáře se může měnit v závislosti na konfiguraci jádra. Také ne všechna zařízení mají device podsložku. To je například případ souborů zařízení s oddíly jako /dev/sda1 . Zde musíte přistupovat k zařízení pro celý disk (bohužel zde nejsou žádné sys odkazy pro toto).

Poslední věc, která může být užitečná, je vypsat ovladače pro všechna zařízení, pro která jsou k dispozici. K tomu můžete použít globs k výběru všech adresářů, ve kterých jsou přítomny odkazy na ovladače. Např.:

$ 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

Na závěr, abych se trochu odklonil od otázky, přidám další /sys glob trik k získání mnohem širšího pohledu na to, které ovladače jsou používány jakými zařízeními (i když ne nutně těmi se souborem zařízení):

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

Aktualizovat

Podívejte se blíže na výstup udevadm , zdá se, že funguje nalezením kanonického /sys adresář (jak byste získali, kdybyste dereferencovali hlavní/vedlejší adresáře výše), pak postupuje nahoru ve stromu adresářů a vytiskne všechny informace, které najde. Tímto způsobem získáte informace o rodičovských zařízeních a všech ovladačích, které používají.

Související:Linux – Přestat sledovat výstup konkrétního programu po použití příkazu watch?

Abych s tím experimentoval, napsal jsem níže uvedený skript, který projde stromem adresářů a zobrazí informace na každé relevantní úrovni. udev Zdá se, že hledá čitelné soubory na každé úrovni, přičemž jejich názvy a obsah jsou začleněny do ATTRS . Místo toho zobrazím obsah uevent soubory na každé úrovni (zdánlivě přítomnost tohoto definuje odlišnou úroveň spíše než jen podadresář). Zobrazuji také základní název všech odkazů subsystému, které najdu, a to ukazuje, jak zařízení zapadá do této hierarchie. udevadm nezobrazuje stejné informace, takže jde o příjemný doplňkový nástroj. Informace o nadřazeném zařízení (např. PCI informace) je také užitečné, pokud chcete porovnat výstup jiných nástrojů, jako je lshw na zařízení vyšší úrovně.

#!/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. Jak nainstalovat ovladač zařízení v systému Linux

  2. Jak auditovat oprávnění pomocí příkazu find

  3. Jak používat Linuxový příkaz find k hledání souborů

  1. Jak najít modul jádra pro dané zařízení?

  2. Jak najít všechny řídké soubory v Linuxu

  3. Jak přenést výsledky 'najít' do mv v Linuxu

  1. Jak zjistit, zda je disk SSD nebo HDD v Linuxu

  2. Jak najít duplicitní soubory v Linuxu? Nápověda je zde s příkazem fdupes!

  3. Linux:Jak najít ovladač zařízení používaný pro zařízení?