Chcete-li získat tyto informace od 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 0
. 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 pod /sys/dev
, uvidíte, že existují dva adresáře. Jeden s názvem 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
Můžu 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 tuto část v shellu jednoduše nahradit *
. Toto funguje 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 seznam ovladačů 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, abyste získali mnohem širší pohled 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 to funguje tak, že najde kanonické /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 nadřazených zařízeních a všech ovladačích, které používají.
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
Můžete použít udevadm
nástroj, jak to zjistit.
Příkaz by byl udevadm info -a -n /dev/sda
a pak se podívejte na DRIVER==
parametry.
# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'
sd
ahci
To ukazuje, že ve skutečnosti se na poskytování tohoto zařízení podílejí 2 ovladače, sd
a ahci
. První, sd
je přímo zodpovědný za /dev/sda
zařízení, ale používá ahci
ovladač pod.
Výstup udevadm
příkaz vypadá takto a obsahuje popis, jak funguje.
# 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==""
Použijte příkaz hwinfo a výstupní model a ovladač. Pokud neexistuje žádný ovladač, nezobrazí se. Například pro disky:
# 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"
Pro síťové karty:
# hwinfo --netcard | grep -Ei "driver\:|model\:" Model: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe" Driver: "tg3" Model: "Intel Wireless WiFi Link 5100" Driver: "iwlwifi"
Pro zařízení 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" [...]
Pomocí hwinfo --help zjistíte, jaké další typy zařízení můžete dotazovat. hwinfo je standardně nainstalováno, např. na SUSE Linux.