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文件。