Collecte des vidages accidentels à l'aide de l'utilitaire Kdump

Lorsqu'un système Oracle Linux éprouve une panique du noyau et tombe en panne de manière inattendue ou cesse de répondre, les 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 dumping pour les informations sur les pannes du noyau. Dans les images de plate-forme Oracle Linux, le système d'exploitation est entièrement configuré ou partiellement configuré pour générer un dump sur incident, selon la date de lancement de l'image.

Note

Pour les images Linux personnalisées et de marché des applications déployées, installez et configurez Kdump à l'aide de la ligne de commande.

Kdump comprend un deuxième noyau, qui réside dans une partie réservée de la mémoire système, de sorte qu'il peut capturer des informations sur un noyau arrêté. Kdump utilise l'appel système kexec pour démarrer dans le deuxième noyau, appelé noyau de saisie, sans avoir à redémarrer 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, voir À l'intérieur d'un vidage de noyau Linux.

Pour les instances Oracle Linux, les informations de vidage sur incident collectées par Kdump sont copiées par défaut dans le répertoire /var/oled/crash/<ip-address>-<YYYY-MM-DD>-<HH:MM:SS>. Un nouveau 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 vous avez une instance Oracle Linux qui est inaccessible ou qui ne répond pas, vous pouvez envoyer une interruption de diagnostic pour le dépannage. Une interruption de diagnostic provoque une panne et le redémarrage du système d'exploitation de l'instance. Pour utiliser la console ou l'API pour envoyer une interruption de diagnostic, Kdump doit être configuré pour générer un vidage sur incident. Pour plus d'informations, voir Envoi d'une interruption de diagnostic.

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

Sur les images de plate-forme Oracle Linux, Kdump est installé et entièrement configuré ou partiellement configuré par défaut. Vous pouvez modifier la quantité de mémoire réservée dans le noyau pour enregistrer le vidage sur incident, également appelé réservation de mémoire du noyau de mémoire sur incident. Dans Oracle Linux 8 et versions antérieures, la réservation de mémoire par défaut est réglée pour s'ajuster automatiquement : GRUB_CMDLINE_LINUX="crashkernel=auto". Toutefois, crashkernel=auto n'est pas pris en charge sur Oracle Linux 9 ou une version plus récente. 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. À 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 :
    • Réglez la réserve de mémoire à 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. Comme la réservation crashkernel a lieu au début du processus de démarrage, certains systèmes exigent 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 après incident

À 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 au moyen de SSH ou les exporter vers un partage de réseau.

  1. À 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 supprimez 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, voir le 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 redémarre le serveur. Cette action supprime toutes les données qui ont été collectées pour le vidage. Pour empêcher ce résultat, modifiez la configuration Kdump.

  1. À 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.

    Note

    Les options poweroff, restart et halt sont également valides pour l'état d'échec kdump par défaut. Toutefois, si vous effectuez ces actions, vous perdrez les données collectées. Pour plus d'informations, voir le 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 accidentel

Testez la configuration Kdump en bloquant le noyau qui déclenche la collecte d'un vidage sur incident par le service. Ensuite, vérifiez le vidage sur incident.

  1. À partir d'une ligne de commande, à l'aide des privilèges d'administration, connectez-vous à l'instance à l'aide de SSH.
  2. Vérifiez que Kdump est en cours d'exécution :
    systemctl is-active kdump
  3. Démarrez 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 à se bloquer et les fichiers de vidage 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> :
    • La mémoire tampon des messages du noyau inclut les informations les plus essentielles sur la panne du système et elle est toujours vidée d'abord dans le fichier vmcore-dmesg.txt. Cette fonction est utile en cas d'échec d'une tentative d'obtention du fichier vmcore complet, par exemple en raison d'un manque d'espace dans l'emplacement cible.
    • Lorsque l'outil kexec démarre dans le deuxième noyau et capture le contenu de la mémoire du noyau écrasé, 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. Voir Analyse des vidages d'incident pour plus d'informations sur l'utilisation de l'utilitaire crash.

Analyse des vidages accidentels

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.

Configurer une instance Oracle Linux pour utiliser l'utilitaire d'incident

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

  1. À 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 Oracle Linux debuginfo en créant le fichier /etc/yum.repos.d/debuginfo.repo avec les privilèges racine 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

    Remplacez ol8 par ol9 si vous utilisez Oracle Linux 9 ou ol10 si vous utilisez Oracle Linux 10.

  3. Mettre à jour le système :
    sudo dnf update -y
  4. Installez l'ensemble 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 au moyen du gestionnaire d'ensembles. L'ensemble debuginfo n'est fonctionnel que 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.

Analyser un vidage d'incident à l'aide de l'utilitaire d'incident

Pour analyser un vidage sur incident, fournissez les informations vmcore à crash, puis utilisez les options de l'interpréteur de commandes crash pour extraire les informations sur le vidage sur incident. Pour des informations détaillées sur l'utilisation de l'utilitaire Corbeille, entrez man crash à une invite de commande ou consultez la documentation sur la corbeille.

  1. À partir d'une ligne de commande, utilisez vos privilèges d'administration et connectez-vous à l'instance à l'aide de SSH.
  2. Indiquez l'emplacement du module debuginfo du noyau et l'emplacement du vidage du noyau en tant que paramètres de l'utilitaire Corbeille, 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.

    L'interpréteur de commandes crash démarre et affiche des informations sur les pannes 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. À 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 lorsque le noyau a paniqué, 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 UC, 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 courant, 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 courant.
      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 vidage du coeur, quittez l'interpréteur de commandes en entrant exit (quitter) ou q.