Exibir mensagens do kernel ring buffer no Linux com comando dmesg

Mensagens do kernel ring buffer no Linux com comando dmesg

O comando dmesg (display message) é usado para exibir as mensagens do kernel ring buffer, que registra eventos do kernel, incluindo inicialização do sistema, detecção de hardware, mensagens de drivers, erros e outros eventos importantes.

As mensagens retornadas pelo dmesg são bastante úteis para depurar problemas de hardware, drivers e inicialização do sistema.

O que é o kernel ring buffer?

O kernel ring buffer é uma área de memória no kernel do Linux usada para armazenar mensagens e eventos gerados pelo próprio kernel, podendo ser usado para monitorar o funcionamento interno do kernel e depurar problemas relacionados ao sistema.

Essas mensagens incluem informações sobre:

  • Detecção e configuração de hardware.
  • Mensagens de drivers de dispositivos.
  • Relatórios de erros ou alertas.
  • Logs do processo de inicialização.
  • Mensagens de depuração.

É importante notar que o kernel ring buffer é uma área de memória volátil. Isso significa que as mensagens armazenadas nele não são gravadas em disco e serão perdidas após reinicializações, a menos que sejam salvas por serviços de logging como o syslog ou o journald.

Vamos estudar agora o funcionamento do comando dmesg, começando pela sua sintaxe.

Sintaxe básica do comando dmesg

$ dmesg [opções]

Quando executado sem opções, o dmesg exibe todas as mensagens do kernel em ordem cronológica.

Estrutura da saída do dmesg

A saída típica da execução do comando dmesg é composta por mensagens como estas:

[ 0.000000] Linux version 5.15.0-50-generic (buildd@lcy02-amd64) ...
[ 0.002000] ACPI: RSDP 0x000000007FEE0000 000024 (v02 INTEL )
[ 0.002050] ACPI: XSDT 0x000000007FEE0100 000074 (v01 INTEL D945GCLF 00000001 INTL 20091013)
[ 0.012345] PCI: Using configuration type 1 for IO mapping

Nesta saída podemos identificar dois componentes da saída, um em cada coluna:

  1. Marcador de tempo ([ 0.000000]): Tempo desde a inicialização do sistema (em segundos e frações).
  2. Mensagem do kernel: Detalhes sobre eventos do sistema, como detecção de hardware ou inicialização de drivers.

Vejamos agora algumas das principais opções disponíveis no dmesg.

Principais opções do dmesg

-H ou –human

Exibe o tempo em formato legível para humanos, com rolagem de paginação.

$ dmesg -H
Saída do comando dmesg no Linux

Saída do comando dmesg -H no Linux

-T, –ctime

Converte os marcadores de tempo (timestamps) para formato de data e hora. 

-l ou –level: Permite filtrar as mensagens por nível de prioridade, recebendo um dos seguintes valores como argumento:

  • emerg: Emergência.
  • alert: Alerta.
  • crit: Crítico.
  • err: Erro.
    warn: Aviso.
  • notice: Notificação.
  • info: Informações gerais.
  • debug: Mensagens de depuração.

Exemplo: Exibir apenas erros:

$ dmesg -l err
Saída do comando dmesg -l err no Linux

Saída do comando dmesg -l err no Linux

–since <tempo>

A opção –since permite exibir as mensagens do kernel desde um momento específico. Por exemplo, se quisermos verificar as mensagens nos últimos dois minutos:

$ dmesg --since "2 minutes ago"

A opção –since aceita vários formatos de tempo, desde datas completas até intervalos relativos. Alguns dos formatos mais comuns aceitos são os seguintes:

Data completa no formato: AAAA-MM-DD HH:MM:SS. Exemplo:

$ dmesg --since "2024-11-01 14:30:00"

Somente a hora no formato HH:MM:SS. Exemplo:

$ dmesg --since "14:30:00"

Somente datas, no formato AAAA-MM-DD. Exemplo:

$ dmesg --since "2024-11-01"

Intervalos relativos, com expressões como <n> seconds ago, <n> minutes ago, <n> hours ago, <n> days ago, etc.. Exemplo:

dmesg --since "5 minutes ago"

Combinação de data e hora relativas, no formato yesterday, today, ou now, com modificadores. Exemplo:

dmesg --since "yesterday 18:00"

Além dessas, existem outras opções de formatos que podem ser consultadas nas páginas de manual do dmesg.

–follow

Exibir as mensagens que estão sendo geradas em tempo real. No exemplo abaixo, inserimos um DVD no drive da máquina após executar o dmesg com essa opção, e visualizamos a mídia sendo reconhecida:

dmesg capturando a inserção de um DVD no drive da máquina

Comando dmesg –follow capturando a inserção de um DVD no drive da máquina. Note a detecção do sistema de arquivos ISO 9660 (para mídia de disco óptico).

Para interromper, pressionamos Ctrl+C no teclado.

–facility

A opção facility nos permite filtrar as mensagens por subsistema, como hardware ou drivers.

O que são subsistemas no Linux?

Um subsistema é uma parte específica do sistema operacional que lida com um conjunto particular de funcionalidades ou responsabilidades. Cada subsistema gera mensagens relacionadas a seus eventos, operações ou erros, que são registradas no kernel ring buffer.

