使用 kdump 进行 Linux 内核崩溃分析
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)
- 点赞
- 收藏
- 关注作者
评论(0)