GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-dmesg-Befehl - Kernel-Ringpuffer drucken

Dmesg-Befehl druckt den Nachrichtenpuffer des Kernels. Der Dmesg-Befehl wird hauptsächlich verwendet, um ausgefallene Geräte, Hot-Plug-Geräte wie USB, E/A-Gerätefehler zu identifizieren.

Wenn das System Gerätetreiber startet, die im Kernel-Setup mit relevanten Hardwaregeräten vorhanden sind. Zu dieser Zeit erzeugen Treiber und andere Elemente mit Kernel Nachrichten. Diese Nachrichten werden in einem kleinen Pufferbereich gespeichert und jeweils überschrieben, wenn neue Nachrichten kommen. Die meisten Linux-Distributionen speichern diese Meldungen unter /var/log/dmesg. Dmesg liest direkt aus dem Ringpuffer des Kernels, nicht aus /var/log/dmesg. Syslog standardmäßig (abhängig von Linux-Distributionen) oder zum Erfassen von Nachrichten konfiguriert.

Dmesg-Filialen Kernel-Meldungen während des Bootens und nach dem Booten. Nach dem Booten erzeugt der Kernel gelegentlich Meldungen, wenn es I/O-Fehler, angeschlossene Geräte usw. gibt. Diese Meldungen werden auch an die Systemkonsole gesendet. Dmesg-Ausgabe ist oft groß, kann mit more, tail oder grep gefiltert werden.

Verwendung des dmesg-Befehls

Der Dmesg-Befehl gibt standardmäßig N Nachrichten aus dem Kernel-Ringpuffer aus.

$ dmesg

Beispielausgabe:

[    1.230638] kernel: Run /init as init process
 [    1.336492] kernel: scsi host0: Virtio SCSI HBA
 [    1.338612] kernel: scsi 0:0:0:0: Direct-Access     QEMU     QEMU HARDDISK    2.5+ PQ: 0 ANSI: 5
 [    1.338727] kernel: input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input4
 [    1.342266] kernel: input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
 [    1.345242] kernel: lpc_ich 0000:00:1f.0: I/O space for GPIO uninitialized
 [    1.346920] kernel: ahci 0000:00:1f.2: version 3.0
 [    1.350864] kernel: scsi host1: Virtio SCSI HBA
 [    1.358377] kernel: scsi host2: Virtio SCSI HBA
 [    1.359317] kernel: PCI Interrupt Link [GSIA] enabled at IRQ 16
 [    1.359718] kernel: scsi 1:0:1:2: Direct-Access     QEMU     QEMU HARDDISK    2.5+ PQ: 0 ANSI: 5
 [    1.361478] kernel: ahci 0000:00:1f.2: AHCI 0001.0000 32 slots 6 ports 1.5 Gbps 0x3f impl SATA mode
 [    1.363039] kernel: i801_smbus 0000:00:1f.3: SMBus using PCI interrupt

Die Dmesg-Ausgabe ist hauptsächlich in 3 Teile unterteilt:

  • Zeit: Zeigt Ihnen die Anzahl der Sekunden ab der Startzeit an. Wenn Sie 20.091730 finden. Es bedeutet, dass die Nachricht 20 Sekunden nach dem Booten erstellt wird.
  • Gerätename: Gerätenamen anzeigen
  • Nachrichten: Die eigentliche Botschaft. Von hier aus können wir analysieren, was passiert ist.

1) Wie man dmesg liest

Der Dmesg-Befehl ohne Optionen erzeugt eine große Ausgabe. Verwenden Sie zur besseren Lesbarkeit den Befehl grep oder less, um die Ausgabe zu filtern. Sehen wir uns einige Beispiele an.

Dmesg-Ausgabe pro Seite drucken

$ dmesg | less

Beispielausgabe:

[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.8.0-31-generic (buildd@aatxe) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) ) #46-Ubuntu SMP Tue Sep 10 19:56:49 UTC 2013 (Ubuntu 3.8.0-31.46-generic 3.8.13.8)
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] NSC Geode by NSC
[ 0.000000] Cyrix CyrixInstead
[ 0.000000] Centaur CentaurHauls
[ 0.000000] Transmeta GenuineTMx86
[ 0.000000] Transmeta TransmetaCPU
[ 0.000000] UMC UMC UMC UMC

Informationen zu eth drucken

$ dmesg | grep eth

Beispielausgabe:

[ 1.972418] e1000 0000:00:03.0 eth0: (PCI:33MHz:32-bit) 08:00:27:d2:c1:16
[ 1.972430] e1000 0000:00:03.0 eth0: Intel(R) PRO/1000 Network Connection
[ 18.867656] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 21.733138] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[ 21.737967] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 21.738052] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

Informationen zu USB drucken

$ dmesg | grep usb

Beispielausgabe:

