Collecte des vidages sur incident à l'aide de l'utilitaire Kdump

Lorsqu'un système Oracle Linux subit une panique du noyau et tombe en panne de manière inattendue ou se bloque, des informations sur l'état du système et les appels du noyau menant à la panne peuvent être utiles pour le dépannage. La fonction Kdump fournit un mécanisme de vidage pour les informations de panne du noyau. Dans les images de plate-forme Oracle Linux, le système d'exploitation est entièrement ou partiellement configuré pour générer un fichier dump d'incident, en fonction de la date de publication de l'image.

Remarque

Si vous disposez de votre propre image Linux ou d'une image Marketplace, vous devez installer et configurer Kdump à l'aide de la ligne de commande.

Kdump inclut un second noyau, qui réside dans une partie réservée de la mémoire système, afin qu'il puisse capturer des informations sur un noyau arrêté. Kdump utilise l'appel système kexec pour initialiser dans le second noyau, appelé noyau de capture, sans avoir à réinitialiser le système, puis capture le contenu de la mémoire du noyau arrêté en tant que vidage sur incident. Pour plus d'informations sur le contenu d'un vidage sur incident, reportez-vous à la section What's Inside a Linux Kernel Core Dump.

Pour les instances Oracle Linux, les informations de vidage sur incident collectées par Kdump sont copiées dans le répertoire /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>, par défaut. Un répertoire <ip-address>-<YYYY-MM-DD>-<HH:MM:SS> est créé pour chaque vidage sur incident, par exemple :
[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
Le répertoire de vidage contient le fichier de vidage sur incident, vmcore, un fichier texte et un fichier journal, par exemple :
[opc@<instance_name> <127.0.0.1-2025-02-07-16:28:19>] ls -a

vmcore
vmcore-dmesg.txt
kexec-dmesg.log
Important

Si une instance Oracle Linux est inaccessible ou ne répond pas, vous pouvez envoyer une interruption de diagnostic pour dépanner. L'interruption de diagnostic entraîne le blocage et le redémarrage du système d'exploitation de l'instance. Pour utiliser la console ou l'API afin d'envoyer une interruption de diagnostic, Kdump doit être configuré pour générer un vidage sur incident. Pour plus d'informations, reportez-vous à la section Sending a diagnostic interrupt.

Définition de la mémoire réservée pour un vidage sur incident

Si vous utilisez une image de plate-forme Oracle Linux, Kdump est installé et entièrement ou partiellement configuré. Vous pouvez modifier la quantité de mémoire réservée sur le noyau pour enregistrer le vidage sur incident, également appelée réservation de mémoire crashkernel. Dans Oracle Linux 8 et les versions antérieures, la réservation de mémoire par défaut est définie pour s'ajuster automatiquement : GRUB_CMDLINE_LINUX="crashkernel=auto". Cependant, crashkernel=auto n'est pas pris en charge pour Oracle Linux 9. Vous devez donc définir une quantité spécifique de mémoire réservée à l'aide du paramètre crashkernel.

Pour définir la réservation de mémoire pour un vidage sur incident :

  1. A partir d'une ligne de commande, à l'aide des privilèges d'administration, connectez-vous à l'instance à l'aide de SSH.
  2. Modifiez le fichier /etc/default/grub pour définir la mémoire réservée. Par exemple :
    • Définissez la réserve de mémoire sur 64 Mo, par exemple :
      GRUB_CMDLINE_LINUX="crashkernel=64MB"
    • Définissez la quantité de mémoire réservée en tant que variable à l'aide de la syntaxe crashkernel=<range1>:<size1>,<range2>:<size2>. Par exemple :
      GRUB_CMDLINE_LINUX="crashkernel=512M-2G:64M,2G-:128M"
    • Définissez une valeur de décalage pour la mémoire réservée. Etant donné que la réservation crashkernel a lieu au début du processus d'initialisation, certains systèmes nécessitent que vous réserviez de la mémoire avec un certain décalage fixe. Lorsqu'un décalage fixe est spécifié, la mémoire réservée commence à ce point. Par exemple, pour réserver 128 Mo de mémoire, à partir de 16 Mo :
      GRUB_CMDLINE_LINUX="crashkernel=128M@16M"
  3. Enregistrez les modifications et actualisez la configuration grub :
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  4. Redémarrez l'instance pour appliquer les modifications.

Modification de l'emplacement du vidage sur incident

A l'aide de /etc/kdump.conf, vous pouvez modifier l'emplacement dans lequel les fichiers de vidage sur incident sont enregistrés, les transférer via SSH ou les exporter vers un partage réseau.

  1. A partir d'une ligne de commande, à l'aide des privilèges d'administration, connectez-vous à l'instance à l'aide de SSH.
  2. Modifiez le fichier de configuration dans le fichier /etc/kdump.conf et enlevez le caractère de commentaire # au début de chaque ligne à activer.
    • Modifiez le répertoire par défaut (/var/oled/crash) des fichiers de vidage sur incident, par exemple :
      path /usr/local/<cores>
    • Transférez les fichiers de vidage sur incident via une connexion shell sécurisée, par exemple :
      ssh <user@example.com>
      sshkey /root/.ssh/<mykey>
    • Définissez les fichiers de vidage sur incident à exporter vers un partage réseau compatible, par exemple :
      nfs <example.com>:/<output>

    Pour plus d'informations, reportez-vous au fichier kdump.conf.5 dans l'archive /usr/share/man/man5/kdump.conf.5.gz.

  3. Lorsque vous avez terminé, enregistrez les modifications et redémarrez le service kdump.
    sudo systemctl restart kdump.service 
  4. Redémarrez l'instance pour appliquer les modifications.

Modification de l'état d'échec par défaut

Par défaut, si Kdump ne parvient pas à envoyer son résultat aux emplacements de sortie configurés, il réinitialise le serveur. Cette action supprime toutes les données collectées pour le vidage. Pour éviter ce résultat, modifiez la configuration de Kdump.

  1. A partir d'une ligne de commande, à l'aide des privilèges d'administration, connectez-vous à l'instance à l'aide de SSH.
  2. Modifiez /etc/kdump.conf pour annuler la mise en commentaire et modifiez la valeur default dans le fichier comme suit :
    default dump_to_rootfs

    L'option dump_to_rootfs tente d'enregistrer le résultat dans un répertoire local, ce qui peut être utile si un partage réseau est inaccessible. Vous pouvez utiliser shell à la place pour copier les données manuellement à partir de la ligne de commande.

    Remarque

    Les options poweroff, restart et halt sont également valides pour l'état d'échec kdump par défaut. Toutefois, l'exécution de ces actions entraîne la perte des données collectées si ces actions sont effectuées. Pour plus d'informations, reportez-vous au fichier kdump.conf.5 dans l'archive /usr/share/man/man5/kdump.conf.5.gz.

  3. Lorsque vous avez terminé, enregistrez les modifications et redémarrez le service kdump.
    sudo systemctl restart kdump.service
  4. Redémarrez l'instance pour appliquer les modifications.

Déclenchement d'un vidage sur incident

Testez la configuration du vidage sur incident en plantant le noyau qui déclenche le service pour collecter un vidage sur incident. Passez ensuite en revue le vidage sur incident.

  1. A partir d'une ligne de commande, à l'aide des privilèges d'administration, connectez-vous à l'instance à l'aide de SSH.
  2. Assurez-vous que Kdump est en cours d'exécution :
    systemctl is-active kdump
  3. Lancez la panne à partir de la console ou de la ligne de commande :
    echo 1 > /proc/sys/kernel/sysrq
    echo c > /proc/sysrq-trigger
    Cela force le noyau à planter et les fichiers dump sont copiés dans le répertoire /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>, par défaut, ou à l'emplacement que vous avez sélectionné dans la configuration.
  4. Redémarrer l'instance.
  5. Reconnectez-vous à l'instance à l'aide de SSH et vérifiez les fichiers de vidage sur incident dans /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS> :
    • Le tampon de messages du noyau contient les informations les plus essentielles sur la panne du système et est toujours vidé en premier dans le fichier vmcore-dmesg.txt. Cela est utile en cas d'échec d'une tentative d'obtention du fichier vmcore complet, par exemple en raison d'un manque d'espace sur l'emplacement cible.
    • Lorsque l'outil kexec s'initialise dans le second noyau et capture le contenu de la mémoire du noyau en panne, il écrit également dans le fichier kexec-dmes.log afin que vous puissiez suivre le processus. Par exemple, à la fin du fichier, vous pouvez voir le processus d'enregistrement du vidage sur incident :
      ...
      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//
    • Le fichier vmcore contient les informations de vidage sur incident. Pour analyser le vidage sur incident, vous avez besoin d'un utilitaire capable de lire le format de fichier vmcore. Pour plus d'informations sur l'utilisation de l'utilitaire crash, reportez-vous à Analyse des vidages sur incident.

Analyse des vidages sur incident

Vous pouvez utiliser l'utilitaire crash pour analyser les vidages sur incident collectés par Kdump. Dans les images de plate-forme Oracle Linux, crash est installé par défaut. Pour les autres instances Linux, utilisez la ligne de commande pour l'installer : sudo dnf install crash.

Configuration d'une instance Oracle Linux pour utiliser l'utilitaire de panne

Pour analyser un vidage sur incident avec crash, effectuez les tâches de configuration suivantes :

  1. A partir d'une ligne de commande, utilisez vos privilèges d'administration et connectez-vous à l'instance à l'aide de SSH.
  2. Activez le référentiel debuginfo Oracle Linux en créant le fichier /etc/yum.repos.d/debuginfo.repo avec des privilèges root et le contenu suivant, par exemple :
    [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. Mettez à jour le système :
    sudo dnf update -y
  4. Installez le package kernel-uek-debuginfo :
    sudo dnf install -y kernel-uek-debuginfo-$(uname -r)
    Important

    Exécutez la commande d'installation chaque fois que le noyau est mis à jour via le gestionnaire de packages. Le package debuginfo est uniquement fonctionnel lorsqu'il correspond au noyau en cours d'exécution et n'est pas remplacé automatiquement lorsqu'une version plus récente du noyau est installée sur le système.

Analyse d'un vidage sur incident à l'aide de l'utilitaire crash

Pour analyser un vidage sur incident, fournissez les informations vmcore à crash, puis utilisez les options de shell crash pour extraire les informations de vidage sur incident. Pour plus d'informations sur l'utilisation de l'utilitaire crash, saisissez man crash à l'invite de commande ou reportez-vous à la documentation sur les pannes.

  1. A partir d'une ligne de commande, utilisez vos privilèges d'administration et connectez-vous à l'instance à l'aide de SSH.
  2. Fournissez l'emplacement du module debuginfo du noyau et l'emplacement du dump noyau en tant que paramètres à l'utilitaire crash, par exemple :
    sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>/vmcore

    $(uname -r) identifie la version du noyau en cours d'exécution dans la commande, <ip-address>-<YYYY-MM-DD>-<HH:MM:SS> représente le répertoire qui est créé pour les fichiers de vidage sur incident et le fichier vmcore contient le vidage sur incident.

    Le shell crash démarre et affiche des informations sur la panne du système, telles que :

    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. A l'invite crash, entrez une option pour obtenir plus d'informations sur le vidage sur incident, par exemple :
    • bt -a affiche une trace de pile des tâches actives lors de la panique du noyau, par exemple :
      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 affiche uniquement la tâche active sur chaque CPU, par exemple :
      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 affiche les informations de base sur la mémoire virtuelle du contexte en cours, par exemple :
      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 affiche des informations sur les fichiers ouverts dans le contexte en cours.
      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 affiche des informations sur l'utilisation de la mémoire du noyau, par exemple :
      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. Lorsque vous avez terminé l'analyse du dump noyau, quittez le shell en saisissant exit ou q.