Crash-Dumps mit dem Kdump-Dienstprogramm sammeln

Wenn ein Oracle Linux-System eine Kernelpanik erlebt und unerwartet abstürzt oder hängt, können Informationen zum Systemstatus und zu Kernelaufrufen, die zum Absturz führen, für die Fehlerbehebung nützlich sein. Die Kdump-Funktion bietet einen Dumpingmechanismus für Kernel-Absturzinformationen. In Oracle Linux-Plattformimages ist das BS entweder vollständig konfiguriert oder teilweise so konfiguriert, dass ein Crashdump generiert wird, abhängig vom Releasedatum des Images.

Hinweis

Wenn Sie über ein eigenes Linux-Image oder ein Marketplace-Image verfügen, müssen Sie Kdump über die Befehlszeile installieren und konfigurieren.

Kdump enthält einen zweiten Kernel, der sich in einem reservierten Teil des Systemspeichers befindet, sodass er Informationen über einen gestoppten Kernel erfassen kann. Kdump bootet mit dem Systemaufruf kexec im zweiten Kernel, der als Capture-Kernel bezeichnet wird, ohne das System neu starten zu müssen, und erfasst dann den Inhalt des gestoppten Kernel-Speichers als Crash-Dump. Weitere Informationen zum Inhalt eines Crashdumps finden Sie unter Was befindet sich in einem Linux Kernel Core Dump.

