Hur man använder kommandot dmesg på Linux

Utforska Linux startprocesser med kommandot dmesg

Kommandot dmesg ger dig möjlighet att granska detaljerade meddelanden om hårdvaruenheter och drivrutiner som genereras under Linux startsekvens. Det är ett kraftfullt verktyg för att felsöka problem och få insikt i systemets interna funktion.

Hur Linux ringbuffert fungerar

I Linux och andra Unix-baserade system skiljer man på start och uppstart som två distinkta skeden i processen som inleds när datorn slås på.

Startprocesserna, som involverar BIOS eller UEFI, MBR och GRUB, förbereder systemet fram till den punkt där kärnan (kernel) laddas in i minnet och ansluts till den initiala ramdisken (initrd eller initramfs), varefter systemd startas.

Efter detta tar uppstartsprocesserna över och fullbordar initialiseringen av operativsystemet. I de tidiga stegen är loggningsdemoner som syslogd eller rsyslogd ännu inte aktiva. För att säkerställa att viktiga felmeddelanden inte går förlorade, använder kärnan en ringbuffert som en temporär lagringsplats för meddelanden.

En ringbuffert är ett dedikerat minnesområde för meddelanden. Den är enkel, av fast storlek och fungerar så att nya meddelanden överskriver de äldsta när bufferten är full. Man kan se det som en ”cirkulär buffert”.

I kärnans ringbuffert lagras bland annat meddelanden från enhetsdrivrutiner, hårdvarumeddelanden och kärnmodulmeddelanden. Eftersom den innehåller startmeddelanden på låg nivå, är ringbufferten en värdefull resurs för att undersöka hårdvarufel eller startrelaterade problem.

Men du behöver inte gissa dig fram. Använd kommandot dmesg!

Kommandot dmesg

Med dmesg kan du granska meddelandena som finns sparade i ringbufferten. Vanligtvis krävs sudo för att köra dmesg.

sudo dmesg

Detta kommando visar alla meddelanden från ringbufferten direkt i terminalen.

Detta kan vara en överväldigande mängd information. Använd pipelining till kommandot less för att underlätta läsningen:

sudo dmesg | less

Nu kan du scrolla genom meddelandena och söka efter det du är intresserad av.

Använd less sökfunktion genom att trycka på ”/”-tangenten, för att hitta specifika ord eller fraser.

Ta bort behovet av sudo

Om du vill slippa använda sudo varje gång du använder dmesg, kan du köra följande kommando. Men observera att detta tillåter alla användare på din dator att använda dmesg utan sudo.

sudo sysctl -w kernel.dmesg_restrict=0

Tvinga fram färgutmatning

Normalt sett är dmesg konfigurerat för färgad utmatning. Om det inte är fallet kan du tvinga fram färger med alternativet -L:

sudo dmesg -L

För att alltid använda färger som standard, använd det här kommandot:

sudo dmesg --color=always

Mänskliga tidsstämplar

Som standard visas tidsstämplar i sekunder och nanosekunder sedan kärnan startade. För ett mer användarvänligt format, använd alternativet -H:

sudo dmesg -H

Detta medför två saker:

Utdata visas automatiskt med less.
Tidsstämplarna visar datum och tid med en minutupplösning, och meddelanden inom varje minut visas med sekunder och nanosekunder.

Läsbar tidstämplar

Om du inte behöver nanosekundnoggrannhet men vill ha enklare läsbara tidsstämplar än standardformatet, använd alternativet -T (human readable). Notera skillnaden mellan -H och -T: -H står för ”human” och -T för ”human readable.”

sudo dmesg -T

Tidsstämplarna visas nu som standarddatum och tider, men med en minutupplösning.

Alla händelser som inträffar under en minut har samma tidsstämpel. Om du endast behöver se händelseförloppet är detta tillräckligt. Notera att du skickas tillbaka till kommandoprompten, då det här alternativet inte automatiskt använder less.

Visa livehändelser

För att se meddelanden i realtid när de kommer till kärnans ringbuffert, använd alternativet –follow. Du kanske undrar hur livemeddelanden kan komma in i ringbufferten efter att datorn har startat.

Varje ändring i ansluten hårdvara genererar meddelanden till ringbufferten. Om du lägger till eller tar bort en kärnmodul ser du information om dessa ändringar. Detsamma gäller när du kopplar in eller ur USB-enheter eller Bluetooth-enheter. Även virtuell hårdvara genererar meddelanden. Starta en virtuell maskin så visas ny information i ringbufferten.

