De dmesg
commando laat je een kijkje nemen in de verborgen wereld van de Linux-opstartprocessen. Bekijk en controleer berichten van hardwareapparaten en stuurprogramma’s vanuit de eigen ringbuffer van de kernel met “de vriend van de foutzoeker”.
Hoe de Ring Buffer van Linux werkt
Op Linux en Unix-achtige computers zijn opstarten en opstarten twee verschillende fasen van de reeks gebeurtenissen die plaatsvinden wanneer de computer wordt ingeschakeld.
De opstartprocessen (BIOS of UEFI, MBR en GRUB) brengen de initialisatie van het systeem tot het punt waarop de kernel in het geheugen wordt geladen en verbonden met de initiële ramdisk (initrd of initramfs), en systemd wordt gestart.
De opstartprocessen neem vervolgens het stokje over en voltooi de initialisatie van het besturingssysteem. In de zeer vroege stadia van initialisatie zijn logging-daemons zoals syslogd of rsyslogd nog niet actief. Om te voorkomen dat opmerkelijke foutmeldingen en waarschuwingen tijdens deze fase van initialisatie verloren gaan, bevat de kernel een ringbuffer die wordt gebruikt als opslag voor berichten.
Een ringbuffer is een geheugenruimte die is gereserveerd voor berichten. Het is eenvoudig van ontwerp en heeft een vaste grootte. Als het vol is, overschrijven nieuwere berichten de oudste berichten. Conceptueel kan het worden gezien als een ‘circulaire buffer’.
De kernelringbuffer slaat informatie op zoals de initialisatieberichten van apparaatstuurprogramma’s, berichten van hardware en berichten van kernelmodules. Omdat het deze opstartberichten op laag niveau bevat, is de ringbuffer een goede plek om een onderzoek te starten naar hardwarefouten of andere opstartproblemen.
Maar ga niet met lege handen. Nemen dmesg
met jou.
Het dmesg-commando
De dmesg
commando stelt u in staat de berichten te bekijken die zijn opgeslagen in de ringbuffer. Standaard moet u sudo
gebruiken dmesg
.
sudo dmesg
Alle berichten in de ringbuffer worden weergegeven in het terminalvenster.
Dat was een zondvloed. Wat we natuurlijk moeten doen, is het erdoorheen leiden less
:
sudo dmesg | less
Nu kunnen we door de berichten bladeren op zoek naar interessante items.
U kunt de zoekfunctie binnen gebruiken less
om items en termen waarin u geïnteresseerd bent te vinden en te markeren. Start de zoekfunctie door op de schuine streep “/” in te drukken less
.
VERWANT: Hoe u de minder opdracht op Linux gebruikt
De noodzaak voor sudo
Als u wilt voorkomen dat u sudo
elke keer dat u gebruikt dmesg
, kunt u deze opdracht gebruiken. Maar let op: iedereen met een gebruikersaccount kan uw computer gebruiken dmesg
zonder te hoeven gebruiken sudo
.
sudo sysctl -w kernel.dmesg_restrict=0
Kleuruitvoer forceren
Standaard, dmesg
zal waarschijnlijk worden geconfigureerd om gekleurde uitvoer te produceren. Als dat niet het geval is, kunt u het zien dmesg
om de uitvoer in te kleuren met de -L
(kleur) optie.
sudo dmesg -L
Te dwingen dmesg
gebruik deze opdracht om altijd standaard een gekleurde weergave te gebruiken:
sudo dmesg --color=always
Menselijke tijdstempels
Standaard, dmesg
gebruik een tijdstempelnotatie van seconden en nanoseconden sinds de kernel is gestart. Om dit weer te geven in een meer mensvriendelijk formaat, gebruikt u de -H
(menselijke) optie.
sudo dmesg -H
Hierdoor gebeuren er twee dingen.
- De output wordt automatisch weergegeven in
less
. - De tijdstempels tonen een tijdstempel met de datum en tijd, met een minuutresolutie. De berichten die in elke minuut voorkwamen, zijn gelabeld met de seconden en nanoseconden vanaf het begin van die minuut.
Door mensen leesbare tijdstempels
Als u geen nauwkeurigheid op nanoseconde nodig heeft, maar u wilt wel tijdstempels die gemakkelijker te lezen zijn dan de standaardinstellingen, gebruik dan de -T
(door mensen leesbare) optie. (Het is een beetje verwarrend. -H
is de “menselijke” optie, -T
is de optie “leesbaar door mensen”.)
sudo dmesg -T
De tijdstempels worden weergegeven als standaarddatums en -tijden, maar de resolutie wordt verlaagd tot een minuut.
Alles wat er binnen een minuut is gebeurd, heeft hetzelfde tijdstempel. Als u zich alleen maar zorgen maakt over de volgorde van de gebeurtenissen, is dit goed genoeg. Merk ook op dat u terug wordt gedumpt bij de opdrachtprompt. Deze optie wordt niet automatisch aangeroepen less
.
Live-evenementen bekijken
Om berichten te zien zodra ze in de kernelringbuffer aankomen, gebruik je de --follow
(wacht op berichten) optie. Die zin lijkt misschien een beetje vreemd. Als de ringbuffer wordt gebruikt om berichten op te slaan van gebeurtenissen die plaatsvinden tijdens het opstarten, hoe kunnen live-berichten dan in de ringbuffer aankomen als de computer eenmaal aan de gang is?
Alles wat een wijziging veroorzaakt in de hardware die op uw computer is aangesloten, zorgt ervoor dat berichten naar de kernelringbuffer worden gestuurd. Werk een kernelmodule bij of voeg een kernelmodule toe, en u zult ringbufferberichten over die wijzigingen zien. Als u een USB-station aansluit of een Bluetooth-apparaat aansluit of loskoppelt, ziet u berichten in het dmesg
output. Zelfs virtuele hardware zorgt ervoor dat nieuwe berichten in de ringbuffer verschijnen. Start een virtuele machine en je ziet nieuwe informatie aankomen in de ringbuffer.
sudo dmesg --follow
Merk op dat u niet terugkeert naar de opdrachtprompt. Als er nieuwe berichten verschijnen, worden ze weergegeven door dmesg
onderaan het terminalvenster.
Zelfs het mounten van een cd-rom-schijf wordt als een verandering gezien, omdat u de inhoud van de cd-rom-schijf op de directorystructuur hebt geënt.
Om de real-time feed te verlaten, drukt u op Ctrl+C
.
Haal de laatste tien berichten op
Gebruik het tail-commando om de laatste tien kernelringbufferberichten op te halen. U kunt natuurlijk een willekeurig aantal berichten opvragen. Tien is slechts ons voorbeeld.
sudo dmesg | last -10
De laatste tien berichten worden opgehaald en weergegeven in het terminalvenster.
Zoeken naar specifieke termen
Leid de output van dmesg
door grep
om te zoeken naar bepaalde snaren of patronen. Hier gebruiken we de -i
(hoofdlettergebruik negeren) zodat het hoofdlettergebruik van overeenkomende strings wordt genegeerd. onze resultaten omvatten “usb” en “USB” en elke andere combinatie van kleine letters en hoofdletters.
sudo dmesg | grep -i usb
De gemarkeerde zoekresultaten zijn in hoofdletters en kleine letters.
We kunnen de berichten isoleren die verwijzingen bevatten naar de eerste SCSI-harde schijf op het systeem sda
. (Werkelijk, sda
wordt tegenwoordig ook gebruikt voor de eerste SATA-harde schijf en voor USB-drives.)
sudo dmesg | grep -i sda
Alle berichten die vermelden sda
worden opgehaald en weergegeven in het terminalvenster.
Maken grep
zoek naar meerdere termen tegelijk, gebruik de -E
(verleng reguliere expressie) optie. U moet de zoektermen in een tekenreeks tussen aanhalingstekens opgeven met pijp “|” scheidingstekens tussen de zoektermen:
sudo dmesg | grep -E "memory|tty|dma"
Elk bericht dat een van de zoektermen vermeldt, wordt in het terminalvenster weergegeven.
Logniveaus gebruiken
Elk bericht dat in de kernelringbuffer wordt gelogd, heeft een niveau eraan. Het niveau vertegenwoordigt het belang van de informatie in het bericht. De niveaus zijn:
- tevoorschijn komen: Systeem is onbruikbaar.
- alert: Er moet onmiddellijk actie worden ondernomen.
- crit: Kritieke omstandigheden.
- vergist: Foutcondities.
- waarschuwen: Waarschuwingsvoorwaarden.
- merk op: Normale maar belangrijke toestand.
- info: Informatief.
- debuggen: Berichten op foutopsporingsniveau.
We kunnen maken dmesg
extraheer berichten die overeenkomen met een bepaald niveau door de -l
(level) optie en het doorgeven van de naam van het niveau als een opdrachtregelparameter. Gebruik deze opdracht om alleen berichten op het niveau van “informatie” te zien:
sudo dmesg -l info
Alle vermelde berichten zijn informatieve berichten. Ze bevatten geen fouten of waarschuwingen, alleen nuttige meldingen.
Combineer twee of meer logboekniveaus in één opdracht om berichten van verschillende logboekniveaus op te halen:
sudo dmesg -l debug,notice
De output van dmesg
is een mix van berichten van elk logboekniveau:
De faciliteitscategorieën
De dmesg
berichten zijn gegroepeerd in categorieën die “faciliteiten” worden genoemd. De lijst met faciliteiten is:
- kern: Kernel-berichten.
- gebruiker: Berichten op gebruikersniveau.
- mail: Mailsysteem.
- demon: Systeemdaemons.
- auth: Beveiligings- / autorisatieberichten.
- syslog: Interne syslogd-berichten.
- lpr: Lijnprinter-subsysteem.
- nieuws: Subsysteem netwerknieuws.
We kunnen het vragen dmesg
om zijn uitvoer te filteren om alleen berichten in een specifieke faciliteit weer te geven. Om dit te doen, moeten we de -f
(faciliteit) optie:
sudo dmesg -f daemon
dmesg
geeft een overzicht van alle berichten met betrekking tot daemons in het terminalvenster.
Zoals we deden met de niveaus, kunnen we vragen dmesg
om berichten van meer dan één installatie tegelijk weer te geven:
sudo dmesg -f syslog, daemon
De uitvoer is een mix van syslog- en daemon-logboekberichten.
Faciliteit en niveau combineren
De -x
(decodeer) optie maakt dmesg
toon de faciliteit en het niveau als door mensen leesbare voorvoegsels voor elke regel.
sudo dmesg -x
De faciliteit en het niveau zijn te zien aan het begin van elke regel:
De eerste gemarkeerde sectie is een bericht van de “kernel” -faciliteit met een niveau van “kennisgeving”. De tweede gemarkeerde sectie is een bericht van de “kernel” -faciliteit met een niveau van “info”.
Dat is geweldig, maar waarom?
In een notendop: foutopsporing.
Als u problemen ondervindt met een stuk hardware dat niet wordt herkend of zich niet goed gedraagt, dmesg
kan enig licht werpen op de kwestie.
- Gebruik
dmesg
om berichten van de hoogste te bekijken niveau door elk lager niveau, op zoek naar fouten of waarschuwingen die het hardware-item vermelden, of die van invloed kunnen zijn op het probleem. - Gebruik
dmesg
om te zoeken naar een vermelding van het juiste faciliteit om te zien of ze nuttige informatie bevatten. - Pijp
dmesg
doorgrep
en zoek naar verwant tekenreeksen of ID’s zoals productfabrikant of modelnummers. - Pijp
dmesg
doorgrep
en zoek naar generieke termen zoals “gpu” of “opslag”, of termen als “mislukt”, “mislukt” of “niet in staat”. - Gebruik de
--follow
optie en kijkdmesg
berichten in realtime.
Goede jacht.