没有废话,直奔主题
什么是Kdump?
Kdump 是一种的新的crash dump捕获机制,用来捕获kernel crash时候产生的crash dump。Kdump需要配置两个不同目的的kernel,其中一个我们在这里称作standard(production) kernel;另外一个称之为Crash(capture)kernel。
standard(production)kernel,是指我正在使用的kernel,当standard kernel在使用的过程中出现crash的时候, kdump会切换到crash kernel, 简单来说,standard kernel会正运行时发生crash,而crash(capture) Kernel 会被用来捕获production kernel crash时候产生的crash dump。
捕获crash dump是在新的crash(capture) kernel 的上下文中来捕获的,而不是在standard kernel上下文进行。
具体是当standard kernel方式crash的时候,kdump通过kexec(后面介绍)自动启动进入到crash kernel当中。如果启动了kdump服务,standard kernel会预留一部分内存, 这部分内存用来启动crash kernel。
kdump机制主要包括两个组件:kdump和kexec
什么是Kexec?
kexec 是一个快速启动kernel的机制,它运行在某一正在运行的kernel中,启动一个新的kernel(这里是crash kernel),而且不用重新经过BIOS 就可以完成启动。因为一般BIOS都会花费很长的时间,尤其是在大型并且同时连接许多外部设备的Server上的环境下,BIOS会花费更多的时间。
安装kdump
据我所知,目前RHEL 5、6和SLES 10 linux distribution都会默认安装kdump。
但是我们还是首先简单了解下安装kdump需要哪些条件:
首先,需要在编译standard(production) kernel 之前,需要指定kernel crash dumping 相关的一组compile 选项
其次,需要在编译好的standard kernel之上,安装kernel-kdump package,这个package包含了crash(capture)kernel,crash kernel在standard kernel crash的时候被启动,因此提供了环境用来capture正处于crash中的standard kernel的dump信息。
关于对于从upstream下载,编译kernel需要注意的编译选项,请参见 参考[2]。
接下来,我们重点描述在rhel5.6环境下如何安装,配置,使用kdump。
RHEL环境下kdump是默认安装的,实现kdump机制的几个重要的package如下:
package name
package info
kdump
kdump package
kexec-tools
kexec package
kernel-debuginfo
crash analysis package
kdump相关的重要文件如下:
/etc/init.d/kdump
kdump 服务启动脚本
/etc/sysconfig/kdump
kdump 配置文件
/usr/share/doc/packages/kdump
配置Kdump:
1 确定kdump相关的package已经安装好:
[root@bl25p-19 sysconfig]# rpm -qa | grep kdump
system-config-kdump-1.0.14-4.el5
[root@bl25p-19 sysconfig]# rpm -qa | grep kexec
kexec-tools-1.102pre-126.el5
[root@bl25p-19 sysconfig]# rpm -qa | grep debuginfo
kernel-debuginfo-common-2.6.18-238.el5
kernel-debuginfo-2.6.18-238.el5
2 配置grub,在启动时为内核传递参数,来告知内核如何为crash kernel预留内存
title Red Hat Enterprise Linux Server (2.6.18-238.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet crashkernel=128M@16M #(XXX@YYY, xxx为大小, yyy为offset)
initrd /initrd-2.6.18-238.el5.img
3 配置/etc/kdump.conf,来设定crash dump最终为存在何处,具体参见man 5 kdump.conf。默认是存放在/var/crash/[crash generated date]/vmcore
4 设置kdump服务开机是自动启动
chkconfig kdump on #开机自启动
service kdump start # 启动kdump服务
5 测试,通过sysrq强制系统崩溃
echo “c” > /proc/sysrq-trigger
6 因为debuginfo package,所以在你获得crash dump之后,你可以使用crash来进行分析。
安装debuginfo package之后,在/usr/lib/debug/lib/modules/$(uname -r)/下生成用于调试的vmlinux(vmlinux is uncompressed, vmlinuz is compressed)。
# crash /usr/lib/debug/lib/modules/2.6.18-238.el5/vmlinux vmcore 来调试你的vmcore crash dump文件。
参考:
[1] Linux Kernel Crash Book -- Everything you need to know