[ 0.131874] ACPI: bus type usb registered
[ 0.131910] usbcore: registered new interface driver usbfs
[ 0.131921] usbcore: registered new interface driver hub
[ 0.131955] usbcore: registered new device driver usb
[ 1.091722] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[ 1.091727] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.091730] usb usb1: Product: OHCI Host Controller
[ 1.091731] usb usb1: Manufacturer: Linux 3.8.0-31-generic ohci_hcd
[ 1.091733] usb usb1: SerialNumber: 0000:00:06.0

Bitte beachten Sie, dass beim grep-Befehl Groß- und Kleinschreibung beachtet wird . dh aus dem obigen Beispiel ergeben "usb" und "USB" unterschiedliche Ergebnisse. Verwenden Sie den Parameter -i nach dem Befehl grep, um die Groß-/Kleinschreibung zu ignorieren . Vergleichen Sie diese Befehlsausgabe mit dem USB-Fall oben.

$ dmesg | grep -i usb

Beispielausgabe:

[ 0.131874] ACPI: bus type usb registered
[ 0.131910] usbcore: registered new interface driver usbfs
[ 0.131921] usbcore: registered new interface driver hub
[ 0.131955] usbcore: registered new device driver usb
[ 0.997759] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.997783] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 0.997929] ohci_hcd 0000:00:06.0: new USB bus registered, assigned bus number 1
[ 1.091722] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[ 1.091727] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.091730] usb usb1: Product: OHCI Host Controller
[ 1.091731] usb usb1: Manufacturer: Linux 3.8.0-31-generic ohci_hcd
[ 1.091733] usb usb1: SerialNumber: 0000:00:06.0
[ 1.091856] hub 1-0:1.0: USB hub found
[ 1.093110] uhci_hcd: USB Universal Host Controller Interface driver

Anzeige der gewünschten Ausgabe mit Head/Tail

Sie haben beispielsweise ein Wechselmedium eingelegt oder Änderungen an Datenträgervolumes vorgenommen. Um die neuesten Einträge von dmesg zu überprüfen, verwenden Sie den Tail Befehl.

So zeigen Sie die letzten N Zeilen des dmesg-Protokolls an:

$ dmesg | tail -15

Um die ersten paar Zeilen aus dem dmesg-Protokoll zu finden, verwenden Sie auf ähnliche Weise den Befehl head. Dies ist nützlich, um die Änderungen zu finden, die direkt nach dem Hochfahren aufgetreten sind.

$ dmesg | head -15

Echtzeitüberwachung

Verwenden Sie für die kontinuierliche Überwachung in Echtzeit die Option -f .

$ tail -f /var/log/dmesg

Verwenden Sie alternativ watch dmesg:

$ watch "dmesg | tail -15"

Einige Linux-Systeme unterstützen die Verwendung von dmesg -w, das auf neue Nachrichten wartet.

2) Druck in menschenlesbarem Format

Um die dmesg-Ausgabe in einem für Menschen lesbaren Format zu drucken, verwenden Sie die Option -H.

$ dmesg -H

3) Wandeln Sie den Zeitstempel in ein benutzerdefiniertes Datumsformat um

Standardmäßig ist der Zeitstempel der dmesg-Ausgabe nicht für Menschen lesbar. Um den Zeitstempel in ein benutzerdefiniertes Datumsformat zu ändern, verwenden Sie die Option --ctime oder -T.

$ dmesg  --ctime

Beispielausgabe :

[Tue Dec 10 16:34:33 2013] 131MB HIGHMEM available.
[Tue Dec 10 16:34:33 2013] 891MB LOWMEM available.
[Tue Dec 10 16:34:33 2013] mapped low ram: 0 - 37bfe000
[Tue Dec 10 16:34:33 2013] low ram: 0 - 37bfe000
[Tue Dec 10 16:34:33 2013] Zone ranges:
[Tue Dec 10 16:34:33 2013] DMA [mem 0x00010000-0x00ffffff]
[Tue Dec 10 16:34:33 2013] Normal [mem 0x01000000-0x37bfdfff]
[Tue Dec 10 16:34:33 2013] HighMem [mem 0x37bfe000-0x3ffeffff]
[Tue Dec 10 16:34:33 2013] Movable zone start for each node
[Tue Dec 10 16:34:33 2013] Early memory node ranges
[Tue Dec 10 16:34:33 2013] node 0: [mem 0x00010000-0x0009efff]
[Tue Dec 10 16:34:33 2013] node 0: [mem 0x00100000-0x3ffeffff

Sie können auch --time-format verwenden, um Zeitstempel im angegebenen Format zu drucken, das ctime, reltime, delta oder iso sein kann.

Wenn Zeitstempel nicht aktiviert ist dann zeigt der Befehl dmesg möglicherweise keinen Zeitstempel in der Ausgabe an.

Um zu überprüfen, ob Zeitstempel aktiviert sind oder nicht, öffnen Sie die Datei /sys/module/printk/parameters/time:

$ cat /sys/module/printk/parameters/time
N

Wenn der Inhalt der Datei N ist, ist der Zeitstempel nicht aktiviert. Sie können den folgenden Befehl ausführen, um den Zeitstempel zu aktivieren:

$ echo Y > /sys/module/printk/parameters/time

4) dmesg löschen

