O comando `dmesg` possibilita explorar os processos de inicialização do Linux, funcionando como um “detetive de problemas”. Ele permite analisar e monitorar as mensagens de hardware e drivers do *ring buffer* do kernel.
O Funcionamento do Ring Buffer no Linux
Em sistemas Linux e similares, a sequência de eventos ao ligar um computador é dividida em duas fases: o *boot* e a inicialização.
Durante o *boot* (com BIOS ou UEFI, MBR e GRUB), o sistema carrega o kernel na memória e o conecta ao *ramdisk* inicial (initrd ou initramfs). Em seguida, o systemd é iniciado.
Os processos de inicialização continuam, completando o carregamento do sistema operacional. Nos estágios iniciais, serviços de registro como syslogd ou rsyslogd ainda não estão operacionais. Para evitar a perda de avisos e mensagens de erro dessa fase, o kernel utiliza um buffer circular, conhecido como *ring buffer*, para armazenar mensagens.
O *ring buffer* é um espaço de memória com tamanho fixo, reservado para registrar mensagens. Seu funcionamento é simples: ao encher, as mensagens mais recentes sobrescrevem as mais antigas. Ele atua como um “buffer circular”.
O *ring buffer* do kernel guarda informações como mensagens de inicialização de drivers de dispositivos, mensagens de hardware e de módulos do kernel. Graças a essas informações de baixo nível, o *ring buffer* é um ponto de partida crucial para investigar problemas de hardware ou erros de inicialização.
E para acessar essas informações, o `dmesg` é a ferramenta essencial.
O Comando `dmesg`
O comando `dmesg` permite visualizar as mensagens armazenadas no *ring buffer*. Normalmente, é necessário usar `sudo` para executar o `dmesg`.
sudo dmesg
Isso exibirá todas as mensagens do buffer na janela do terminal.
Para facilitar a leitura, podemos usar o `less`:
sudo dmesg | less
Isso permite navegar pelas mensagens e usar a função de busca do `less` (tecla “/”).
Eliminando a Necessidade do `sudo`
Para evitar o uso constante de `sudo`, execute o comando a seguir. Atenção: isso permitirá que qualquer usuário no seu computador execute `dmesg` sem `sudo`.
sudo sysctl -w kernel.dmesg_restrict=0
Saída Colorida
O `dmesg` geralmente tem saída colorida por padrão. Caso contrário, use a opção `-L` (cor):
sudo dmesg -L
Para que a saída colorida seja padrão, utilize:
sudo dmesg --color=always
Timestamps em Formato Humano
Por padrão, o `dmesg` usa um formato de *timestamp* com segundos e nanossegundos desde o início do kernel. Para um formato mais amigável, use a opção `-H` (humano):
sudo dmesg -H
Isso resulta em:
A saída é exibida no `less`, e os *timestamps* mostram data e hora com resolução de minuto. Mensagens do mesmo minuto mostram segundos e nanossegundos desde o início daquele minuto.
Timestamps Legíveis
Para *timestamps* mais simples, sem a precisão de nanossegundos, use a opção `-T` (legível por humanos). Note a diferença entre `-H` (“humano”) e `-T` (“legível por humanos”).
sudo dmesg -T
Nesse caso, os *timestamps* são datas e horas padrão, com resolução de minuto.
Eventos ocorridos no mesmo minuto terão o mesmo *timestamp*. Além disso, essa opção não abre automaticamente o `less`.
Monitoramento em Tempo Real
Para observar as mensagens assim que elas chegam ao *ring buffer* do kernel, utilize a opção `–follow` (aguardar mensagens). Mensagens podem surgir mesmo após a inicialização, sempre que há mudanças no hardware.
Por exemplo, adicionar ou remover módulos do kernel, conectar dispositivos USB, ou interagir com dispositivos Bluetooth geram mensagens. Até mesmo ações em máquinas virtuais geram eventos que são registrados.
sudo dmesg --follow
O comando não retorna ao prompt. Novas mensagens aparecem na parte inferior da tela.
Até mesmo a montagem de um disco de CD-ROM é vista como uma mudança.
Pressione `Ctrl + C` para sair do monitoramento em tempo real.
Obtendo as Últimas Mensagens
Use o comando `tail` para obter as últimas mensagens do buffer do kernel. Por exemplo, as últimas dez:
sudo dmesg | tail -10
As últimas dez mensagens serão exibidas.
Pesquisando Termos Específicos
Use `grep` para buscar termos específicos. A opção `-i` (ignorar maiúsculas/minúsculas) torna a busca mais abrangente.
sudo dmesg | grep -i usb
Resultados com “usb”, “USB”, etc. serão listados.
Podemos também buscar por mensagens relacionadas ao primeiro disco rígido SCSI (ou SATA/USB) no sistema, que geralmente é o `sda`:
sudo dmesg | grep -i sda
Mensagens referentes ao `sda` serão exibidas.
Para pesquisar múltiplos termos simultaneamente, use a opção `-E` (expressão regular estendida):
sudo dmesg | grep -E "memory|tty|dma"
Mensagens que mencionam “memory”, “tty” ou “dma” serão listadas.
Níveis de Registro
Cada mensagem no *ring buffer* possui um nível de importância:
emerg | Sistema inutilizável. |
alert | Ação imediata necessária. |
crit | Condições críticas. |
err | Condições de erro. |
warn | Condições de aviso. |
notice | Condição normal, mas significativa. |
info | Informativo. |
debug | Mensagens de nível de depuração. |
Use a opção `-l` (nível) para filtrar por nível. Exemplo: para exibir apenas mensagens de nível “informativo”:
sudo dmesg -l info
Apenas mensagens informativas serão exibidas.
Combine múltiplos níveis:
sudo dmesg -l debug,notice
A saída incluirá mensagens dos níveis “debug” e “notice”.
Categorias de Instalações
As mensagens do `dmesg` também são agrupadas em categorias chamadas “instalações”:
kern | Mensagens do kernel. |
user | Mensagens de nível de usuário. |
Sistema de correio. | |
daemon | Daemons do sistema. |
auth | Mensagens de segurança/autorização. |
syslog | Mensagens internas do syslogd. |
lpr | Subsistema de impressão. |
news | Subsistema de notícias da rede. |
Use a opção `-f` (facilidade) para filtrar por instalação. Exemplo: mensagens relacionadas a daemons:
sudo dmesg -f daemon
A saída mostra mensagens de daemon.
Combine várias instalações:
sudo dmesg -f syslog,daemon
A saída mostrará mensagens de syslog e daemon.
Combinando Instalações e Níveis
A opção `-x` (decodificar) exibe a instalação e o nível como prefixos legíveis:
sudo dmesg -x
A instalação e nível são exibidos no início de cada linha:
O primeiro destaque é uma mensagem do recurso “kernel” com nível “aviso”. O segundo, do recurso “kernel” com nível “informação”.
Por que Usar o `dmesg`?
O principal uso do `dmesg` é a detecção de falhas.
Se um hardware não é reconhecido ou apresenta comportamento incorreto, o `dmesg` pode ajudar a identificar a causa do problema.
Para isso:
- Analise as mensagens do nível mais alto para o mais baixo, procurando erros ou avisos relacionados ao hardware problemático.
- Use o `dmesg` para buscar menções da instalação relevante para o hardware.
- Use o `dmesg` com `grep` para buscar strings ou identificadores específicos do fabricante ou modelo.
- Pesquise termos genéricos como “gpu” ou “armazenamento”, ou termos como “falha” ou “incapaz”.
- Use a opção `–follow` para monitorar mensagens em tempo real.
Boa caçada!