Comando dmesg in Linux: leggere e filtrare i messaggi del kernel
dmesg legge i messaggi conservati nel buffer circolare del kernel Linux. È utile per indagare sul riconoscimento dell'hardware, sui driver, sui filesystem e sugli avvisi emessi durante l'avvio o il funzionamento del sistema.
Il buffer ha capacità limitata: quando arrivano nuovi messaggi, quelli più vecchi possono essere sovrascritti. La consultazione ordinaria non modifica il buffer, ma alcune opzioni di dmesg lo svuotano: per leggere i log usa gli esempi seguenti, evitando le opzioni di cancellazione.
Sintassi di base
dmesg [opzioni]
Le parentesi indicano opzioni facoltative e non vanno digitate. Senza opzioni, il comando mostra i messaggi ancora disponibili nel buffer, con livelli di priorità diversi. La guida si riferisce a dmesg di util-linux: altre implementazioni possono avere opzioni differenti. Verifica man dmesg e dmesg --help sul sistema interessato.
Esempi di utilizzo
Scorrere i messaggi del kernel
dmesg | less
La pipeline passa l'output a less, un visualizzatore che deve essere installato. Usa le frecce o Pagina su/Pagina giù per scorrere, /testo per cercare e q per uscire. Vedrai anche i messaggi di avvio ancora conservati, ma il buffer non è un archivio completo di tutti gli avvii.
Selezionare errori e avvisi
dmesg --level=err,warn
Questo filtro include esattamente i livelli err e warn. Non include automaticamente crit, alert ed emerg, che sono più gravi. Per un'indagine più ampia considera l'elenco esplicito --level=emerg,alert,crit,err,warn; il filtro riguarda la priorità registrata, non la presenza delle parole «error» o «warning» nel testo.
Seguire l'arrivo di nuovi messaggi
dmesg --follow
Mostra i messaggi disponibili e rimane in attesa dei successivi; interrompi con Ctrl+C. Non modifica la configurazione del kernel. Il supporto richiede un dispositivo /dev/kmsg leggibile, disponibile nei kernel Linux dalla versione 3.5. Per iniziare soltanto dai nuovi messaggi, util-linux offre anche --follow-new, se presente nella versione installata.
Leggere messaggi e tempi relativi
Il formato temporale predefinito indica normalmente secondi dall'avvio, seguiti dal testo del messaggio. Il comando seguente filtra prima gli errori e gli avvisi, poi conserva fino alle ultime tre righe dell'output filtrato:
dmesg --level=err,warn | tail -n 3
Questa singola riga illustra soltanto il formato: non è un risultato misurato né implica che il comando produca sempre tre righe. Un messaggio può occupare più righe.
[ 12.345678] device: warning message
Il numero tra parentesi quadre è un riferimento temporale relativo, non un'ora del calendario. Con -T puoi ottenere date e orari leggibili, ma la conversione può essere inesatta: il manuale segnala in particolare i cicli di sospensione e ripresa. Anche una correzione dell'orologio può complicare il confronto tra orari. Quando la sequenza temporale conta, confronta i messaggi con il journal dello stesso avvio e considera eventuali correzioni dell'ora; nessuna conversione ricostruisce da sola un timestamp mancante.
Un output vuoto può significare che nel buffer attuale non ci sono righe dei livelli scelti. Un errore di lettura o di autorizzazione è invece un problema distinto e normalmente compare sullo standard error. Nelle pipeline, lo stato finale può essere quello di tail o less: per diagnosticare un errore, esegui prima dmesg --level=err,warn senza pipeline e controlla subito echo $?.
Su un sistema con systemd, journalctl -k -b -1 interroga i messaggi del kernel dell'avvio precedente disponibile nel journal. Può funzionare solo se quei dati sono stati raccolti, conservati e sono accessibili all'utente. Usa journalctl --list-boots per vedere gli avvii disponibili; dmesg non recupera dal buffer corrente i messaggi già sovrascritti o persi con un riavvio. Le opzioni sono descritte nel manuale sorgente ufficiale di journalctl.
Opzioni principali
| Opzione | Effetto |
|---|---|
--level=ELENCO |
Seleziona i livelli indicati, separati da virgole. Una semplice lista non è una soglia di gravità. |
-T |
Converte i timestamp in date e orari leggibili, con i limiti temporali descritti sopra. |
-H |
Attiva l'output leggibile per le persone e, normalmente, un pager; --nopager lo disabilita. |
-w |
Equivale a --follow: mostra i messaggi e continua ad attendere quelli nuovi. |
-k |
Seleziona soltanto i messaggi del kernel, escludendo quelli di origine userspace presenti nel buffer. |
Precauzioni durante la consultazione
Se compare «Permission denied», verifica la politica del sistema. Il parametro dmesg_restrict può richiedere la capacità CAP_SYSLOG per la lettura; non disattivare le protezioni per aggirare il problema. Se sei autorizzato ad amministrare quella macchina, puoi usare sudo dmesg secondo la politica locale; nei container anche un utente root può non avere le capacità necessarie. La documentazione del kernel su dmesg_restrict descrive questa restrizione.
-c o --read-clear stampa e poi svuota il buffer; -C o --clear lo svuota senza la normale stampa. Non usarli per una semplice verifica. Un filtro senza risultati non dimostra che il sistema sia privo di problemi: il messaggio può avere un'altra priorità, essere stato sovrascritto o non essere mai stato registrato.
Domande frequenti
dmesg e journalctl -k mostrano gli stessi dati?
Entrambi consentono di leggere messaggi del kernel, ma usano fonti diverse. dmesg consulta il buffer circolare corrente; journalctl -k cerca le voci del kernel raccolte nel journal e, senza una diversa selezione con -b, si limita all'avvio corrente. La conservazione, i permessi e il formato temporale possono produrre risultati differenti; per un avvio precedente serve una selezione esplicita e un journal che ne conservi i dati.
Documentazione di riferimento
Il manuale dmesg di util-linux descrive filtri, formati temporali, modalità di attesa e opzioni che modificano il buffer. Confrontalo con il manuale locale prima di usare opzioni non presenti negli esempi.