Um Meldungen aus dem Ringpuffer des Kernels zu löschen, verwenden Sie die Option -C.

$ dmesg -C

Um den Ringpuffer nach dem Drucken seines Inhalts zu löschen, verwenden Sie die Option -c.

$ dmesg -c

Selbst wenn Sie dmesg mit den Parametern -c oder -C löschen, können Sie immer noch die Protokolle in /var/log/kern.log anzeigen oder /var/log/dmesg.

5) Verhindern Sie, dass Dmesg sich bei der Konsole anmeldet

Um das Drucken von Nachrichten an die Konsole zu deaktivieren, verwenden Sie die Option -D.

$ dmesg -D

Eine alternative Option ist die Verwendung von -n 1, um zu verhindern, dass alle Meldungen außer Notfallmeldungen (Panikmeldungen) auf der Konsole erscheinen.

Um das Drucken von Nachrichten an die Konsole zu aktivieren, verwenden Sie -E.

$ dmesg -E

6) Einrichtungsspezifische Meldungen anzeigen

Ausdrucken von Meldungen einer bestimmten Kategorie oder Einrichtung. Um diesen Zweck zu erfüllen, verwenden Sie die Option --facility.

Geben Sie im Beispiel zum Drucken einer E-Mail-spezifischen Nachricht Folgendes ein:

$ dmesg --facility=daemon

Unterstützte Protokollfunktionen sind:

kern - Kernel-Meldungen
user - zufällige Nachrichten auf Benutzerebene
mail - Mailsystem
daemon - Systemdämonen
auth - Sicherheits-/Autorisierungsnachrichten
syslog - Meldungen, die intern von syslogd generiert werden
lpr - Zeilendrucker-Subsystem
news - Netzwerk-News-Subsystem

7) Protokollebene drucken

Verwenden Sie die Option --level, um Meldungen zu drucken, die für die Protokollebene spezifisch sind. Um beispielsweise alle Warnmeldungen zu drucken, führen Sie den folgenden Befehl aus:

$ dmesg --level=warn

Beispielausgabe:

[ 0.000000] tsc: Fast TSC calibration failed
[ 19.595760] piix4_smbus 0000:00:07.0: SMBus base address uninitialized - upgrade BIOS or use force_addr=0xaddr

Unterstützte Protokollebenen sind:

Notruf - System ist unbrauchbar
Alarm – es muss sofort gehandelt werden
crit - kritische Bedingungen
err - Fehlerbedingungen
warn - Warnbedingungen
Hinweis - normaler, aber signifikanter Zustand
info - informativ
debug - Meldungen auf Debug-Ebene

8) Anzeigeeinrichtung und Level in menschenlesbarer Form

Um Einrichtung und Protokollebene in einem für Menschen lesbaren Format auszudrucken, verwenden Sie die Option -x.

$ dmesg -x

Beispielausgabe:

kern :debug : [ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
kern :info : [ 0.000000] e820: last_pfn = 0x3fff0 max_arch_pfn = 0x1000000
kern :debug : [ 0.000000] MTRR default type: uncachable
kern :debug : [ 0.000000] MTRR variable ranges disabled:
kern :info : [ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
kern :info : [ 0.000000] CPU MTRRs all blank - virtualized system.

9) Kernel-Nachricht drucken

Um Kernel-spezifische Meldungen auszugeben, verwenden Sie die Option -k.

$ dmesg -k

10) Zeitstempel ignorieren

Wenn Sie den Kernel-Zeitstempel nicht drucken möchten, verwenden Sie die Option -t.

$ dmesg -t

Schlussfolgerung

Dmesg kann sehr nützlich sein, um Probleme im Zusammenhang mit dem System zu diagnostizieren. In diesem Tutorial haben wir gelernt, wie man den Befehl dmesg unter Linux verwendet.


Linux
  1. Linux-mv-Befehl

  2. Linux-Du-Befehl

  3. dmesg-Befehlsbeispiele unter Linux

  4. awk-Befehlsbeispiele unter Linux

  5. Stellen Sie die Pipe-Kapazität in Linux ein

Modprobe-Befehl unter Linux

Sysctl-Befehl unter Linux

Linux-dmesg-Befehls-Tutorial für Anfänger (5 Beispiele)

Linux-Befehl id - Gibt Benutzer-ID- und Gruppen-ID-Informationen aus

sysctl-Befehl unter Linux

3 Möglichkeiten zum Überprüfen der Linux-Kernel-Version in der Befehlszeile