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.

Observação

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.

Para instâncias do Oracle Linux, as informações de dump de memória coletadas pelo Kdump são copiadas para o diretório /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
Importante

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:

  1. Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
  2. 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"
  3. Salve as alterações e atualize a configuração do grub:
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  4. 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.

  1. Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
  2. 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.

  3. Quando terminar, salve as alterações e reinicie o serviço kdump.
    sudo systemctl restart kdump.service 
  4. 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.

  1. Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
  2. Edite /etc/kdump.conf para cancelar o comentário e altere o valor default 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 usar shell para copiar os dados manualmente da linha de comando.

    Observação

    As opções poweroff, restart e halt também são válidas para o estado de falha padrão do kdump. No entanto, a execução dessas ações fará com que você perca os dados coletados se essas ações forem executadas. Consulte o arquivo kdump.conf.5 no arquivo /usr/share/man/man5/kdump.conf.5.gz para obter mais informações.

  3. Quando terminar, salve as alterações e reinicie o serviço kdump.
    sudo systemctl restart kdump.service
  4. 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.

  1. Em uma linha de comando, usando privilégios administrativos, estabeleça conexão com a instância usando SSH.
  2. Verifique se o Kdump está em execução:
    systemctl is-active kdump
  3. Inicie a falha no console ou na linha de comando:
    echo 1 > /proc/sys/kernel/sysrq
    echo c > /proc/sysrq-trigger
    Isso força o kernel a travar e os arquivos de dump são copiados para o diretório /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>, por padrão, ou para o local que você selecionou na configuração.
  4. Reinicialize a instância.
  5. 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 arquivo vmcore 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 arquivo kexec-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 arquivo vmcore. Consulte Analisando Despejos de Pane para obter informações sobre como usar o utilitário crash.

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:

  1. Em uma linha de comando, use seus privilégios administrativos e estabeleça conexão com a instância usando SSH.
  2. 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
  3. Atualize o sistema:
    sudo dnf update -y
  4. 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 pacote debuginfo 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.

  1. Em uma linha de comando, use seus privilégios administrativos e estabeleça conexão com a instância usando SSH.
  2. 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 arquivo vmcore 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>
  3. 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
  4. Quando terminar de analisar o despejo de núcleo, saia do shell digitando exit ou q.