HACK#54 使用Kdump提取内核崩溃转储

本节介绍最近的发布版中采用的Kdump的使用方法。

Kdump是从Linux 2.6.13开始安装到主线(mainline)中的内核崩溃转储功能。在2.6.13以后的内核的Linux发布版中都可以使用。本节将介绍在RHEL6中进行确认的Kdump使用步骤。所使用的架构为x86_64。

启用崩溃转储

首先向内核启动参数添加crashkernel=128M。分配128MB的内存用于Kdump。笔者的环境在RHEL6的/etc/grub.conf中显示下列内容。


title RHEL6(2.6.32-71.el6.x86_64)

root(hd0,0)

kernel/boot/vmlinuz-2.6.32-71.el6.x86_64 root=UUID=987aa4dd-a712-4ff3-8ad9-28edb4ddcaae ro rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=ja_JP.UTF-8 KEYBOARDTYPE=pc KEYTABLE=jp106 crashkernel=128M rhgb quiet

initrd/boot/initramfs-2.6.32-71.el6.x86_64.img


从RHEL6开始扩展crashkernel内核启动参数,也可以按下列形式设置。


crashkernel=<range1>:<size1>[,<range2>:<size2>,……][@offset]


可以不根据机器安装的物理内存大小分配内存,或者改变分配的内存量。例如,可以指定如下内存分配情况。


crashkernel=512M-2G:64M,2G-:128M


它表示的意义是:

·如果物理内存不足512MB,则不分配内存作为Kdump用。

·如果物理内存大于512MB小于2GB,则分配64MB作为Kdump用。

·如果物理内存大于2GB,则分配128MB。

进行这样的指定后,即使从机器上拔下内存,也无须改变参数。

内存分配成功后,内核启动时就会输出下列信息。


dmesg

……

Reserving 128MB of memory at 32MB for crashkernel(System RAM:1022MB)


然后,启用kdump服务。使用chkconfig命令、service命令。


chkconfg kdump on

service kdump start


可以通过service命令或/sys/kernel/kexec_crash_loaded确认是否已设置成功。

如果使用service命令显示出如下信息,就表示设置已启用。


service kdump status

Kdump is operational


kexec_crash_loaded的内容为1时表示设置已启用。


cat/sys/kernel/kexec_crash_loaded


1

准备工作做好后,就可以尝试提取崩溃转储。


echo c>/proc/sysrq-trigger


如果转储成功,内核重新启动后就会在/var/crash/下生成目录,其中存放vmcore文件。