Unter Linux gegeben:
- ein Gerät, zum Beispiel
/dev/sda
, - und seine großen und kleinen Zahlen, zum Beispiel
8, 0
,
wie kann ich wissen, welches Modul / welcher Treiber es "fährt"?
Kann ich mich damit befassen /sys
oder /proc
es entdecken?
Unter Linux gegeben:
/dev/sda
,8, 0
,wie kann ich wissen, welches Modul / welcher Treiber es "fährt"?
Kann ich mich damit befassen /sys
oder /proc
es entdecken?
Antworten:
Um diese Informationen sysfs
für eine Gerätedatei abzurufen, ermitteln Sie zuerst die Haupt- / Nebenzahl, indem Sie die Ausgabe von ls -l
z
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda
Das 8, 0
sagt uns, dass die Hauptzahl 8
und die Nebenzahl ist 0
. Der b
am Anfang der Auflistung steht auch, dass es sich um ein Blockgerät handelt. Andere Geräte können c
am Anfang ein For-Character-Gerät haben.
Wenn Sie dann unter nachsehen /sys/dev
, sehen Sie, dass es zwei Verzeichnisse gibt. Einer hat angerufen block
und einer hat angerufen char
. Hier ist es ein Kinderspiel, dass dies für Block- bzw. Zeichengeräte gilt. Jedes Gerät ist dann über seine Haupt- / Nebenstellennummer in diesem Verzeichnis erreichbar. Wenn für das Gerät ein Treiber verfügbar ist, können Sie diesen finden, indem Sie das Ziel des driver
Links in diesem oder dem device
Unterverzeichnis lesen . Zum Beispiel kann /dev/sda
ich für meine einfach tun:
$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd
Dies zeigt, dass der 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 in der Shell diesen Teil einfach durch ein 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
oder zugegriffen werden /sys/class/block
. Z.B:
$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd
Beachten Sie, dass sich das Vorhandensein verschiedener Verzeichnisse in /sys
Abhängigkeit von der Kernelkonfiguration ändern kann. Auch haben nicht alle Geräte einen device
Unterordner. Dies ist beispielsweise der Fall für Partitionsgerätedateien wie /dev/sda1
. Hier muss auf das Gerät für die gesamte Festplatte zugegriffen werden (leider gibt es dafür keine sys
Links).
Als letztes kann es nützlich sein, die Treiber für alle Geräte aufzulisten, für die sie verfügbar sind. Dazu können Sie mit Hilfe von Globs alle Verzeichnisse auswählen, in denen die Treiberlinks vorhanden sind. Z.B:
$ ls -l /sys/dev/*/*/device/driver ls -l /sys/dev/*/*/driver
ls: cannot access ls: No such file or directory
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
Um ein wenig von der Frage abzuweichen, füge ich einen weiteren /sys
Glob-Trick hinzu, um einen viel umfassenderen Überblick darüber zu erhalten, welche Treiber von welchen Geräten verwendet werden (allerdings nicht unbedingt die mit einer Gerätedatei):
find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls
Wenn Sie sich die Ausgabe von genauer ansehen udevadm
, scheint dies zu funktionieren, indem Sie das kanonische /sys
Verzeichnis suchen (wie Sie es erhalten würden, wenn Sie die Haupt- / Nebenverzeichnisse oben dereferenzieren würden), dann den Verzeichnisbaum nach oben durcharbeiten und alle gefundenen Informationen ausdrucken. Auf diese Weise erhalten Sie Informationen zu übergeordneten Geräten und den von ihnen verwendeten Treibern.
Um damit zu experimentieren, habe ich das folgende Skript geschrieben, um den Verzeichnisbaum zu durchlaufen und Informationen auf jeder relevanten Ebene anzuzeigen. udev
scheint auf jeder Ebene nach lesbaren Dateien zu suchen, in die ihre Namen und Inhalte eingefügt werden ATTRS
. Anstatt dies zu tun, zeige ich den Inhalt der uevent
Dateien auf jeder Ebene an (anscheinend definiert das Vorhandensein dieser Ebene eine andere als nur ein Unterverzeichnis). Ich zeige auch den Basisnamen aller gefundenen Subsystem-Links und dies zeigt, wie das Gerät in diese Hierarchie passt. udevadm
zeigt nicht die gleichen Informationen an, daher ist dies ein nützliches ergänzendes Tool. Die übergeordneten Geräteinformationen (z. B. PCI
Informationen) sind auch nützlich, wenn Sie die Ausgabe anderer Tools lshw
an Geräte höherer Ebene anpassen möchten .
#!/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
udevadm
Antwort wird Ihnen sd
und geben ahci
. Gibt es eine Möglichkeit, festzustellen, ahci
ob auch verwendet wird?
device/device/
, also readlink
sah mein Befehl so aus readlink /sys/dev/char/XX\:Y/device/device/driver
.
Sie können das udevadm
Tool verwenden, um dies zu entdecken.
Der Befehl wäre udevadm info -a -n /dev/sda
, und dann schauen Sie sich die DRIVER==
Parameter an.
# 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
. Der erste sd
ist direkt für das /dev/sda
Gerät verantwortlich, nutzt aber den ahci
Treiber underneith.
Die Ausgabe des udevadm
Befehls sieht folgendermaßen aus und enthält eine Beschreibung der Funktionsweise.
# 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==""
udevadm
entfernt (oder sogar empfohlen) wird? Ich kann nichts finden, was einen Hinweis darauf gibt.
Verwenden Sie den Befehl hwinfo und geben Sie das Modell und den Treiber aus. Wenn kein Treiber vorhanden ist, wird dieser nicht angezeigt. Zum Beispiel für Festplatten:
# hwinfo --block | grep -Ei "Treiber \: | Modell \:" Modell: "Diskette" Modell: "FUJITSU MHZ2080B" Treiber: "ahci", "sd" Modell: "Partition" Modell: "Partition" Modell: "Partition" Modell: "Generic Multi-Card" Treiber: "ums-realtek", "sd" Modell: "Realtek USB2.0-CRW" Treiber: "ums-realtek"
Für Netzwerkkarten:
# hwinfo --netcard | grep -Ei "Treiber \: | Modell \:" Modell: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe" Treiber: "tg3" Modell: "Intel Wireless WiFi Link 5100" Treiber: "iwlwifi"
Für USB-Geräte:
# hwinfo --usb | grep -Ei "Treiber \: | Modell \:" Modell: "Linux 3.11.10-7-desktop uhci_hcd UHCI Host Controller" Treiber: "hub" Modell: "Linux 3.11.10-7-desktop uhci_hcd UHCI Host Controller" Treiber: "hub" Modell: "IDEACOM IDC 6680" Fahrer: "usbhid" [...]
Verwenden Sie hwinfo --help, um herauszufinden, welche anderen Gerätetypen Sie abfragen können. hwinfo wird standardmäßig installiert, z. B. unter SUSE Linux.
--only
Option hinzufügen . Eg hwinfo --block --only /dev/sda | grep ...
.
lshw
ist ein großartiges Tool, um die in Ihrem Computer gefundene Hardware aufzulisten. Sie müssen es zuerst installieren, bevor Sie es ausführen können.
$ yum install lshw
$ apt-get install lshw
Verwenden Sie yum
oder apt-get
je nach verwendetem System. Gehen Sie dann wie folgt vor, um die Speicherhardware speziell aufzulisten:
# lshw -class storage
*-storage
description: SATA controller
product: 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
vendor: Intel Corporation
physical id: 1f.2
bus info: pci@0000:00:1f.2
version: 06
width: 32 bits
clock: 66MHz
capabilities: storage msi pm ahci_1.0 bus_master cap_list
configuration: driver=ahci latency=0
resources: irq:41 ioport:1830(size=8) ioport:1824(size=4) ioport:1828(size=8) ioport:1820(size=4) ioport:1800(size=32) memory:f0305000-f03057ff
Möglicherweise möchten Sie es ausführen root
, um alle Informationen zurückzugewinnen.
Ansonsten lspci
kann man auch Angaben zu deiner Hardware machen:
$ lspci -vv
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 4 port SATA AHCI Controller (rev 06) (prog-if 01 [AHCI 1.0])
Subsystem: Dell Device 0434
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 41
Region 0: I/O ports at 1830 [size=8]
Region 1: I/O ports at 1824 [size=4]
Region 2: I/O ports at 1828 [size=8]
Region 3: I/O ports at 1820 [size=4]
Region 4: I/O ports at 1800 [size=32]
Region 5: Memory at f0305000 (32-bit, non-prefetchable) [size=2K]
Capabilities: <access denied>
Kernel driver in use: ahci
Um die Haupt- und Nebennummer eines Geräts herauszufinden, führen Sie ls
es einfach aus .
$ ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 13 avril 10:54 /dev/sda
In dieser Ausgabe bedeutet b
in brw-rw----.
, dass es sich um ein Blockgerät handelt. Die Ziffern 8
und 0
sind jeweils die Haupt- und Nebennummer des Geräts.
lshw
und sehen lspci
Sie das von einem Gerät verwendete Modul: configuration: driver = ahci latence = 0 und den verwendeten Kerneltreiber: ahci .
lsmod
,/proc/modules
undmodinfo
?