Bei Oracle Linux-Instanzen werden von Kdump erfasste Crashdumpinformationen standardmäßig in das Verzeichnis /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS> kopiert. Für jeden Crashdump wird ein neues Verzeichnis <ip-address>-<YYYY-MM-DD>-<HH:MM:SS> erstellt. Beispiel:
[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
Das Dumpverzeichnis enthält die Crash-Dumpdatei vmcore, eine Textdatei und eine Logdatei. Beispiel:
[opc@<instance_name> <127.0.0.1-2025-02-07-16:28:19>] ls -a

vmcore
vmcore-dmesg.txt
kexec-dmesg.log
Wichtig

Wenn Sie eine Oracle Linux-Instanz haben, die nicht erreichbar ist oder nicht reagiert, können Sie eine Diagnoseunterbrechung zur Fehlerbehebung senden. Eine Diagnoseunterbrechung sorgt für den Absturz und Neustart des Betriebssystems der Instanz. Um eine Diagnoseunterbrechung mit der Konsole oder API zu senden, muss Kdump so konfiguriert sein, dass ein Crashdump generiert wird. Weitere Informationen finden Sie unter Senden einer Diagnoseunterbrechung.

Für einen Absturz-Dump reservierten Speicher festlegen

Wenn Sie ein Oracle Linux-Plattformimage verwenden, wird Kdump installiert und entweder vollständig konfiguriert oder teilweise konfiguriert. Sie können die im Kernel reservierte Speichermenge ändern, um den Crash-Dump (auch als crashkernel-Speicherreservierung bezeichnet) zu speichern. In Oracle Linux 8 und früher ist die Standardspeicherreservierung so eingestellt, dass sie automatisch angepasst wird: GRUB_CMDLINE_LINUX="crashkernel=auto". crashkernel=auto wird jedoch für Oracle Linux 9 nicht unterstützt. Daher müssen Sie mit dem Parameter crashkernel eine bestimmte Menge an reserviertem Speicher festlegen.

So legen Sie die Speicherreservierung für einen Crash-Dump fest:

  1. Über eine Befehlszeile mit administrativen Berechtigungen melden Sie sich mit SSH bei der Instanz an.
  2. Bearbeiten Sie die Datei /etc/default/grub, um den reservierten Speicher festzulegen. Beispiel:
    • Stellen Sie die Speicherreserve auf 64 MB ein. Beispiel:
      GRUB_CMDLINE_LINUX="crashkernel=64MB"
    • Legen Sie die Größe des reservierten Speichers als Variable mit der crashkernel=<range1>:<size1>,<range2>:<size2>-Syntax fest. Beispiel:
      GRUB_CMDLINE_LINUX="crashkernel=512M-2G:64M,2G-:128M"
    • Definieren Sie einen Offset-Wert für den reservierten Speicher. Da die Reservierung crashkernel bereits zu Beginn des Boot-Prozesses erfolgt, müssen bei einigen Systemen Speicher mit einem bestimmten festen Offset reserviert werden. Wenn ein fester Offset angegeben wird, beginnt der reservierte Speicher an diesem Punkt. Beispiel: So reservieren Sie ab 16 MB 128 MB Speicher:
      GRUB_CMDLINE_LINUX="crashkernel=128M@16M"
  3. Speichern Sie die Änderungen, und aktualisieren Sie die grub-Konfiguration:
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  4. Starten Sie die Instanz neu, um die Änderungen anzuwenden.

Speicherort für Absturz-Dump wird geändert

Mit /etc/kdump.conf können Sie den Speicherort der Crashdumpdateien ändern, sie über SSH übertragen oder in eine Netzwerkfreigabe exportieren.

  1. Über eine Befehlszeile mit administrativen Berechtigungen melden Sie sich mit SSH bei der Instanz an.
  2. Bearbeiten Sie die Konfigurationsdatei in der Datei /etc/kdump.conf, und entfernen Sie das Kommentarzeichen # am Anfang jeder Zeile, die Sie aktivieren möchten.
    • Ändern Sie das Standardverzeichnis (/var/oled/crash) für die Crash-Dumpdateien. Beispiel:
      path /usr/local/<cores>
    • Übertragen Sie Crash-Dumpdateien über eine Secure Shell-Verbindung. Beispiel:
      ssh <user@example.com>
      sshkey /root/.ssh/<mykey>
    • Legen Sie die Crashdumpdateien fest, die in eine kompatible Netzwerkfreigabe exportiert werden sollen. Beispiel:
      nfs <example.com>:/<output>

    Weitere Informationen finden Sie in der Datei kdump.conf.5 im Archiv /usr/share/man/man5/kdump.conf.5.gz.

  3. Wenn Sie fertig sind, speichern Sie die Änderungen, und starten Sie den Service kdump neu.
    sudo systemctl restart kdump.service 
  4. Starten Sie die Instanz neu, um die Änderungen anzuwenden.

Standardfehlerstatus ändern

Wenn Kdump das Ergebnis standardmäßig nicht an die konfigurierten Ausgabespeicherorte sendet, wird der Server neu gestartet. Mit dieser Aktion werden alle Daten gelöscht, die für den Dump erfasst wurden. Um dieses Ergebnis zu verhindern, ändern Sie die Kdump-Konfiguration.

  1. Über eine Befehlszeile mit administrativen Berechtigungen melden Sie sich mit SSH bei der Instanz an.
  2. Bearbeiten Sie /etc/kdump.conf, um die Kommentarzeichen zu entfernen und den Wert default in der Datei wie folgt zu ändern:
    default dump_to_rootfs

    Die Option dump_to_rootfs versucht, das Ergebnis in einem lokalen Verzeichnis zu speichern. Dies kann nützlich sein, wenn eine Netzwerkfreigabe nicht erreichbar ist. Sie können stattdessen shell verwenden, um die Daten manuell aus der Befehlszeile zu kopieren.

    Hinweis

    Die Optionen poweroff, restart und halt sind auch für den Standardfehlerstatus kdump gültig. Wenn Sie diese Aktionen ausführen, gehen jedoch die erfassten Daten verloren, wenn diese Aktionen ausgeführt werden. Weitere Informationen finden Sie in der Datei kdump.conf.5 im Archiv /usr/share/man/man5/kdump.conf.5.gz.

  3. Wenn Sie fertig sind, speichern Sie die Änderungen, und starten Sie den Service kdump neu.
    sudo systemctl restart kdump.service
  4. Starten Sie die Instanz neu, um die Änderungen anzuwenden.

Absturzdump auslösen

Testen Sie die Kdump-Konfiguration, indem Sie den Kernel abstürzen, der den Dienst zum Erfassen eines Crashdumps auslöst. Überprüfen Sie dann den Crash-Dump.

  1. Über eine Befehlszeile mit administrativen Berechtigungen melden Sie sich mit SSH bei der Instanz an.
  2. Stellen Sie sicher, dass Kdump ausgeführt wird:
    systemctl is-active kdump
  3. Starten Sie den Absturz über die Konsole oder die Befehlszeile:
    echo 1 > /proc/sys/kernel/sysrq
    echo c > /proc/sysrq-trigger
    Dadurch wird der Kernel zum Absturz gezwungen, und die Dumpdateien werden standardmäßig in das Verzeichnis /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS> oder in den von Ihnen in der Konfiguration ausgewählten Speicherort kopiert.
  4. Starten Sie die Instanz neu.
  5. Melden Sie sich mit SSH erneut bei der Instanz an, und prüfen Sie die Crashdumpdateien in der Datei /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>:
    • Der Kernel-Nachrichtenpuffer enthält die wichtigsten Informationen zum Systemabsturz und wird immer zuerst in die Datei vmcore-dmesg.txt geschrieben. Dies ist nützlich, wenn ein Versuch, die vollständige vmcore-Datei abzurufen, nicht erfolgreich verläuft, z.B. aufgrund von Speicherplatzmangel am Zielspeicherort.
    • Wenn das kexec-Tool in den zweiten Kernel bootet und den Inhalt des abgestürzten Kernel-Speichers erfasst, wird es auch in die Datei kexec-dmes.log geschrieben, damit Sie den Prozess verfolgen können. Beispiel: Am Ende der Datei wird der Speicherprozess für den Crash-Dump angezeigt:
      ...
      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//
    • Die Datei vmcore enthält die Crashdumpinformationen. Um den Crashdump zu analysieren, benötigen Sie ein Utility, das das Dateiformat vmcore lesen kann. Informationen zur Verwendung des Utilitys crash finden Sie unter Absturzdumps analysieren.

Crash-Dumps analysieren

Mit dem Utility crash können Sie die von Kdump erfassten Crashdumps analysieren. In Oracle Linux-Plattformimages ist crash standardmäßig installiert. Bei anderen Linux-Instanzen installieren Sie es mit der Befehlszeile: sudo dnf install crash.

Oracle Linux-Instanz zur Verwendung des Crashutilitys konfigurieren

Um einen Crashdump mit crash zu analysieren, führen Sie die folgenden Konfigurationsaufgaben aus:

  1. Verwenden Sie in einer Befehlszeile die administrativen Berechtigungen, und melden Sie sich mit SSH bei der Instanz an.
  2. Aktivieren Sie das Oracle Linux-Repository debuginfo, indem Sie die Datei /etc/yum.repos.d/debuginfo.repo mit Root-Berechtigungen und den folgenden Inhalten erstellen. Beispiel:
    [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. Aktualisieren Sie das System:
    sudo dnf update -y
  4. Installieren Sie das Package kernel-uek-debuginfo:
    sudo dnf install -y kernel-uek-debuginfo-$(uname -r)
    Wichtig

    Führen Sie den Installationsbefehl jedes Mal aus, wenn der Kernel über den Package Manager aktualisiert wird. Das Package debuginfo funktioniert nur, wenn es mit dem laufenden Kernel übereinstimmt. Es wird nicht automatisch ersetzt, wenn eine neuere Kernelversion auf dem System installiert wird.

Crash-Dump mit dem Absturz-Utility analysieren

Um einen Crashdump zu analysieren, geben Sie die vmcore-Informationen an crash an, und rufen Sie dann mit den Shell-Optionen crash Crashdumpinformationen ab. Ausführliche Informationen zur Verwendung des crash-Utilitys finden Sie unter man crash an einer Eingabeaufforderung oder in der Crash-Dokumentation.

  1. Verwenden Sie in einer Befehlszeile die administrativen Berechtigungen, und melden Sie sich mit SSH bei der Instanz an.
  2. Geben Sie den Speicherort des Kernel-debuginfo-Moduls und den Speicherort des Core-Dumps als Parameter für das crash-Utility an. Beispiel:
    sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>/vmcore

    $(uname -r) gibt die laufende Kernelversion innerhalb des Befehls an, <ip-address>-<YYYY-MM-DD>-<HH:MM:SS> stellt das Verzeichnis dar, das für die Crashdumpdateien erstellt wird, und die Datei vmcore enthält den Crashdump.

    Die crash-Shell wird gestartet und zeigt einige Informationen zum Systemabsturz an, wie:

    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. Geben Sie an der Eingabeaufforderung crash eine Option ein, um weitere Informationen zum Crashdump abzurufen. Beispiel:
    • bt -a zeigt ein Stacktrace der aktiven Aufgaben an, wenn der Kernel einen Panikhinweis aufweist. Beispiel:
      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 zeigt nur die aktive Aufgabe auf jeder CPU an. Beispiel:
      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 zeigt grundlegende Informationen zum virtuellen Speicher des aktuellen Kontextes an. Beispiel:
      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 zeigt Informationen zu geöffneten Dateien im aktuellen Kontext an.
      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 zeigt Informationen zur Kernel-Speicherauslastung an. Beispiel:
      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. Wenn Sie mit der Analyse des Core-Dumps fertig sind, beenden Sie die Shell, indem Sie exit oder q eingeben.