Os valores possíveis para a opção –facility são os seguintes:

  • auth: Mensagens relacionadas a autenticação de usuários ou sistemas.
    Inclui eventos de login/logout.
  • authpriv: Mensagens de autenticação que incluem informações confidenciais (por exemplo, IPs ou falhas de login).
  • cron: Logs relacionados a tarefas agendadas (ex.: cron, at).
  • daemon: Mensagens provenientes de daemons (processos em segundo plano).
  • kern: Mensagens do kernel.
    Inclui logs de inicialização, detecção de hardware e eventos de drivers.
  • lpr: Logs relacionados a serviços de impressão.
  • mail: Logs de serviços de e-mail (ex.: Postfix, Sendmail).
  • news: Logs de serviços relacionados a distribuição de notícias (geralmente obsoletos).
  • syslog: Logs gerados pelo próprio sistema de logging (syslogd ou equivalente).
  • user: Logs relacionados a aplicativos de usuários.
  • uucp: Logs do sistema UUCP (Unix-to-Unix Copy Protocol), geralmente obsoletos.
  • **local0 a local7: Categorias personalizáveis para mensagens de aplicativos ou subsistemas definidos pelo administrador.

Exemplo – exibir mensagens relacionadas ao kernel:

$ dmesg --facility=kern

Também é possível filtrar mais de um subsistema de uma vez, separando os valores por vírgulas. Por exemplo:

$ dmesg --facility=kern,syslog

Este comando exibe mensagens relacionadas ao kernel e a logs gerados pelo sistema de logging.

-C, –clear

A opção -C permite limpar o buffer de anel do kernel.

Além de usar essas e outras opções disponíveis com o dmesg, também podemos combinar a saída gerada por essa ferramenta com outros utilitário do sistema. Por exemplo, podemos filtrar as mensagens usando um filtro como o grep. Exemplo a seguir.

Filtrar as mensagens relacionadas a dispositivos USB

$ dmesg | grep usb
FIltrar mensagens relacionadas a USB com dmesg

Filtrar mensagens relacionadas a USB com dmesg

A seguir temos alguns exercícios práticos para você treinar um pouco o uso do comando dmesg no Linux. Resoluções se encontram logo após os exercícios.

Exercícios práticos com dmesg

1. Use o dmesg para exibir apenas mensagens relacionadas a dispositivos de rede.
2. Identifique mensagens de aviso geradas pelo kernel.
3. Acompanhe as mensagens do kernel em tempo real e conecte/desconecte um dispositivo USB para verificar os logs.
4. Exiba todas as mensagens relacionadas ao subsistema de processos em segundo plano (daemon).
5. Crie um script que utilize o comando dmesg e interaja com o usuário para filtrar mensagens do kernel com base em uma palavra-chave fornecida.

Resolução dos exercícios

1. Exibir mensagens relacionadas a dispositivos de rede (‘net”)

$ dmesg | grep -i net

2. Identificar mensagens de aviso geradas pelo kernel

$ dmesg -l warn

3. Acompanhar mensagens do kernel em tempo real e verificar logs ao conectar um dispositivo USB

$ dmesg --follow

Conecte um dispositivo USB e veja as mensagens sendo geradas em tempo real.

#4. Exibir todas as mensagens relacionadas ao subsistema daemon

$ dmesg --facility=daemon

5. Script para filtrar mensagens com base em palavra-chave

a. Crie um script de nome verifica_palavras.sh com seu editor de textos preferido e o conteúdo a seguir:

 

#!/bin/bash
# Exibe uma mensagem inicial para o usuário
echo "Bem-vindo ao analisador de logs do kernel!"
echo "Este script permite filtrar mensagens do kernel baseadas em uma palavra-chave."
echo ""
# Solicita que o usuário insira uma palavra-chave para filtrar mensagens
read -p "Digite uma palavra-chave para buscar no log do kernel (ex.: usb, disk, error): " palavra
# Verifica se o usuário inseriu uma palavra-chave
if [ -z "$palavra" ]; then
  echo "Você não digitou nenhuma palavra-chave. Encerrando o script."
  exit 1
fi
# Usa o comando dmesg para filtrar mensagens que correspondem à palavra-chave
echo ""
echo "Buscando por mensagens do kernel contendo a palavra-chave '$keyword'..."
echo ""
dmesg | grep -i "$palavra"
# Verifica se o comando anterior encontrou resultados
if [ $? -ne 0 ]; then
  echo ""
  echo "Nenhuma mensagem do kernel encontrada para a palavra-chave '$palavra'."
else
  echo ""
  echo "Busca concluída."
fi
# Finaliza o script
echo "Obrigado por usar o analisador de logs do kernel!"
exit 0

b. Torne o script executável:

$ chmod +x verifica_palavras.sh

c. Execute o script para testar, fornecendo uma palavra chave como disk ou usb:

$ ./verifica_palavras.sh

Conclusão

O comando dmesg é uma ferramenta importante e bastante útil para monitorar eventos do sistema Linux em nível de kernel. Ele é usado para solucionar problemas de hardware, drivers e inicialização. Também permite que os administradores de sistemas analisem e depurem rapidamente os logs do kernel, de modo a solucionar problemas de forma eficiente e simplificada. 

Sobre Fábio dos Reis (1223 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*