GNU/Linux >> Belajar Linux >  >> Linux

Linux – Bagaimana Cara Menemukan Driver (modul) yang Berhubungan Dengan Perangkat Di Linux?

Di Linux, diberikan:

  • perangkat, misalnya /dev/sda ,
  • dan bilangan mayor dan minornya, misalnya 8, 0 ,

bagaimana saya bisa tahu modul / driver mana yang "menggerakkannya"?

Bisakah saya menggali /sys atau /proc untuk mengetahuinya?

Jawaban yang Diterima:

Untuk mendapatkan informasi ini dari sysfs untuk file device, tentukan dulu bilangan mayor/minornya dengan melihat output dari ls -l , misalnya

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

8, 0 memberitahu kita bahwa angka utama adalah 8 dan minornya adalah . b di awal daftar juga memberi tahu kita bahwa itu adalah perangkat blok. Perangkat lain mungkin memiliki c untuk perangkat karakter di awal.

Jika Anda kemudian melihat di bawah /sys/dev , Anda akan melihat ada dua direktori. Yang disebut block dan satu bernama char . Tidak perlu khawatir di sini adalah bahwa ini masing-masing untuk perangkat blok dan karakter. Setiap perangkat kemudian dapat diakses dengan nomor mayor/minornya adalah direktori ini. Jika ada driver yang tersedia untuk perangkat, itu dapat ditemukan dengan membaca target driver tautan ini atau device sub-direktori. Misalnya, untuk /dev/sda saya Saya hanya bisa melakukan:

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

Ini menunjukkan bahwa sd driver digunakan untuk perangkat. Jika Anda tidak yakin apakah perangkat tersebut adalah perangkat blok atau karakter, di shell Anda cukup mengganti bagian ini dengan * . Ini juga berfungsi dengan baik:

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

Perangkat blok juga dapat diakses langsung melalui namanya melalui /sys/block atau /sys/class/block . Misal:

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

Perhatikan bahwa keberadaan berbagai direktori di /sys dapat berubah tergantung pada konfigurasi kernel. Juga tidak semua perangkat memiliki device subfolder. Misalnya, ini adalah kasus untuk file perangkat partisi seperti /dev/sda1 . Di sini Anda harus mengakses perangkat untuk seluruh disk (sayangnya tidak ada sys tautan untuk ini).

Hal terakhir yang berguna untuk dilakukan adalah membuat daftar driver untuk semua perangkat yang tersedia. Untuk ini, Anda dapat menggunakan gumpalan untuk memilih semua direktori tempat tautan driver ada. Misal:

$ 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

Terakhir, untuk sedikit menyimpang dari pertanyaan, saya akan menambahkan /sys . yang lain trik glob untuk mendapatkan perspektif yang lebih luas tentang driver mana yang digunakan oleh perangkat mana (meskipun tidak harus yang memiliki file perangkat):

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

Perbarui

Melihat lebih dekat pada keluaran udevadm , tampaknya berfungsi dengan menemukan /sys kanonik direktori (seperti yang akan Anda dapatkan jika Anda melakukan dereferensi direktori mayor/minor di atas), kemudian naik ke pohon direktori, mencetak informasi apa pun yang ditemukannya. Dengan cara ini Anda mendapatkan informasi tentang perangkat induk dan driver yang mereka gunakan juga.

Terkait:Linux – Berhenti menonton output dari program tertentu setelah menggunakan perintah watch?

Untuk bereksperimen dengan ini, saya menulis skrip di bawah ini untuk berjalan ke atas pohon direktori dan menampilkan informasi di setiap level yang relevan. udev tampaknya mencari file yang dapat dibaca di setiap level, dengan nama dan kontennya tergabung dalam ATTRS . Alih-alih melakukan ini, saya menampilkan konten uevent file di setiap level (tampaknya kehadiran ini mendefinisikan level yang berbeda daripada hanya subdirektori). Saya juga menunjukkan nama dasar dari setiap tautan subsistem yang saya temukan dan ini menunjukkan bagaimana perangkat cocok dalam hierarki ini. udevadm tidak menampilkan informasi yang sama, jadi ini adalah alat pelengkap yang bagus. Informasi perangkat induk (mis. PCI informasi) juga berguna jika Anda ingin mencocokkan keluaran alat lain seperti lshw ke perangkat tingkat yang lebih tinggi.

#!/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. Cara Mengetahui Apakah Disk Adalah SSD Atau HDD Di Linux

  2. Cara mengaudit izin dengan perintah find

  3. Cara Menemukan File dengan Perintah fd di Linux

  1. Cara menginstal driver perangkat di Linux

  2. Bagaimana menemukan semua file yang jarang di Linux

  3. Cara mem-pipe hasil 'find' ke mv di Linux

  1. Bagaimana menemukan file duplikat di Linux? Bantuan ada di sini dengan perintah fdupes!

  2. Linux:Bagaimana Menemukan Driver Perangkat yang Digunakan Untuk Perangkat?

  3. Bagaimana Cara Menemukan Modul Kernel Untuk Perangkat yang Diberikan?