Hur man använder kommandot dmesg på Linux

Kommandot dmesg låter dig titta in i den dolda världen av Linux-startprocesserna. Granska och övervaka meddelanden om hårdvaruenhet och drivrutiner från kärnans egen ringbuffert med ”felsökarens vän.”

Hur Linuxs ringbuffert fungerar

I Linux- och Unix-liknande datorer är uppstart och start två distinkta faser av händelseförloppet som äger rum när datorn slås på.

Startprocesserna (BIOS eller UEFI, MBRoch RÖJA) ta initieringen av systemet till den punkt där kärnan laddas in i minnet och ansluts till den initiala ramdisken (initrd eller initramfs), och systemd startas.

Startprocesserna plockar sedan upp stafettpinnen och slutför initieringen av operativsystemet. I de mycket tidiga stadierna av initieringen, loggar demoner som t.ex syslogd eller rsyslogd är inte igång ännu. För att undvika att tappa anmärkningsvärda felmeddelanden och varningar från denna fas av initiering, innehåller kärnan en ringbuffert som den använder som ett meddelandelager.

En ringbuffert är ett minnesutrymme reserverat för meddelanden. Den är enkel i designen och av en fast storlek. När den är full skriver nyare meddelanden över de äldsta meddelandena. Konceptuellt kan det ses som ett ”cirkulär buffert.”

Kärnringbufferten lagrar information såsom initieringsmeddelanden från enhetsdrivrutiner, meddelanden från hårdvara och meddelanden från kärnmoduler. Eftersom den innehåller dessa startmeddelanden på låg nivå är ringbufferten ett bra ställe att starta en undersökning av maskinvarufel eller andra startproblem.

Men gå inte tomhänt. Ta dmesg med dig.

Kommandot dmesg

Kommandot dmesg låter dig för att granska meddelandena som är lagrade i ringbufferten. Som standard måste du använda sudo för att använda dmesg.

sudo dmesg

Alla meddelanden i ringbufferten visas i terminalfönstret.

Det var en syndaflod. Det vi behöver göra är uppenbarligen mindre:

sudo dmesg | less

Nu kan vi bläddra igenom meddelandena och leta efter föremål av intresse.

Du kan använda sökfunktionen inom mindre för att hitta och markera objekt och termer som du är intresserad av. Starta sökfunktionen genom att trycka på snedstreckstangenten ”/” mindre.

Ta bort behovet av sudo

Om du vill undvika att behöva använda sudo varje gång du använder dmesg kan du använda detta kommando. Men var medveten om: det låter alla med ett användarkonto som din dator använder dmesg utan att behöva använda sudo.

sudo sysctl -w kernel.dmesg_restrict=0

Framtvingar färgutmatning

Som standard kommer dmesg troligen att konfigureras för att producera färgade utdata. Om det inte är det kan du be dmesg att färglägga dess utdata med alternativet -L (färg).

sudo dmesg -L

För att tvinga dmesg att alltid använda en färgskärm som standard, använd det här kommandot:

sudo dmesg --color=always

Mänskliga tidsstämplar

Som standard använder dmesg en tidsstämpelnotation på sekunder och nanosekunder sedan kärnan startade. För att få detta renderat i ett mer människovänligt format, använd alternativet -H (human).

sudo dmesg -H

Detta gör att två saker händer.

Utgången visas automatiskt i mindre.
Tidsstämplarna visar en tidsstämpel med datum och tid, med en minutupplösning. Meddelanden som inträffade under varje minut är märkta med sekunder och nanosekunder från början av den minuten.

Mänskliga läsbara tidsstämplar

Om du inte kräver nanosekunders noggrannhet, men du vill ha tidsstämplar som är lättare att läsa än standardinställningarna, använd alternativet -T (läsbart för människor). (Det är lite förvirrande. -H är det ”mänskliga” alternativet, -T är det ”läsbara” alternativet.)

sudo dmesg -T

Tidsstämplarna återges som standarddatum och tider, men upplösningen sänks till en minut.

Allt som hände inom en enda minut har samma tidsstämpel. Om allt du bryr dig om är händelseförloppet, är detta tillräckligt bra. Observera också att du dumpas tillbaka vid kommandotolken. Det här alternativet anropar inte automatiskt mindre.

Tittar på liveevenemang

För att se meddelanden när de anländer till kärnringbufferten, använd alternativet –följ (vänta på meddelanden). Den meningen kan tyckas lite konstig. Om ringbufferten används för att lagra meddelanden från händelser som äger rum under startsekvensen, hur kan livemeddelanden komma in i ringbufferten när datorn väl är igång?

Allt som orsakar en förändring i hårdvaran som är ansluten till din dator kommer att göra att meddelanden skickas till kärnringbufferten. Uppdatera eller lägg till en kärnmodul så kommer du att se ringbuffertmeddelanden om dessa ändringar. Om du ansluter en USB-enhet eller ansluter eller kopplar bort en Bluetooth-enhet, kommer du att se meddelanden i dmesg-utgången. Även virtuell hårdvara kommer att få nya meddelanden att dyka upp i ringbufferten. Starta en virtuell maskin och du kommer att se ny information som kommer till ringbufferten.

sudo dmesg --follow

