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.
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