Coletando Crash Dumps com o Utilitário Kdump
Quando um sistema Oracle Linux experimenta uma pane no kernel e trava inesperadamente ou trava, as informações sobre o estado do sistema e as chamadas do kernel que levam à falha podem ser úteis para a solução de problemas. O recurso Kdump fornece um mecanismo de despejo para informações de falha do kernel. Em imagens de plataforma do Oracle Linux, o SO está totalmente configurado ou parcialmente configurado para gerar um dump de pane, dependendo da data da release da imagem.
Se você tiver sua própria imagem do Linux ou de um marketplace, será necessário instalar e configurar o Kdump usando a linha de comando.
O Kdump inclui um segundo kernel, que reside em uma parte reservada da memória do sistema, para que ele possa capturar informações sobre um kernel interrompido. O Kdump usa a chamada do sistema kexec para inicializar no segundo kernel, chamado capturar kernel, sem a necessidade de reinicializar o sistema e, em seguida, captura o conteúdo da memória do kernel interrompido como um despejo de memória. Para obter mais informações sobre o conteúdo de um despejo de memória, consulte What's Inside a Linux Kernel Core Dump.
/var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>
, por padrão. Um novo diretório <ip-address>-<YYYY-MM-DD>-<HH:MM:SS>
é criado para cada despejo de memória, por exemplo: [opc@<instance_name> crash] ls -a
127.0.0.1-2025-02-07-15:18:07
127.0.0.1-2025-02-07-16:28:19
O diretório de dump contém o arquivo de dump de memória, vmcore
, um arquivo de texto e um arquivo de log, por exemplo:[opc@<instance_name> <127.0.0.1-2025-02-07-16:28:19>] ls -a
vmcore
vmcore-dmesg.txt
kexec-dmesg.log
Se você tiver uma instância do Oracle Linux que não esteja acessível ou que não responda, poderá enviar uma interrupção de diagnóstico para diagnosticar e solucionar problemas. Uma interrupção de diagnóstico faz com que o SO da instância falhe e seja reinicializado. Para usar a console ou a API para enviar uma interrupção de diagnóstico, você deve ter o Kdump configurado para gerar um despejo de memória. Para obter mais informações, consulte Enviando uma interrupção de diagnóstico.
Definindo a Memória Reservada para um Crash Dump
Se você estiver usando uma imagem de plataforma Oracle Linux, o Kdump será instalado e totalmente configurado ou parcialmente configurado. Você pode alterar a quantidade de memória reservada no kernel para salvar o despejo de memória, também chamado de reserva de memória crashkernel. No Oracle Linux 8 e versões anteriores, a reserva de memória padrão é definida para ajustar automaticamente: GRUB_CMDLINE_LINUX="crashkernel=auto"
. No entanto, crashkernel=auto
não é suportado para o Oracle Linux 9, portanto, você deve definir uma quantidade específica de memória reservada usando o parâmetro crashkernel
.
Para definir a reserva de memória para um despejo de memória:
- Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
- Edite o arquivo
/etc/default/grub
para definir a memória reservada. Por exemplo:- Defina a reserva de memória como 64 MB, por exemplo:
GRUB_CMDLINE_LINUX="crashkernel=
64MB
" - Defina a quantidade de memória reservada como variável usando a sintaxe
crashkernel=<range1>:<size1>,<range2>:<size2>
. Por exemplo:GRUB_CMDLINE_LINUX="crashkernel=512M-2G:64M,2G-:128M"
- Defina um valor de deslocamento para a memória reservada. Como a reserva
crashkernel
ocorre no início do processo de inicialização, alguns sistemas exigem que você reserve memória com um determinado deslocamento fixo. Quando um deslocamento fixo é especificado, a memória reservada começa nesse ponto. Por exemplo, para reservar 128 MB de memória, começando em 16 MB:GRUB_CMDLINE_LINUX="crashkernel=128M@16M"
- Defina a reserva de memória como 64 MB, por exemplo:
- Salve as alterações e atualize a configuração do grub:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- Reinicialize a instância para aplicar alterações.
Alterando o local do despejo de memória
Usando o /etc/kdump.conf
, você pode alterar o local em que os arquivos de despejo de memória são salvos, transferi-los via SSH ou exportá-los para um compartilhamento de rede.
- Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
- Edite o arquivo de configuração no arquivo
/etc/kdump.conf
e remova o caractere de comentário#
no início de cada linha que você deseja ativar.- Altere o diretório padrão (
/var/oled/crash
) para os arquivos de despejo de memória, por exemplo:path /usr/local/<cores>
- Transfira arquivos de despejo de memória através de uma conexão de shell segura, por exemplo:
ssh <user@example.com> sshkey /root/.ssh/<mykey>
- Defina os arquivos de despejo de memória a serem exportados para um compartilhamento de rede compatível, por exemplo:
nfs <example.com>:/<output>
Consulte o arquivo
kdump.conf.5
no arquivo/usr/share/man/man5/kdump.conf.5.gz
para obter mais informações. - Altere o diretório padrão (
- Quando terminar, salve as alterações e reinicie o serviço
kdump
.sudo systemctl restart kdump.service
- Reinicialize a instância para aplicar alterações.
Alterar o estado de falha padrão
Por padrão, se o Kdump não conseguir enviar seu resultado para os locais de saída configurados, ele reinicializará o servidor. Esta ação exclui todos os dados que foram coletados para o dump. Para evitar esse resultado, altere a configuração do Kdump.
- Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
- Edite
/etc/kdump.conf
para cancelar o comentário e altere o valordefault
no arquivo da seguinte forma:default dump_to_rootfs
A opção
dump_to_rootfs
tenta salvar o resultado em um diretório local, o que pode ser útil se um compartilhamento de rede for inacessível. Em vez disso, você pode usarshell
para copiar os dados manualmente da linha de comando.Observação
As opções
poweroff
,restart
ehalt
também são válidas para o estado de falha padrão dokdump
. No entanto, a execução dessas ações fará com que você perca os dados coletados se essas ações forem executadas. Consulte o arquivokdump.conf.5
no arquivo/usr/share/man/man5/kdump.conf.5.gz
para obter mais informações. - Quando terminar, salve as alterações e reinicie o serviço
kdump
.sudo systemctl restart kdump.service
- Reinicialize a instância para aplicar alterações.
Acionando um Crash Dump
Teste a configuração do Kdump travando o kernel que aciona o serviço para coletar um despejo de memória. Em seguida, revise o despejo de memória.
- Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
- Verifique se o Kdump está em execução:
systemctl is-active kdump
- Inicie a falha no console ou na linha de comando:Isso força o kernel a travar e os arquivos de dump são copiados para o diretório
echo 1 > /proc/sys/kernel/sysrq echo c > /proc/sysrq-trigger
/var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>
, por padrão, ou para o local que você selecionou na configuração. - Reinicialize a instância.
- Reconecte-se à instância usando SSH e revise os arquivos de dump na
/var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>
:- O buffer de mensagens do kernel inclui as informações mais essenciais sobre a falha do sistema e sempre é submetido a dump primeiro no arquivo
vmcore-dmesg.txt
. Isso é útil quando uma tentativa de obter o arquivovmcore
completo falha, por exemplo, por causa da falta de espaço no local de destino. - À medida que a ferramenta
kexec
é inicializada no segundo kernel e captura o conteúdo da memória do kernel com falha, ela também grava no arquivokexec-dmes.log
para que você possa rastrear o processo. Por exemplo, no final do arquivo, você pode ver o processo de salvamento do despejo de memória:... Feb 07 16:28:19 linux9 systemd[1]: Starting Kdump Vmcore Save Service... Feb 07 16:28:19 linux9 kdump[504]: Kdump is using the default log level(3). Feb 07 16:28:19 linux9 kdump[541]: saving to /kdumproot/var/oled/crash/127.0.0.1-2025-02-07-16:28:19/ Feb 07 16:28:19 linux9 kdump[546]: saving vmcore-dmesg.txt to /kdumproot/var/oled/crash/127.0.0.1-2025-02-07-16:28:19/ Feb 07 16:28:19 linux9 kdump[552]: saving vmcore-dmesg.txt complete Feb 07 16:28:19 linux9 kdump[554]: saving vmcore Feb 07 16:28:21 linux9 kdump.sh[555]: Checking for memory holes : [ 0.0 %] / ... Copying data : [100.0 %] \ eta: 0s Feb 07 16:28:21 linux9 kdump.sh[555]: The dumpfile is saved to /kdumproot/var/oled/crash/127.0.0.1-2025-02-07-16:28:19//vmcore-incomplete. Feb 07 16:28:21 linux9 kdump.sh[555]: makedumpfile Completed. Feb 07 16:28:21 linux9 kdump[559]: saving vmcore complete Feb 07 16:28:21 linux9 kdump[561]: saving the /run/initramfs/kexec-dmesg.log to /kdumproot/var/oled/crash/127.0.0.1-2025-02-07-16:28:19//
- O arquivo
vmcore
contém as informações de despejo de memória. Para analisar o dump de memória, você precisa de um utilitário que possa ler o formato de arquivovmcore
. Consulte Analisando Despejos de Pane para obter informações sobre como usar o utilitáriocrash
.
- O buffer de mensagens do kernel inclui as informações mais essenciais sobre a falha do sistema e sempre é submetido a dump primeiro no arquivo
Analisando despejos de memória
Você pode usar o utilitário crash
para analisar os despejos de memória coletados pelo Kdump. Nas imagens da plataforma Oracle Linux, o crash
é instalado por padrão. Para outras instâncias do Linux, use a linha de comando para instalá-la: sudo dnf install crash
.
Configurar uma Instância do Oracle Linux para Usar o Utilitário de pane
Para analisar um dump de memória com o crash
, conclua as seguintes tarefas de configuração:
- Em uma linha de comando, use seus privilégios administrativos e estabeleça conexão com a instância usando SSH.
- Ative o repositório
debuginfo
do Oracle Linux criando o arquivo/etc/yum.repos.d/debuginfo.repo
com privilégios de raiz e o seguinte conteúdo, por exemplo:[debuginfo] name=Oracle Linux 8 Debuginfo Packages baseurl=https://oss.oracle.com/ol8/debuginfo/ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle gpgcheck=1 enabled=1
- Atualize o sistema:
sudo dnf update -y
- Instale o pacote
kernel-uek-debuginfo
:sudo dnf install -y kernel-uek-debuginfo-$(uname -r)
Importante
Execute o comando de instalação toda vez que o kernel for atualizado por meio do gerenciador de pacotes. O pacotedebuginfo
só funciona quando corresponde ao kernel em execução e não é substituído automaticamente quando uma versão mais recente do kernel é instalada no sistema.
Analisar um Crash Dump Usando o Utilitário crash
Para analisar um despejo de memória, forneça as informações vmcore
para crash
e, em seguida, use as opções de shell crash
para recuperar informações de despejo de memória. Para obter informações detalhadas sobre como usar o utilitário crash, digite man crash
em um prompt de comando ou consulte a documentação do crash.
- Em uma linha de comando, use seus privilégios administrativos e estabeleça conexão com a instância usando SSH.
- Forneça a localização do módulo kernel
debuginfo
e a localização do dump de memória como parâmetros do utilitário crash, por exemplo:sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>/vmcore
$(uname -r) identifica a versão do kernel em execução dentro do comando,
<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>
representa o diretório que é criado para os arquivos de dump de memória e o arquivovmcore
contém o dump de memória.O shell
crash
é iniciado e exibe algumas informações de falha do sistema, como:KERNEL: /usr/lib/debug/lib/modules/5.15.0-302.167.6.el9uek.x86_64/vmlinux DUMPFILE: /var/oled/crash/127.0.0.1-2025-02-07-16:28:19/vmcore [PARTIAL DUMP] CPUS: 2 DATE: Fri Feb 7 16:28:15 GMT 2025 UPTIME: 01:09:58 LOAD AVERAGE: 0.00, 0.02, 0.00 TASKS: 204 NODENAME: oci-linux9 RELEASE: 5.15.0-302.167.6.el9uek.x86_64 VERSION: #2 SMP Mon Nov 4 23:41:59 PST 2024 MACHINE: x86_64 (2445 Mhz) MEMORY: 16 GB PANIC: "Kernel panic - not syncing: NMI: Not continuing" PID: 0 COMMAND: "swapper/0" TASK: ffffffffb761a980 (1 of 2) [THREAD_INFO: ffffffffb761a980] CPU: 0 STATE: TASK_RUNNING (PANIC) crash>
- No prompt
crash
, insira uma opção para obter mais informações sobre o despejo de memória, por exemplo:bt -a
exibe um rastreamento de pilha das tarefas ativas quando o kernel entra em pânico, por exemplo:crash> bt -a PID: 286 TASK: c0b3a000 CPU: 0 COMMAND: "in.rlogind" #0 [c0b3be90] crash_save_current_state at c011aed0 #1 [c0b3bea4] panic at c011367c #2 [c0b3bee8] tulip_interrupt at c01bc820 #3 [c0b3bf08] handle_IRQ_event at c010a551 #4 [c0b3bf2c] do_8259A_IRQ at c010a319 #5 [c0b3bf3c] do_IRQ at c010a653 #6 [c0b3bfbc] ret_from_intr at c0109634 EAX: 00000000 EBX: c0e68280 ECX: 00000000 EDX: 00000004 EBP: c0b3bfbc DS: 0018 ESI: 00000004 ES: 0018 EDI: c0e68284 CS: 0010 EIP: c012f803 ERR: ffffff09 EFLAGS: 00000246 #7 [c0b3bfbc] sys_select at c012f803 #8 [c0b3bfc0] system_call at c0109598 EAX: 0000008e EBX: 00000004 ECX: bfffc9a0 EDX: 00000000 DS: 002b ESI: bfffc8a0 ES: 002b EDI: 00000000 SS: 002b ESP: bfffc82c EBP: bfffd224 CS: 0023 EIP: 400d032e ERR: 0000008e EFLAGS: 00000246
ps -A
exibe somente a tarefa ativa em cada CPU, por exemplo:crash> ps -A PID PPID CPU TASK ST %MEM VSZ RSS COMM > 10 2 1 ffff880212969710 IN 0.0 0 0 [migration/1] > 0 0 3 ffff884026d43520 RU 0.0 0 0 [swapper] > 6582 1 2 ffff880f49c52040 RU 0.0 42202472 33368 oracle > 9497 1 0 ffff880549ec2ab0 RU 0.0 42314692 138664 oracle
vm
exibe informações básicas da memória virtual do contexto atual, por exemplo:crash> vm PID: 30986 TASK: c0440000 CPU: 0 COMMAND: "bash" MM PGD RSS TOTAL_VM c303fe20 c4789000 88k 1728k VMA START END FLAGS FILE c0d1f540 8048000 80ad000 1875 /bin/bash c0d1f400 80ad000 80b3000 1873 /bin/bash c0d1f880 80b3000 80ec000 77 c0d1f0c0 40000000 40012000 875 /lib/ld-2.1.1.so c0d1f700 40012000 40013000 873 /lib/ld-2.1.1.so c0d1fe00 40013000 40014000 77 c0d1f580 40014000 40016000 73 ...
files
exibe informações sobre arquivos abertos no contexto atual.crash> files PID: 720 TASK: c67f2000 CPU: 1 COMMAND: "innd" ROOT: / CWD: /var/spool/news/articles FD FILE DENTRY INODE TYPE PATH 0 c6b9c740 c7cc45a0 c7c939e0 CHR /dev/null 1 c6b9c800 c537bb20 c54d0000 REG /var/log/news/news 2 c6df9600 c537b420 c5c36360 REG /var/log/news/errlog 3 c74182c0 c6ede260 c6da3d40 PIPE 4 c6df9720 c696c620 c69398c0 SOCK 5 c6b9cc20 c68e7000 c6938d80 SOCK 6 c6b9c920 c7cc45a0 c7c939e0 CHR /dev/null 7 c6b9c680 c58fa5c0 c58a1200 REG /var/lib/news/history 8 c6df9f00 c6ede760 c6da3200 PIPE
kmem -i
exibe informações de uso da memória do kernel, por exemplo:crash> kmem -i PAGES TOTAL PERCENTAGE TOTAL MEM 1974231 7.5 GB ---- FREE 208962 816.3 MB 10% of TOTAL MEM USED 1765269 6.7 GB 89% of TOTAL MEM SHARED 365066 1.4 GB 18% of TOTAL MEM BUFFERS 111376 435.1 MB 5% of TOTAL MEM CACHED 1276196 4.9 GB 64% of TOTAL MEM SLAB 120410 470.4 MB 6% of TOTAL MEM TOTAL HUGE 524288 2 GB ---- HUGE FREE 524288 2 GB 100% of TOTAL HUGE TOTAL SWAP 2498559 9.5 GB ---- SWAP USED 81978 320.2 MB 3% of TOTAL SWAP SWAP FREE 2416581 9.2 GB 96% of TOTAL SWAP COMMIT LIMIT 3485674 13.3 GB ---- COMMITTED 850651 3.2 GB 24% of TOTAL LIMIT
- Quando terminar de analisar o despejo de núcleo, saia do shell digitando exit ou q.