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:
- Marcador de tempo ([ 0.000000]): Tempo desde a inicialização do sistema (em segundos e frações).
- 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
-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
–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:
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
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.
Escreva um comentário