Observera att du inte återgår till kommandotolken. När nya meddelanden dyker upp visas de av dmesg längst ner i terminalfönstret.

Även montering av en CD-ROM-skiva ses som en förändring, eftersom du har ympat in innehållet på CD-ROM-skivan på katalogträdet.

För att avsluta realtidsflödet, tryck Ctrl+C.

Hämta de tio senaste meddelandena

Använd svanskommandot för att hämta de sista tio kärnring buffertmeddelanden. Naturligtvis kan du hämta hur många meddelanden som helst. Tio är bara vårt exempel.

sudo dmesg | last -10

De senaste tio meddelandena hämtas och listas i terminalfönstret.

Söker efter specifika villkor

Pipe utdata från dmesg genom grep för att söka efter särskilda strängar eller mönster. Här använder vi alternativet -i (ignorera skiftläge) så att fallet med matchande strängar ignoreras. våra resultat kommer att inkludera ”usb” och ”USB” och alla andra kombinationer av gemener och versaler.

sudo dmesg | grep -i usb

De markerade sökresultaten är med stora och små bokstäver.

Vi kan isolera de meddelanden som innehåller referenser till det första SCSI hårddisk på systemets sda. (Faktiskt används sda också nuförtiden för den första SATA-hårddiskenoch för USB-enheter.)

sudo dmesg | grep -i sda

Alla meddelanden som nämner sda hämtas och listas i terminalfönstret.

För att få grep att söka efter flera termer samtidigt, använd alternativet -E (extend regular expression). Du måste ange söktermerna i en citerad sträng med pipe ”|” avgränsare mellan söktermerna:

sudo dmesg | grep -E "memory|tty|dma"

sudo dmesg |  grep -E

Alla meddelanden som nämner någon av söktermerna listas i terminalfönstret.

utdata från sudo dmesg |  grep -E

Använda loggnivåer

Varje meddelande som loggas till kärnringbufferten har en nivå kopplad till sig. Nivån representerar vikten av informationen i meddelandet. Nivåerna är:

emerg: Systemet är oanvändbart.
varning: Åtgärder måste vidtas omedelbart.
crit: Kritiska förhållanden.
err: Felförhållanden.
varna: Varningsförhållanden.
notering: Normalt men betydande tillstånd.
info: Information.
debug: meddelanden på felsökningsnivå.

Vi kan göra dmesg extrahera meddelanden som matchar en viss nivå genom att använda alternativet -l (nivå) och skicka namnet på nivån som en kommandoradsparameter. För att bara se meddelanden på ”informationsnivå”, använd det här kommandot:

sudo dmesg -l info

Alla meddelanden som listas är informationsmeddelanden. De innehåller inga fel eller varningar, bara användbara meddelanden.

Kombinera två eller flera loggnivåer i ett kommando för att hämta meddelanden på flera loggnivåer:

sudo dmesg -l debug,notice

Utdata från dmesg är en blandning av meddelanden för varje loggnivå:

Anläggningskategorierna

Dmesg-meddelandena är grupperade i kategorier som kallas ”faciliteter.” Listan över faciliteter är:

kern: Kärnmeddelanden.
användare: meddelanden på användarnivå.
mail: Mailsystem.
daemon: Systemdemoner.
auth: Säkerhets-/auktoriseringsmeddelanden.
syslog: Interna syslogd-meddelanden.
lpr: Undersystem för linjeskrivare.
nyheter: Nätverksnyheter undersystem.

Vi kan be dmesg att filtrera dess utdata för att bara visa meddelanden i en specifik anläggning. För att göra det måste vi använda alternativet -f (facilitet):

sudo dmesg -f daemon

dmesg listar alla meddelanden relaterade till demoner i terminalfönstret.

Som vi gjorde med nivåerna kan vi be dmesg att lista meddelanden från mer än en anläggning samtidigt:

sudo dmesg -f syslog, daemon

Utdata är en blandning av syslog- och demonloggmeddelanden.

Kombinera anläggning och nivå

Alternativet -x (avkoda) gör att dmesg visar anläggningen och nivån som mänskligt läsbara prefix för varje rad.

sudo dmesg -x

Anläggningen och nivån kan ses i början av varje rad:

Det första markerade avsnittet är ett meddelande från ”kärnans”-anläggningen med en nivå av ”notis”. Den andra markerade sektionen är ett meddelande från ”kärna”-anläggningen med en nivå av ”info.”

Det är bra, men varför?

I ett nötskal, felsökning.

Om du har problem med att en hårdvara inte känns igen eller inte beter sig korrekt, kan dmesg kasta lite ljus över problemet.

Använd dmesg för att granska meddelanden från den högsta nivån ner till varje lägre nivå, leta efter eventuella fel eller varningar som nämner hårdvaruobjektet, eller som kan ha betydelse för problemet.
Använd dmesg för att söka efter omnämnande av lämplig anläggning för att se om de innehåller någon användbar information.
Pipe dmesg genom grep och leta efter relaterade strängar eller identifierare som produkttillverkare eller modellnummer.
Pipe dmesg genom grep och leta efter generiska termer som ”gpu” eller ”lagring”, eller termer som ”fel”, ”misslyckades” eller ”inte kan”.
Använd alternativet –följ och titta på dmesg-meddelanden i realtid.

Glad jakt.