Raccolta dei dump degli arresti anomali mediante la utility Kdump

Quando un sistema Oracle Linux verifica un errore panic del kernel e si blocca in modo imprevisto o si blocca, le informazioni sullo stato del sistema e sulle chiamate kernel che portano al blocco possono essere utili per la risoluzione dei problemi. La funzione Kdump fornisce un meccanismo di dumping per le informazioni sugli arresti anomali del kernel. Nelle immagini della piattaforma di Oracle Linux il sistema operativo è completamente configurato o parzialmente configurato per generare un crash dump, a seconda della data di rilascio dell'immagine.

Nota

Se si dispone di una propria immagine Linux o di una marketplace, è necessario installare e configurare Kdump utilizzando la riga di comando.

Kdump include un secondo kernel, che risiede in una parte riservata della memoria di sistema, in modo che possa acquisire informazioni su un kernel arrestato. Kdump utilizza la chiamata di sistema kexec per eseguire il boot del secondo kernel, chiamato capture kernel, senza la necessità di eseguire il reboot del sistema, quindi acquisisce il contenuto della memoria del kernel arrestato come crash dump. Per ulteriori informazioni sul contenuto di un crash dump, vedere What's Inside a Linux Kernel Core Dump.

Per le istanze Oracle Linux, le informazioni di crash dump raccolte da Kdump vengono copiate nella directory /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>, per impostazione predefinita. Viene creata una nuova directory <ip-address>-<YYYY-MM-DD>-<HH:MM:SS> per ogni crash dump, ad esempio:
[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
La directory di dump contiene il file di crash dump, vmcore, un file di testo e un file di log, ad esempio:
[opc@<instance_name> <127.0.0.1-2025-02-07-16:28:19>] ls -a

vmcore
vmcore-dmesg.txt
kexec-dmesg.log
Importante

Se un'istanza di Oracle Linux non è raggiungibile o non risponde, è possibile inviare un interrupt diagnostico per risolvere i problemi. Un interrupt diagnostico causa l'arresto anomalo e il riavvio del sistema operativo dell'istanza. Per utilizzare la console o l'API per inviare un interrupt diagnostico, è necessario che Kdump sia configurato per generare un crash dump. Per ulteriori informazioni, vedere Invio di un interrupt diagnostico.

Impostazione della memoria riservata per un crash dump

Se si utilizza un'immagine della piattaforma Oracle Linux, Kdump viene installato e configurato completamente o parzialmente. È possibile modificare la quantità di memoria riservata nel kernel per salvare il crash dump, anche denominato riserva di memoria crashkernel. In Oracle Linux 8 e versioni precedenti, la prenotazione di memoria predefinita è impostata per la regolazione automatica: GRUB_CMDLINE_LINUX="crashkernel=auto". Tuttavia, crashkernel=auto non è supportato per Oracle Linux 9, pertanto è necessario impostare una quantità specifica di memoria riservata utilizzando il parametro crashkernel.

Per impostare la riserva di memoria per un crash dump:

  1. Da una riga di comando, utilizzando i privilegi di amministrazione connettersi all'istanza utilizzando SSH.
  2. Modificare il file /etc/default/grub per impostare la memoria riservata. Ad esempio:
    • Impostare la riserva di memoria su 64 MB, ad esempio:
      GRUB_CMDLINE_LINUX="crashkernel=64MB"
    • Impostare la quantità di memoria riservata come variabile utilizzando la sintassi crashkernel=<range1>:<size1>,<range2>:<size2>. Ad esempio:
      GRUB_CMDLINE_LINUX="crashkernel=512M-2G:64M,2G-:128M"
    • Definire un valore di offset per la memoria riservata. Poiché la prenotazione di crashkernel si verifica nelle prime fasi del processo di boot, alcuni sistemi richiedono la prenotazione della memoria con un determinato offset fisso. Quando si specifica un offset fisso, la memoria riservata inizia in quel punto. Ad esempio, per riservare 128 MB di memoria, a partire da 16 MB:
      GRUB_CMDLINE_LINUX="crashkernel=128M@16M"
  3. Salvare le modifiche e aggiornare la configurazione di grub:
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  4. Riavviare l'istanza per applicare le modifiche.

Modifica della posizione di crash dump

Utilizzando /etc/kdump.conf, è possibile modificare la posizione in cui vengono salvati i file di crash dump, trasferirli tramite SSH o esportarli in una condivisione di rete.

  1. Da una riga di comando, utilizzando i privilegi di amministrazione connettersi all'istanza utilizzando SSH.
  2. Modificare il file di configurazione nel file /etc/kdump.conf e rimuovere il carattere di commento # all'inizio di ogni riga che si desidera abilitare.
    • Modificare la directory predefinita (/var/oled/crash) per i file di crash dump, ad esempio:
      path /usr/local/<cores>
    • Trasferire i file di crash dump su una connessione a una shell sicura, ad esempio:
      ssh <user@example.com>
      sshkey /root/.ssh/<mykey>
    • Impostare i file di crash dump da esportare in una condivisione di rete compatibile, ad esempio:
      nfs <example.com>:/<output>

    Per maggiori informazioni, vedere il file kdump.conf.5 nell'archivio /usr/share/man/man5/kdump.conf.5.gz.

  3. Al termine, salvare le modifiche e riavviare il servizio kdump.
    sudo systemctl restart kdump.service 
  4. Riavviare l'istanza per applicare le modifiche.

Modifica dello stato di errore predefinito

Per impostazione predefinita, se Kdump non riesce a inviare il risultato alle posizioni di output configurate, riavvia il server. Questa azione elimina tutti i dati raccolti per il dump. Per evitare questo risultato, modificare la configurazione del dump.

  1. Da una riga di comando, utilizzando i privilegi di amministrazione connettersi all'istanza utilizzando SSH.
  2. Modificare /etc/kdump.conf per annullare il commento e modificare il valore default nel file come indicato di seguito.
    default dump_to_rootfs

    L'opzione dump_to_rootfs tenta di salvare il risultato in una directory locale, che può risultare utile se una condivisione di rete non è raggiungibile. È invece possibile utilizzare shell per copiare i dati manualmente dalla riga di comando.

    Nota

    Le opzioni poweroff, restart e halt sono valide anche per lo stato di errore kdump predefinito. Tuttavia, l'esecuzione di queste azioni comporta la perdita dei dati raccolti se tali azioni vengono eseguite. Per maggiori informazioni, vedere il file kdump.conf.5 nell'archivio /usr/share/man/man5/kdump.conf.5.gz.

  3. Al termine, salvare le modifiche e riavviare il servizio kdump.
    sudo systemctl restart kdump.service
  4. Riavviare l'istanza per applicare le modifiche.

Attivazione di un crash dump

Testare la configurazione di Kdump bloccando il kernel che attiva il servizio per raccogliere un crash dump. Leggere quindi il file contenente il crash dump.

  1. Da una riga di comando, utilizzando i privilegi di amministrazione connettersi all'istanza utilizzando SSH.
  2. Assicurarsi che Kdump sia in esecuzione:
    systemctl is-active kdump
  3. Avviare il crash dalla console o dalla riga di comando:
    echo 1 > /proc/sys/kernel/sysrq
    echo c > /proc/sysrq-trigger
    In questo modo il kernel viene bloccato e i file di dump vengono copiati nella directory /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS> per impostazione predefinita o nella posizione selezionata nella configurazione.
  4. Riavviare l'istanza.
  5. Eseguire la riconnessione all'istanza utilizzando SSH e rivedere i file di crash dump in /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>:
    • Il buffer dei messaggi del kernel include le informazioni più essenziali sul crash del sistema e viene sempre salvato per primo nel file vmcore-dmesg.txt. Questo è utile quando un tentativo di ottenere il file vmcore completo non riesce, ad esempio a causa della mancanza di spazio sulla posizione di destinazione.
    • Quando lo strumento kexec si avvia nel secondo kernel e acquisisce il contenuto della memoria del kernel bloccato, scrive anche nel file kexec-dmes.log in modo da poter tracciare il processo. Ad esempio, alla fine del file è possibile vedere il processo di salvataggio del crash dump:
      ...
      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//
    • Il file vmcore contiene le informazioni sul crash dump. Per analizzare il crash dump, è necessaria una utility in grado di leggere il formato del file vmcore. Vedere Analisi dei dump degli arresti anomali per informazioni sull'uso della utility crash.

Analisi dei crash dump

È possibile utilizzare la utility crash per analizzare i dump di crash raccolti da Kdump. Nelle immagini della piattaforma Oracle Linux, crash viene installato per impostazione predefinita. Per altre istanze Linux, utilizzare la riga di comando per installarla: sudo dnf install crash.

Configurare un'istanza di Oracle Linux per utilizzare la utility di arresto anomalo

Per analizzare un crash dump con crash, completare i task di configurazione indicati di seguito.

  1. Da una riga di comando, utilizzare i privilegi di amministrazione e connettersi all'istanza utilizzando SSH.
  2. Abilitare il repository debuginfo di Oracle Linux creando il file /etc/yum.repos.d/debuginfo.repo con privilegi root e i seguenti contenuti, ad esempio:
    [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. Aggiornare il sistema:
    sudo dnf update -y
  4. Installare il pacchetto kernel-uek-debuginfo:
    sudo dnf install -y kernel-uek-debuginfo-$(uname -r)
    Importante

    Eseguire il comando di installazione ogni volta che il kernel viene aggiornato mediante Package Manager. Il pacchetto debuginfo funziona solo quando corrisponde al kernel in esecuzione e non viene sostituito automaticamente quando viene installata una versione più recente del kernel nel sistema.

Analizzare un crash dump utilizzando l'utility crash

Per analizzare un crash dump, fornire le informazioni vmcore a crash, quindi utilizzare le opzioni della shell crash per recuperare le informazioni sul crash dump. Per informazioni dettagliate sull'uso della utility crash, digitare man crash al prompt dei comandi o consultare la documentazione relativa all'arresto anomalo.

  1. Da una riga di comando, utilizzare i privilegi di amministrazione e connettersi all'istanza utilizzando SSH.
  2. Fornire la posizione del modulo debuginfo kernel e la posizione del dump core come parametri per la utility crash, ad esempio:
    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 la versione del kernel in esecuzione nel comando, <ip-address>-<YYYY-MM-DD>-<HH:MM:SS> rappresenta la directory creata per i file di crash dump e il file vmcore contiene il crash dump.

    La shell crash inizia e visualizza alcune informazioni sull'arresto anomalo del sistema, ad esempio:

    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. Al prompt crash, immettere un'opzione per ottenere ulteriori informazioni sul crash dump, ad esempio:
    • bt -a visualizza uno stack trace del task o dei task attivi quando il kernel ha generato il panicked, ad esempio:
      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 visualizza solo il task attivo su ogni CPU, ad esempio:
      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 visualizza le informazioni di base sulla memoria virtuale del contesto corrente, ad esempio:
      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 visualizza informazioni sui file aperti nel contesto corrente.
      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 visualizza le informazioni sull'uso della memoria del kernel, ad esempio:
      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. Al termine dell'analisi del dump di base, uscire dalla shell digitando exit o q.