使用 kdump 进行 Linux 内核崩溃分析

举报
Tiamo_T 发表于 2022/09/08 16:44:01 2022/09/08
【摘要】 Kdump 是一个实用程序,用于在系统崩溃时捕获系统核心转储。 这些捕获的核心转储可用于稍后分析系统故障的确切原因并实施必要的修复以防止将来发生崩溃。

Kdump 是一个实用程序,用于在系统崩溃时捕获系统核心转储。

这些捕获的核心转储可用于稍后分析系统故障的确切原因并实施必要的修复以防止将来发生崩溃。

Kdump 为称为 crashkernel 的辅助内核保留一小部分内存。

这个辅助或崩溃内核用于在系统崩溃时捕获核心转储映像。

1.安装Kdump工具

首先,安装 kdump,它是 kexec-tools 包的一部分。

# yum install kexec-tools

2.在grub.conf中设置crashkernel

安装软件包后,编辑 /boot/grub/grub.conf 文件并设置为 kdump 崩溃内核保留的内存量。

您可以编辑 /boot/grub/grub.conf 的值 crashkernel 并将其设置为自动或用户指定的值。对于 2G 内存或更高内存的机器,建议至少使用 128M。

在以下示例中,查找以“kernel”开头的行,将其设置为“crashkernel=auto”。

# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-419.el6.x86_64)
  root (hd0,0)
  kernel /vmlinuz-2.6.32-419.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
  initrd /initramfs-2.6.32-419.el6.x86_64.img

3.配置转储位置

一旦内核崩溃,可以根据 /etc/kdump.conf 中定义的设置将核心转储捕获到本地文件系统或远程文件系统 (NFS)(在 SLES 操作系统中,路径为 /etc/sysconfig/kdump)。

该文件是在安装 kexec-tools 软件包时自动创建的。

默认情况下,此文件中的所有条目都将被注释掉。您可以取消注释最佳选项所需的注释。

# vi /etc/kdump.conf
#raw /dev/sda5
#ext4 /dev/sda3
#ext4 LABEL=/boot
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
#net my.server.com:/export/tmp
#net user@my.server.com
path /var/crash
core_collector makedumpfile -c --message-level 1 -d 31
#core_collector scp
#core_collector cp --sparse=always
#extra_bins /bin/cp
#link_delay 60
#kdump_post /var/crash/scripts/kdump-post.sh
#extra_bins /usr/bin/lftp
#disk_timeout 30
#extra_modules gfs2
#options modulename options
#default shell
#debug_mem_level 0
#force_rebuild 1
#sshkey /root/.ssh/kdump_id_rsa

在上面的文件中:

  • 要将转储写入原始设备,您可以取消注释“raw /dev/sda5”并将其更改为指向正确的转储位置。
  • 如果要更改转储位置的路径,请取消注释并将“path /var/crash”更改为指向新位置。
  • 对于 NFS,您可以取消注释“#net my.server.com:/export/tmp”并指向当前 NFS 服务器位置。

4.配置核心收集器

下一步是在 Kdump 配置文件中配置核心收集器。压缩捕获的数据并从捕获的核心文件中过滤所有不必要的信息非常重要。

要启用核心收集器,请取消注释以下以 core_collector 开头的行。

core_collector makedumpfile -c --message-level 1 -d 31
  • 在 core_collector 中指定的 makedumpfile 实际上是通过压缩数据来生成一个小的 DUMPFILE。
  • makedumpfile 提供了两种 DUMPFILE 格式(ELF 格式和 kdump 压缩格式)。
  • 默认情况下,makedumpfile 以 kdump 压缩格式生成 DUMPFILE。
  • kdump-compressed 格式只能使用 crash 实用程序读取,并且由于支持压缩,它可以小于 ELF 格式。
  • GDB 和 crash 实用程序可以读取 ELF 格式。
  • -c 是按每页压缩转储数据
  • -d 是不必要的页数,可以忽略。

如果取消注释 #default shell 行,则在 kdump 无法收集核心时调用 shell。然后管理员可以使用 makedumpfile 命令手动获取核心转储。

5.重启kdump服务

配置好 kdump 后,重新启动 kdump 服务,

# service kdump restart
Stopping kdump:   [  OK  ]
Starting kdump:   [  OK  ]

# service kdump status
Kdump is operational

如果您在启动服务时遇到任何问题,则可能是 kdump 模块或 crashkernel 参数设置不正确。因此,请验证 /proc/cmdline 并确保它反映了包含 crashkernel 值。

6.手动触发核心转储

您可以使用以下命令手动触发核心转储:

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

服务器将自行重启并生成故障转储。

7.查看核心文件

重新启动服务器后,您将看到核心文件根据 /var/crash 中定义的位置在 /var/crash 下生成。

您将看到 vmcore 和 vmcore-dmseg.txt 文件:

# ls -lR /var/crash
drwxr-xr-x. 2 root root 4096 Mar 26 11:06 127.0.0.1-2014-03-26-11:06:43

/var/crash/127.0.0.1-2014-03-26-11:06:43:
-rw-------. 1 root root 33595159 Mar 26 11:06 vmcore
-rw-r--r--. 1 root root    79498 Mar 26 11:06 vmcore-dmesg.txt

8.使用crash的kdump分析

