Kommandoen dmesg gir deg muligheten til å utforske de skjulte operasjonene som foregår under oppstartsprosessen i Linux. Ved hjelp av denne «feilsøkerens venn» kan du studere og overvåke meldinger relatert til maskinvareenheter og drivere direkte fra kjernens egen ringbuffer.
Hvordan Linux» ringbuffer fungerer
I Linux og Unix-lignende systemer er det viktig å skille mellom oppstart og innlasting, som er to distinkte faser i hendelsesforløpet som finner sted når datamaskinen slås på.
Oppstartsprosessene (som inkluderer BIOS eller UEFI, MBR, og GRUB) tar seg av initialiseringen av systemet helt til kjernen er lastet inn i minnet og koblet til den innledende ramdisken (initrd eller initramfs), og systemd er aktivert.
Etter dette tar oppstartsprosessene over og fullfører initialiseringen av operativsystemet. I de aller tidligste stadiene av initialiseringen er loggdemoner som syslogd eller rsyslogd ennå ikke operative. For å unngå tap av viktige feilmeldinger og advarsler fra denne fasen, benytter kjernen seg av en ringbuffer for å lagre disse meldingene.
En ringbuffer er et minneområde som er reservert for meldinger. Den er enkel i design og har en fast størrelse. Når bufferet er fullt, vil nyere meldinger overskrive de eldste meldingene. Konseptuelt kan dette sammenlignes med en «sirkulær buffer».
Kjernens ringbuffer lagrer informasjon som initialiseringsmeldinger for enhetsdrivere, meldinger fra maskinvare og meldinger fra kjernemoduler. Denne bufferens innhold av lavnivå oppstartsmeldinger gjør den til et utmerket sted å starte feilsøking av maskinvareproblemer eller andre oppstartsproblemer.
Men du bør ikke undersøke dette uten hjelpemidler. Ta med deg dmesg.
dmesg-kommandoen
Kommandoen dmesg lar deg inspisere meldingene som er lagret i ringbufferen. Som standard krever dmesg bruk av sudo.
sudo dmesg
Alle meldingene i ringbufferen vil bli vist i terminalvinduet.
Dette var en overveldende mengde informasjon. Det vi trenger er en mer overkommelig tilnærming:
sudo dmesg | less
Nå kan vi navigere gjennom meldingene og lete etter det som er relevant for oss.
Du kan benytte deg av søkefunksjonen i mindre for å finne og fremheve spesifikke elementer eller begreper. For å starte søkefunksjonen, trykk på skråstreken «/» i mindre.
Fjerne behovet for sudo
Hvis du ønsker å unngå å måtte bruke sudo hver gang du bruker dmesg, kan du benytte deg av denne kommandoen. Det er imidlertid viktig å være klar over at dette vil tillate alle med en brukerkonto på datamaskinen din å bruke dmesg uten å måtte benytte sudo.
sudo sysctl -w kernel.dmesg_restrict=0
Tvinge fargeutgang
Som standard er dmesg sannsynligvis konfigurert til å gi farget utdata. Hvis dette ikke er tilfellet, kan du be dmesg om å fargelegge utdataene ved å bruke alternativet -L (farge).
sudo dmesg -L
For å tvinge dmesg til alltid å benytte farget visning som standard, bruk denne kommandoen:
sudo dmesg --color=always
Menneskelige tidsstempler
Som standard benytter dmesg en tidsstempelnotasjon i sekunder og nanosekunder siden kjernen startet. For å få dette gjengitt i et mer lesbart format, bruk alternativet -H (menneskelig).
sudo dmesg -H
Dette vil føre til to endringer.
Utdataene vises automatisk i mindre.
Tidsstemplene viser nå dato og klokkeslett med minuttoppløsning. Meldinger som oppsto i løpet av samme minutt er merket med sekunder og nanosekunder fra begynnelsen av det aktuelle minuttet.
Lesbare tidsstempler
Dersom du ikke har behov for nanosekunders nøyaktighet, men ønsker tidsstempler som er lettere å lese enn standardinnstillingene, kan du bruke alternativet -T (lesbare mennesker). (Det kan virke litt forvirrende at -H er det «menneskelige» alternativet, mens -T er det «lesbare» alternativet).
sudo dmesg -T
Tidsstemplene gjengis nå som vanlige datoer og klokkeslett, men oppløsningen reduseres til ett minutt.
Alt som skjedde i løpet av ett enkelt minutt har det samme tidsstemplet. Hvis du bare er opptatt av hendelsesforløpet, kan dette være tilstrekkelig. Merk også at du blir sendt tilbake til ledeteksten. Dette alternativet starter ikke automatisk mindre.
Se live-hendelser
For å se meldinger i det de ankommer kjernens ringbuffer, kan du benytte deg av –follow (vent på meldinger). Denne setningen kan virke litt underlig. Hvis ringbufferen brukes til å lagre meldinger fra hendelser som finner sted i oppstartssekvensen, hvordan kan meldinger ankomme i ringbufferen når datamaskinen er ferdig oppstartet?
Alt som medfører en endring i maskinvaren som er tilkoblet datamaskinen, vil føre til at meldinger sendes til kjernens ringbuffer. Oppdater eller legg til en kjernemodul, og du vil se ringbuffermeldinger om disse endringene. Hvis du kobler til en USB-enhet, eller slår av eller på Bluetooth-enheter, vil du se meldinger i dmesg-utdataene. Selv virtuell maskinvare kan føre til at nye meldinger vises i ringbufferen. Start en virtuell maskin, og du vil se ny informasjon komme inn i ringbufferen.
sudo dmesg --follow
Legg merke til at du ikke blir returnert til ledeteksten. Når nye meldinger dukker opp, vil de bli vist av dmesg nederst i terminalvinduet.
Selv montering av en CD-ROM-plate anses som en endring, ettersom du har podet innholdet fra CD-ROM-platen inn i katalogtreet.
For å gå ut av sanntidsvisningen, trykk Ctrl+C.
Hente de ti siste meldingene
Bruk kommandoen tail for å hente de ti siste meldingene i kjernens ringbuffer. Du kan selvsagt hente et hvilket som helst antall meldinger. Tallet ti er bare et eksempel.
sudo dmesg | tail -10
De ti siste meldingene hentes og vises i terminalvinduet.
Søke etter spesifikke termer
Koble utdataene fra dmesg til kommandoen grep for å søke etter bestemte strenger eller mønstre. Her bruker vi alternativet -i (ignorer store og små bokstaver), slik at det ikke er forskjell på store og små bokstaver. Våre resultater vil inkludere «usb», «USB» og enhver annen kombinasjon av store og små bokstaver.
sudo dmesg | grep -i usb
De uthevede søkeresultatene omfatter både store og små bokstaver.
Vi kan isolere meldingene som omhandler den første SCSI-harddisken på systemet, sda. (sda brukes også i dag for den første SATA-harddisken og for USB-stasjoner.)
sudo dmesg | grep -i sda
Alle meldinger som nevner sda hentes og vises i terminalvinduet.
For å få grep til å søke etter flere ord samtidig, kan du benytte deg av alternativet -E (utvidet regulært uttrykk). Du må oppgi søkeordene i en streng med pipe «|» som skilletegn mellom ordene:
sudo dmesg | grep -E "memory|tty|dma"
Alle meldinger som nevner noen av søkeordene, listes opp i terminalvinduet.
Bruk av loggnivåer
Hver melding som lagres i kjernens ringbuffer har et tilhørende nivå. Dette nivået indikerer viktigheten av informasjonen i meldingen. Nivåene er:
emerg: Systemet er ubrukelig.
alert: Handling må iverksettes umiddelbart.
crit: Kritiske forhold.
err: Feilforhold.
warning: Advarselsforhold.
notice: Normal, men betydelig tilstand.
info: Informasjon.
debug: Meldinger på feilsøkingsnivå.
Vi kan be dmesg om å vise meldinger som tilhører et spesifikt nivå ved å bruke alternativet -l (nivå) og oppgi navnet på nivået som kommandolinjeparameter. For å vise kun meldinger på «informasjonsnivå», bruk denne kommandoen:
sudo dmesg -l info
Alle meldingene som vises, er informasjonsmeldinger. De inneholder ikke feil eller advarsler, kun nyttige varsler.
Kombiner to eller flere loggnivåer i en enkelt kommando for å hente meldinger med flere loggnivåer:
sudo dmesg -l debug,notice
Utdataene fra dmesg vil nå bestå av en blanding av meldinger fra de spesifiserte loggnivåene:
Fasilitetskategoriene
Dmesg-meldingene er gruppert i kategorier som kalles «fasiliteter». Listen over fasiliteter er som følger:
kern: Kjernemeldinger.
user: Meldinger på brukernivå.
mail: E-postsystemet.
daemon: Systemdemoner.
auth: Sikkerhets-/autorisasjonsmeldinger.
syslog: Interne syslogd-meldinger.
lpr: Undersystem for linjeskriver.
news: Undersystem for nettverksnyheter.
Vi kan be dmesg om å filtrere utdataene slik at det kun vises meldinger fra en bestemt fasilitet. For å gjøre dette, benytt vi oss av alternativet -f (fasilitet):
sudo dmesg -f daemon
dmesg viser nå alle meldingene som er relatert til demone i terminalvinduet.
På samme måte som med loggnivåene, kan vi be dmesg om å vise meldinger fra flere fasiliteter samtidig:
sudo dmesg -f syslog, daemon
Utdataene vil nå bestå av en blanding av syslog- og daemon-loggmeldinger.
Kombinere fasiliteter og nivå
Alternativet -x (dekode) får dmesg til å vise fasiliteten og nivået som lettleselige prefikser foran hver linje.
sudo dmesg -x
Fasiliteten og nivået vises nå i starten av hver linje:
Den første uthevede delen er en melding fra «kjerne»-fasiliteten med et «varslingsnivå». Den andre uthevede delen er en melding fra «kjerne»-fasiliteten med et «informasjonsnivå».
Det er flott, men hvorfor?
Kort sagt, for feilsøking.
Hvis du opplever problemer med at en maskinvareenhet ikke gjenkjennes eller fungerer som den skal, kan dmesg gi deg viktig informasjon om problemet.
Bruk dmesg til å se gjennom meldinger fra de høyeste nivåene og nedover, og se etter eventuelle feil eller advarsler som nevner den aktuelle maskinvareenheten, eller som kan ha betydning for problemet.
Bruk dmesg til å søke etter referanser til den aktuelle fasiliteten for å se om den inneholder nyttig informasjon.
Koble dmesg til grep, og søk etter relaterte strenger eller identifikatorer som produktprodusent eller modellnummer.
Koble dmesg til grep, og søk etter generiske termer som «gpu» eller «lagring», eller termer som «failure», «failed» eller «unable».
Bruk alternativet –follow og se dmesg-meldinger i sanntid.
Lykke til med feilsøkingen.