Eintauchen in die Tiefen des Linux-Kernels mit `dmesg`
Der Befehl dmesg
eröffnet einen Einblick in die oft verborgenen Vorgänge beim Systemstart unter Linux. Er erlaubt es, Meldungen von Hardwaregeräten und Treibern zu prüfen und zu überwachen, die im Ringpuffer des Kernels gespeichert sind. Dieser „Freund der Fehlersuche“ hilft, Probleme aufzuspüren.
Wie der Ringpuffer von Linux funktioniert
In Linux und ähnlichen Betriebssystemen sind Boot- und Startvorgänge zwei unterschiedliche Abschnitte der Ereigniskette, die beim Einschalten des Computers ablaufen.
Der Bootvorgang (durchgeführt von BIOS oder UEFI, MBR und GRUB) initialisiert das System bis zu dem Punkt, an dem der Kernel in den Arbeitsspeicher geladen und mit der initialen RAM-Disk verbunden wird (initrd oder initramfs). Danach übernimmt systemd.
Die Startprozesse schließen die Betriebssysteminitialisierung ab. In dieser sehr frühen Phase sind Logging-Dienste wie syslogd oder rsyslogd noch nicht aktiv. Um zu verhindern, dass wichtige Fehler und Warnungen verloren gehen, speichert der Kernel diese in einem Ringpuffer.
Ein Ringpuffer ist ein Speicherbereich für Meldungen, der eine feste Größe hat. Wenn der Puffer voll ist, werden älteste Meldungen durch neue ersetzt. Man kann sich dies als eine Art „Schlange“ von Nachrichten vorstellen.
Der Kernel-Ringpuffer speichert Initialisierungsmeldungen von Gerätetreibern, Hardwaremeldungen und Meldungen von Kernelmodulen. Aufgrund dieser niedrigen Ebene ist er ein ausgezeichneter Ausgangspunkt für die Fehlersuche bei Hardwareproblemen oder Startfehlern.
Dabei hilft der Befehl dmesg
.
Der `dmesg` Befehl im Detail
Mit dmesg
können die im Ringpuffer gespeicherten Nachrichten eingesehen werden. In der Regel ist sudo
erforderlich.
sudo dmesg
Alle Nachrichten werden im Terminalfenster angezeigt.
Um die Menge der Informationen besser zu verarbeiten, empfiehlt sich die Weiterleitung an less
:
sudo dmesg | less
Nun ist es möglich, die Nachrichten zu durchsuchen und nach relevanten Einträgen zu suchen.
Mit der Suchfunktion von less
(Taste „/“) können gezielt Begriffe gefunden und hervorgehoben werden.
`sudo` für `dmesg` entfernen
Um die Verwendung von sudo
zu vermeiden, kann folgender Befehl genutzt werden. Es sollte jedoch beachtet werden, dass dadurch jeder Benutzer des Systems dmesg
ohne sudo
ausführen kann.
sudo sysctl -w kernel.dmesg_restrict=0
Farbausgabe erzwingen
Standardmäßig ist dmesg
oft farbig formatiert. Falls dies nicht der Fall ist, kann es mit -L
(für Farbe) erzwungen werden.
sudo dmesg -L
Um die farbige Ausgabe permanent zu aktivieren, kann folgender Befehl benutzt werden:
sudo dmesg --color=always
Verständliche Zeitstempel
Standardmäßig zeigt dmesg
Zeitstempel in Sekunden und Nanosekunden seit Kernelstart an. Mit der Option -H
(human) werden sie benutzerfreundlicher dargestellt.
sudo dmesg -H
Dies führt zu zwei Änderungen:
Die Ausgabe wird automatisch an less
weitergeleitet. Die Zeitstempel zeigen Datum und Uhrzeit in Minutenauflösung, während Nachrichten innerhalb der Minute durch Sekunden und Nanosekunden gekennzeichnet werden.
Noch lesbarere Zeitstempel
Wer keine Nanosekunden-Genauigkeit braucht, kann mit -T
(human-readable) noch lesbarere Zeitstempel erhalten. (Verwirrend ist, dass -H
die „human“ und -T
die „human-readable“ Option ist.)
sudo dmesg -T
Die Zeitstempel werden als Standarddatum und -zeit dargestellt, jedoch auf Minutengenauigkeit reduziert.
Alle Ereignisse innerhalb einer Minute haben denselben Zeitstempel. Diese Option leitet die Ausgabe nicht automatisch an less
weiter.
Live-Ereignisse beobachten
Mit der Option --follow
(auf Nachrichten warten) können Meldungen des Kernel-Ringpuffers live verfolgt werden. Auch wenn der Ringpuffer hauptsächlich während des Starts verwendet wird, können Meldungen auch während des laufenden Betriebs auftauchen.
Jegliche Änderung der Hardware führt zu Einträgen im Ringpuffer. So beispielsweise das Hinzufügen oder Aktualisieren von Kernelmodulen, das Anschließen von USB-Laufwerken oder Bluetooth-Geräten. Auch virtuelle Hardware wie beim Starten einer virtuellen Maschine verursacht neue Meldungen.
sudo dmesg --follow
Es wird nicht zur Eingabeaufforderung zurückgekehrt, sondern neue Meldungen werden am Ende des Fensters angezeigt.
Selbst das Einhängen einer CD-ROM führt zu Einträgen, da deren Inhalte in das Dateisystem eingebunden werden.
Mit Strg+C wird der Echtzeit-Feed beendet.
Die letzten zehn Nachrichten abrufen
Mit dem Befehl tail
kann eine bestimmte Anzahl von Nachrichten abgerufen werden. Im folgenden Beispiel sind es die letzten zehn:
sudo dmesg | tail -10
Die letzten zehn Nachrichten werden im Terminal angezeigt.
Nach bestimmten Begriffen suchen
Die Ausgabe von dmesg
kann durch grep
geleitet werden, um nach bestimmten Mustern zu suchen. Die Option -i
(Groß- und Kleinschreibung ignorieren) ermöglicht eine Suche ohne Beachtung der Groß- und Kleinschreibung:
sudo dmesg | grep -i usb
Die Ergebnisse werden hervorgehoben, unabhängig von Groß- und Kleinschreibung.
Meldungen mit Bezug auf die erste SCSI Festplatte (meistens sda für SATA– oder USB-Laufwerke) können isoliert werden:
sudo dmesg | grep -i sda
Alle Meldungen, die „sda“ enthalten, werden angezeigt.
Um nach mehreren Begriffen gleichzeitig zu suchen, kann die Option -E
(erweiterte reguläre Ausdrücke) mit einer Liste der Suchbegriffe verwendet werden, getrennt durch |
.
sudo dmesg | grep -E "memory|tty|dma"
Jede Meldung mit einem der Suchbegriffe wird im Terminal aufgelistet.
Protokollebenen verwenden
Jeder Meldung im Kernel-Ringpuffer ist eine Protokollebene zugeordnet, die ihre Bedeutung angibt. Folgende Level existieren:
emerg | System ist unbrauchbar |
alert | Sofortige Maßnahmen erforderlich |
crit | Kritische Bedingungen |
err | Fehlerbedingungen |
warn | Warnbedingungen |
notice | Normaler, aber signifikanter Zustand |
info | Information |
debug | Debug-Meldungen |
Mit dmesg -l
(Level) können Meldungen einer bestimmten Ebene abgerufen werden. Beispielsweise zeigt folgender Befehl nur Meldungen der Ebene „info“ an:
sudo dmesg -l info
Die Ausgabe zeigt ausschließlich Informationsmeldungen.
Mehrere Protokollebenen lassen sich kombinieren:
sudo dmesg -l debug,notice
Die Ausgabe ist eine Mischung von Meldungen beider Protokollebenen.
Die Anlagenkategorien
dmesg
-Meldungen sind in Kategorien, sogenannten „Einrichtungen“, eingeteilt. Die Liste dieser Einrichtungen lautet:
kern | Kernel-Nachrichten |
user | Benutzerebene-Nachrichten |
E-Mail-System | |
daemon | System-Dienste |
auth | Sicherheits-/Autorisierungsmeldungen |
syslog | Interne syslogd-Meldungen |
lpr | Zeilendrucker-Subsystem |
news | Netzwerk-Nachrichten-Subsystem |
Mit dmesg -f
(Einrichtung) können Meldungen einer bestimmten Einrichtung gefiltert werden:
sudo dmesg -f daemon
Hier werden nur Nachrichten bezüglich der „Dämon“-Einrichtung aufgelistet.
Auch hier können mehrere Einrichtungen kombiniert werden:
sudo dmesg -f syslog, daemon
Die Ausgabe enthält nun Meldungen aus Syslog und Daemon.
Kombination von Einrichtung und Ebene
Die Option -x
(decode) sorgt dafür, dass dmesg
die Einrichtung und Ebene als Präfix für jede Zeile ausgibt:
sudo dmesg -x
Am Anfang jeder Zeile werden Einrichtung und Ebene angezeigt.
Im ersten hervorgehobenen Abschnitt steht z.B. eine „Kernel“-Meldung der „Notice“-Ebene, im zweiten Abschnitt eine „Kernel“-Meldung der „Info“-Ebene.
Wozu das Ganze?
Kurz gesagt: Fehlersuche.
Wenn Hardware nicht erkannt wird oder sich nicht ordnungsgemäß verhält, liefert dmesg
wertvolle Hinweise.
dmesg
kann verwendet werden, um Meldungen von den höchsten bis zu den niedrigsten Ebenen nach Fehlern oder Warnungen zu durchsuchen, die mit der Hardware zusammenhängen könnten. Mit der Suche nach bestimmten Einrichtungen können relevante Meldungen isoliert werden. Mit grep
kann gezielt nach Herstellern, Modellnummern oder allgemeine Begriffe wie „gpu“ oder „memory“ gesucht werden. Auch Begriffe wie „failed“, „error“ oder „unable“ können Hinweise geben. Mit der Option --follow
können Echtzeitmeldungen beobachtet werden.
Viel Erfolg bei der Fehlersuche!