Um diese Informationen von sysfs
zu erhalten Bestimmen Sie für eine Gerätedatei zuerst die Major/Minor-Nummer, indem Sie sich die Ausgabe von ls -l
ansehen , zB
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda
Die 8, 0
sagt uns, dass die Hauptnummer 8
ist und der Minor ist 0
. Die b
am Anfang der Auflistung sagt uns auch, dass es sich um ein Blockgerät handelt. Andere Geräte haben möglicherweise einen c
für Zeichengerät am Anfang.
Wenn Sie dann unter /sys/dev
nachsehen , sehen Sie, dass es zwei Verzeichnisse gibt. Einer namens block
und eine namens char
. Das Kinderspiel hier ist, dass diese jeweils für Block- und Zeichengeräte sind. Jedes Gerät ist dann über seine Major/Minor-Nummer in diesem Verzeichnis erreichbar. Wenn für das Gerät ein Treiber verfügbar ist, können Sie ihn finden, indem Sie das Ziel von driver
lesen Link in diesem oder dem device
Unterverzeichnis. ZB für meine /dev/sda
Ich kann einfach Folgendes tun:
$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd
Dies zeigt, dass die sd
Treiber für das Gerät verwendet wird. Wenn Sie sich nicht sicher sind, ob es sich bei dem Gerät um ein Block- oder Zeichengerät handelt, können Sie diesen Teil in der Shell einfach durch einen *
ersetzen . Das funktioniert genauso gut:
$ readlink /sys/dev/*/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd
Auf Blockgeräte kann auch direkt über ihren Namen über /sys/block
zugegriffen werden oder /sys/class/block
. Beispiel:
$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd
Beachten Sie, dass die Existenz verschiedener Verzeichnisse in /sys
kann sich je nach Kernel-Konfiguration ändern. Auch haben nicht alle Geräte einen device
Unterordner. Dies ist beispielsweise bei Partitionsgerätedateien wie /dev/sda1
der Fall . Hier müssen Sie auf das Gerät für die gesamte Festplatte zugreifen (leider gibt es keine sys
Links dazu).
Eine letzte Sache, die nützlich sein kann, ist, die Treiber für alle Geräte aufzulisten, für die sie verfügbar sind. Dazu können Sie mit Globs alle Verzeichnisse auswählen, in denen die Treiberverknüpfungen vorhanden sind. Beispiel:
$ 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
Abschließend, um ein wenig von der Frage abzuweichen, füge ich eine weitere /sys
hinzu glob-Trick, um einen viel breiteren Überblick darüber zu erhalten, welche Treiber von welchen Geräten verwendet werden (wenn auch nicht unbedingt von denen mit einer Gerätedatei):
find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls
Aktualisieren
Schauen Sie sich die Ausgabe von udevadm
genauer an , scheint es zu funktionieren, indem der kanonische /sys
gefunden wird Verzeichnis (wie Sie es erhalten würden, wenn Sie die Haupt-/Nebenverzeichnisse oben dereferenzieren würden), arbeitet sich dann den Verzeichnisbaum nach oben und druckt alle gefundenen Informationen aus. Auf diese Weise erhalten Sie auch Informationen über übergeordnete Geräte und alle von ihnen verwendeten Treiber.
Um damit zu experimentieren, habe ich das folgende Skript geschrieben, um den Verzeichnisbaum nach oben zu gehen und Informationen auf jeder relevanten Ebene anzuzeigen. udev
scheint auf jeder Ebene nach lesbaren Dateien zu suchen, deren Namen und Inhalt in ATTRS
integriert sind . Stattdessen zeige ich den Inhalt von uevent
an Dateien auf jeder Ebene (anscheinend definiert das Vorhandensein dieser eine bestimmte Ebene und nicht nur ein Unterverzeichnis). Ich zeige auch den Basisnamen aller Subsystem-Links, die ich finde, und dies zeigt, wie das Gerät in diese Hierarchie passt. udevadm
zeigt nicht die gleichen Informationen an, daher ist dies ein nettes ergänzendes Tool. Die übergeordneten Geräteinformationen (zB PCI
Informationen) ist auch nützlich, wenn Sie die Ausgabe anderer Tools wie lshw
abgleichen möchten zu Geräten höherer Ebene.
#!/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
Sie können den udevadm
verwenden Werkzeug, um dies zu entdecken.
Der Befehl wäre udevadm info -a -n /dev/sda
, und sehen Sie sich dann DRIVER==
an Parameter.
# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'
sd
ahci
Dies zeigt, dass tatsächlich 2 Treiber an der Bereitstellung dieses Geräts beteiligt sind, sd
und ahci
. Die erste, sd
ist direkt verantwortlich für /dev/sda
Gerät, aber es verwendet den ahci
Treiber darunter.
Die Ausgabe von udevadm
Befehl sieht so aus und enthält eine Beschreibung, wie er funktioniert.
# 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==""
Verwenden Sie den Befehl hwinfo und geben Sie Modell und Treiber aus. Wenn kein Treiber vorhanden ist, wird er nicht angezeigt. Zum Beispiel für Festplatten:
# 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"
Für Netzwerkkarten:
# hwinfo --netcard | grep -Ei "driver\:|model\:" Model: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe" Driver: "tg3" Model: "Intel Wireless WiFi Link 5100" Driver: "iwlwifi"
Für USB-Geräte:
# 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" [...]
Verwenden Sie hwinfo --help, um herauszufinden, welche anderen Gerätetypen Sie abfragen können. hwinfo wird standardmäßig installiert, z. unter SUSE Linux.