sudo dmesg --follow

Notera att du inte skickas tillbaka till kommandoprompten. Nya meddelanden visas löpande längst ner i terminalfönstret.

Även när du monterar en CD-ROM-skiva ses det som en förändring eftersom du ”ympar in” innehållet på CD:n i katalogträdet.

Tryck Ctrl+C för att avsluta realtidsflödet.

Hämta de tio senaste meddelandena

Använd kommandot tail för att visa de tio sista meddelandena från kärnans ringbuffert. Självklart kan du ändra antalet meddelanden du hämtar.

sudo dmesg | tail -10

De senaste tio meddelandena visas i terminalfönstret.

Sök efter specifika villkor

Använd pipelining och grep för att söka efter specifika ord eller mönster. Med alternativet -i ignoreras skillnaden mellan stora och små bokstäver, så sökresultaten inkluderar ”usb”, ”USB” och alla andra kombinationer.

sudo dmesg | grep -i usb

De matchade sökresultaten, oavsett bokstavsstorlek, visas.

Vi kan filtrera meddelanden som innehåller information om den första SCSI hårddisken (sda). (Idag används sda också för SATA-diskar och USB-enheter).

sudo dmesg | grep -i sda

Alla meddelanden som nämner sda visas i terminalen.

För att grep ska söka efter flera termer, använd alternativet -E (extended regular expression) och ange söktermerna med ”|” som avgränsare inom citationstecken:

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

Alla meddelanden som matchar någon av söktermerna visas i terminalen.

Loggnivåer

Varje meddelande i kärnans ringbuffert är associerat med en nivå som indikerar meddelandets vikt. Nivåerna är:

emerg: Systemet är oanvändbart.
alert: Omedelbara åtgärder krävs.
crit: Kritiska förhållanden.
err: Fel.
warning: Varning.
notice: Normala men viktiga händelser.
info: Information.
debug: Felsökningsmeddelanden.

Vi kan använda dmesg för att filtrera meddelanden efter nivå. Använd alternativet -l (level) med namnet på nivån som parameter. För att se meddelanden med informationsnivå, använd det här kommandot:

sudo dmesg -l info

Endast informationsmeddelanden visas, utan fel eller varningar, enbart användbara meddelanden.

Du kan kombinera 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 debug- och notice-meddelanden.

Anläggningskategorier

Dmesg-meddelandena är grupperade i kategorier som kallas ”anläggningar”. Följande anläggningar finns:

kern: Kärnmeddelanden.
user: Meddelanden på användarnivå.
mail: E-postsystem.
daemon: Systemdemoner.
auth: Säkerhets-/auktoriseringsmeddelanden.
syslog: Interna syslogd-meddelanden.
lpr: Undersystem för linjeskrivare.
news: Nätverksnyheter.

Vi kan använda dmesg för att endast visa meddelanden från en specifik anläggning med alternativet -f (facility). För att visa meddelanden relaterade till demoner, använd detta:

sudo dmesg -f daemon

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

Precis som med nivåer kan vi visa meddelanden från flera anläggningar samtidigt:

sudo dmesg -f syslog, daemon

Utdata är nu en blandning av syslog- och demonloggmeddelanden.

Kombinera anläggning och nivå

Med alternativet -x (decode) visas anläggningen och nivån som prefix framför varje meddelande.

sudo dmesg -x

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

Den första markerade delen är ett meddelande från kärnanläggningen med nivån ”notice” och den andra är ett meddelande från kärnanläggningen med nivån ”info.”

Varför är dmesg viktigt?

I grund och botten, för felsökning.

Om du har problem med att hårdvara inte känns igen eller inte fungerar som den ska, kan dmesg ge värdefull insikt.

Använd dmesg för att granska meddelanden från högsta nivån ner till lägsta, och leta efter fel och varningar som nämner din hårdvara eller annat som kan vara relevant för ditt problem.
Använd dmesg och filtrera efter anläggning för att se om det finns relevant information.
Pipa utdata från dmesg till grep för att söka efter strängar som refererar till produkttillverkare eller modellnummer.
Använd grep för att söka efter generella termer som ”gpu” eller ”lagring” eller termer som ”fel”, ”misslyckades” eller ”kan inte”.
Använd alternativet –follow för att se dmesg-meddelanden i realtid.

Lycka till med felsökningen!