Untuk mendapatkan informasi ini dari sysfs
untuk file perangkat, pertama tentukan angka mayor/minor 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 mayor adalah 8
dan minornya adalah 0
. b
di awal daftar juga memberi tahu kami 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. Satu disebut block
dan satu bernama char
. No-brainer 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 dari driver
tautan dalam 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
. Misalnya:
$ 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 berlaku 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 glob untuk memilih semua direktori yang berisi tautan driver. Misalnya:
$ 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
lainnya trik glob untuk mendapatkan perspektif yang lebih luas tentang driver mana yang digunakan oleh perangkat mana (meskipun tidak harus dengan file perangkat):
find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls
Perbarui
Melihat lebih dekat pada output dari udevadm
, tampaknya berfungsi dengan menemukan kanonis /sys
direktori (seperti yang akan Anda dapatkan jika Anda melakukan dereferensi pada direktori mayor/minor di atas), kemudian menelusuri pohon direktori, mencetak informasi apa pun yang ditemukannya. Dengan cara ini Anda mendapatkan informasi tentang perangkat induk dan driver apa pun yang mereka gunakan juga.
Untuk bereksperimen dengan ini, saya menulis skrip di bawah ini untuk menelusuri pohon direktori dan menampilkan informasi di setiap level yang relevan. udev
tampaknya mencari file yang dapat dibaca di setiap level, dengan nama dan kontennya dimasukkan ke dalam ATTRS
. Alih-alih melakukan ini, saya menampilkan konten uevent
file di setiap level (tampaknya keberadaan this mendefinisikan level yang berbeda, bukan 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 (misalnya 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
Anda dapat menggunakan udevadm
alat untuk menemukan ini.
Perintahnya adalah udevadm info -a -n /dev/sda
, lalu lihat DRIVER==
parameter.
# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'
sd
ahci
Ini menunjukkan bahwa sebenarnya ada 2 driver yang terlibat dalam penyediaan perangkat ini, sd
dan ahci
. Yang pertama, sd
bertanggung jawab langsung atas /dev/sda
perangkat, tetapi menggunakan ahci
driver di bawahnya.
Output dari udevadm
perintah terlihat seperti ini, dan menyertakan deskripsi cara kerjanya.
# 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==""
Gunakan perintah hwinfo dan model keluaran dan driver. Jika tidak ada driver, itu tidak akan ditampilkan. Misalnya untuk disk:
# 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"
Untuk kartu jaringan:
# hwinfo --netcard | grep -Ei "driver\:|model\:" Model: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe" Driver: "tg3" Model: "Intel Wireless WiFi Link 5100" Driver: "iwlwifi"
Untuk perangkat 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" [...]
Gunakan hwinfo --help untuk mencari tahu jenis perangkat apa yang dapat Anda tanyakan. hwinfo diinstal secara default mis. di SUSE Linux.