Crash 实用程序用于分析 kdump 捕获的核心文件。

它还可用于分析其他转储实用程序(如 netdump、diskdump、xendump)创建的核心文件。

您需要确保存在“kernel-debuginfo”包并且它与内核处于同一级别。

启动崩溃工具,如下所示。执行此命令后,您将收到一个现金提示,您可以在其中执行崩溃命令:

# crash /var/crash/127.0.0.1-2014-03-26-12\:24\:39/vmcore /usr/lib/debug/lib/modules/`uname –r`/vmlinux

crash>

9.查看系统崩溃时的进程

在崩溃提示符下执行 ps 命令,会显示系统崩溃时所有正在运行的进程。

crash> ps
   PID    PPID  CPU       TASK        ST  %MEM     VSZ    RSS  COMM
      0      0   0  ffffffff81a8d020  RU   0.0       0      0  [swapper]
      1      0   0  ffff88013e7db500  IN   0.0   19356   1544  init
      2      0   0  ffff88013e7daaa0  IN   0.0       0      0  [kthreadd]
      3      2   0  ffff88013e7da040  IN   0.0       0      0  [migration/0]
      4      2   0  ffff88013e7e9540  IN   0.0       0      0  [ksoftirqd/0]
      7      2   0  ffff88013dc19500  IN   0.0       0      0  [events/0]

10.系统崩溃时查看Swap空间

在崩溃提示符下执行 swap 命令,将显示系统崩溃时的交换空间使用情况。

crash> swap
FILENAME           TYPE         SIZE      USED   PCT  PRIORITY
/dm-1            PARTITION    2064376k       0k   0%     -1

11.系统崩溃时查看IPCS

在崩溃提示符下执行 ipcs 命令,会显示系统崩溃时的共享内存使用情况。

crash> ipcs
SHMID_KERNEL     KEY      SHMID      UID   PERMS BYTES      NATTCH STATUS
(none allocated)

SEM_ARRAY        KEY      SEMID      UID   PERMS NSEMS
ffff8801394c0990 00000000 0          0     600   1
ffff880138f09bd0 00000000 65537      0     600   1

MSG_QUEUE        KEY      MSQID      UID   PERMS USED-BYTES   MESSAGES
(none allocated)

12. 系统崩溃时查看IRQ

在崩溃提示符下执行 irq 命令,该命令将显示系统崩溃时的IRQ 统计信息。

crash> irq -s
           CPU0
  0:        149  IO-APIC-edge     timer
  1:        453  IO-APIC-edge     i8042
  7:          0  IO-APIC-edge     parport0
  8:          0  IO-APIC-edge     rtc0
  9:          0  IO-APIC-fasteoi  acpi
 12:        111  IO-APIC-edge     i8042
 14:        108  IO-APIC-edge     ata_piix
 .
 .

vtop - 此命令将用户或内核虚拟地址转换为其物理地址。
foreach - 此命令显示系统中多个任务的数据
waitq - 此命令显示在等待队列中排队的所有任务。

13.查看系统崩溃时的虚拟内存

在崩溃提示符下执行 vm 命令,会显示系统崩溃时的虚拟内存使用情况。

crash> vm
PID: 5210   TASK: ffff8801396f6aa0  CPU: 0   COMMAND: "bash"
       MM              		 PGD          RSS    TOTAL_VM
ffff88013975d880  ffff88013a0c5000  1808k   108340k
      VMA           START       END     FLAGS FILE
ffff88013a0c4ed0     400000     4d4000 8001875 /bin/bash
ffff88013cd63210 3804800000 3804820000 8000875 /lib64/ld-2.12.so
ffff880138cf8ed0 3804c00000 3804c02000 8000075 /lib64/libdl-2.12.so

14.查看系统崩溃时打开的文件

在崩溃提示符下执行 files 命令,将显示系统崩溃时打开的文件。

crash> files
PID: 5210   TASK: ffff8801396f6aa0  CPU: 0   COMMAND: "bash"
ROOT: /    CWD: /root
 FD       FILE            DENTRY           INODE       TYPE PATH
  0 ffff88013cf76d40 ffff88013a836480 ffff880139b70d48 CHR  /tty1
  1 ffff88013c4a5d80 ffff88013c90a440 ffff880135992308 REG  /proc/sysrq-trigger
255 ffff88013cf76d40 ffff88013a836480 ffff880139b70d48 CHR  /tty1
..

15、系统崩溃时查看系统信息

在崩溃提示符下执行 sys 命令,系统崩溃时会显示系统信息。

crash> sys
      KERNEL: /usr/lib/debug/lib/modules/2.6.32-431.5.1.el6.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2014-03-26-12:24:39/vmcore  [PARTIAL DUMP]
        CPUS: 1
        DATE: Wed Mar 26 12:24:36 2014
      UPTIME: 00:01:32
LOAD AVERAGE: 0.17, 0.09, 0.03
       TASKS: 159
    NODENAME: elserver1.abc.com
     RELEASE: 2.6.32-431.5.1.el6.x86_64
     VERSION: #1 SMP Fri Jan 10 14:46:43 EST 2014
     MACHINE: x86_64  (2132 Mhz)
      MEMORY: 4 GB
       PANIC: "Oops: 0002 [#1] SMP " (check log for details)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。