Introduzione
Il kernel Linux è il nucleo del sistema operativo che controlla l'accesso alle risorse di sistema, come CPU, dispositivi I/O, memoria fisica e file system. Il kernel scrive vari messaggi nel buffer del kernel durante il processo di avvio e quando il sistema è in esecuzione. Questi messaggi includono varie informazioni sul funzionamento del sistema.
Il buffer del kernel ring è una parte della memoria fisica che contiene i messaggi di registro del kernel. Ha una dimensione fissa, il che significa che quando il buffer è pieno, i record dei registri più vecchi vengono sovrascritti.
L'utility dmesg
della riga di comando viene utilizzata per stampare e controllare il buffer del kernel ring in Linux e altri sistemi operativi simili a Unix. È utile per esaminare i messaggi di avvio del kernel e il debug di problemi relativi all'hardware.
In questo tutorial, tratteremo le basi del comando dmesg
.
Usando il comando dmesg
La sintassi per il comando dmesg
è la seguente:
dmesg [OPTIONS]
Se invocato senza alcuna opzione, dmesg
scrive tutti i messaggi dal buffer del kernel ring nell'output standard:
dmesg
Per impostazione predefinita, tutti gli utenti possono eseguire il comando dmesg
. Tuttavia, su alcuni sistemi, l'accesso a dmesg
può essere limitato per utenti non root. In questa situazione, quando si invoca dmesg
verrà visualizzato un messaggio di errore come di seguito:
dmesg: read kernel buffer failed: Operation not permitted
Il parametro kernel kernel.dmesg_restrict
specifica se gli utenti non privilegiati possono utilizzare dmesg
per visualizzare i messaggi dal buffer di registro del kernel. Per rimuovere le restrizioni, impostarlo su zero:
sudo sysctl -w kernel.dmesg_restrict=0
Di solito, l'output contiene molte righe di informazioni, quindi è visualizzabile solo l'ultima parte dell'output. Per visualizzare una pagina alla volta, reindirizzare l'output a un'utilità di cercapersone come less
o more
:
dmesg --color=always | less
Il parametro --color=always
viene utilizzato per mantenere l'output colorato.
Se si desidera filtrare i messaggi del buffer, utilizzare grep
. Ad esempio, per visualizzare solo i messaggi relativi a USB, digitare:
dmesg | grep -i usb
dmesg
legge i messaggi generati dal kernel dal file virtuale /proc/kmsg
. Questo file fornisce un'interfaccia al buffer dell'anello del kernel e può essere aperto solo con un processo. Se il processo syslog
è in esecuzione sul sistema e si tenta di leggere il file con cat
o less
, il comando si bloccherà.
Il daemon syslog
esegue il dump dei messaggi del kernel in /var/log/dmesg
, così è possibile utilizzare anche quel file di registro:
cat /var/log/dmesg
Formattare l'output di dmesg
Il comando dmesg
fornisce una serie di opzioni che consentono di formattare e filtrare l'output.
Una delle opzioni più utilizzate di dmesg
è -H
(--human
), che abilita l'output leggibile dall'uomo (human-readable):
dmesg -H
Per stampare timestamp leggibili dall'uomo usa l'opzione -T
( --ctime
):
dmesg -T
[Tue Jan 28 17:07:07 2020] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
Il formato timestamp può anche essere impostato usando l'opzione --time-format <format>
, che può essere ctime, reltime, delta, notime o iso. Ad esempio, per utilizzare il formato delta digitare:
dmesg --time-format=delta
Puoi anche combinare due o più opzioni:
dmesg -H -T
Per guardare l'output del comando dmesg
in tempo reale utilizzare l'opzione -w
(--follow
):
dmesg --follow
Filtrare l'output di dmesg
È possibile limitare l'output del comando dmesg
a determinate strutture e livelli.
La funzione rappresenta il processo che ha creato il messaggio. dmesg
supporta le seguenti funzionalità di registro:
kern
- messaggi del kerneluser
- messaggi a livello di utentemail
- sistema di postadaemon
- demoni di sistemaauth
- messaggi di sicurezza/autorizzazionesyslog
- messaggi syslogd internilpr
- sottosistema stampante di lineanews
- sottosistema di notizie di rete
L'opzione -f
(--facility <list>
) consente di limitare l'output a strutture specifiche. L'opzione accetta una o più strutture separate da virgola.
Ad esempio, per visualizzare solo i messaggi del kernel e dei demoni di sistema dovresti usare:
dmesg -f kern,daemon
Ogni messaggio di registro è associato a un livello di registro che mostra l'importanza del messaggio. dmesg
supporta i seguenti livelli di registro:
emerg
- il sistema è inutilizzabilealert
- l'azione deve essere intrapresa immediatamentecrit
- condizioni criticheerr
- condizioni di errorewarn
- condizioni di avvertimentonotice
- condizioni normali ma significativeinfo
- informativodebug
- messaggi a livello di debug
L'opzione -l
(--level <list>
) limita l'output a livelli definiti. L'opzione accetta uno o più livelli separati da virgola.
Il seguente comando visualizza solo i messaggi di errore e critici:
dmesg -l err,crit
Svuotare il Ring Buffer
L'opzione -C
(--clear
) consente di cancellare il buffer dell'anello:
sudo dmesg -C
Solo il root o gli utenti con privilegi sudo possono cancellare il buffer.
Per stampare il contenuto del buffer prima di cancellare utilizzare l'opzione -c
(--read-clear
):
sudo dmesg -c
Se si desidera salvare i registri dmesg
correnti in un file prima di cancellarlo, reindirizzare l'output su un file:
dmesg > dmesg_messages
Conclusione
Il comando dmesg
consente di visualizzare e controllare il buffer ring del kernel. Può essere molto utile durante la risoluzione dei problemi del kernel o dell'hardware.
Digita il man dmesg
nel terminale per informazioni su tutte le opzioni disponibile del comando dmesg
.