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 kernel
  • user - messaggi a livello di utente
  • mail - sistema di posta
  • daemon - demoni di sistema
  • auth - messaggi di sicurezza/autorizzazione
  • syslog - messaggi syslogd interni
  • lpr - sottosistema stampante di linea
  • news - 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 è inutilizzabile
  • alert - l'azione deve essere intrapresa immediatamente
  • crit - condizioni critiche
  • err - condizioni di errore
  • warn - condizioni di avvertimento
  • notice - condizioni normali ma significative
  • info - informativo
  • debug - 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.