一、简介
分析操作系统crash或hang的原因,需要用到kernel dump。Linux系统用来捕捉kernel dump的工具是kdump。
kdump的原理是启动一个特殊的dump-capture kernel把系统内存里的数据保存到文件里,为什么需要一个特殊的dump-capture kernel呢?
因为原来的kernel已经出问题了,发生crash或hang了。Dump-capture kernel 既可以是独立的,也可以与系统内核集成在一起–这需要硬件支持relocatable kernel才行。
在X86_64系统上RHEL6/7和SLES11/12缺省都是与系统内核集成在一起的。
linux内核发送崩溃时,kdump会生成一个内核转储文件vmcore。 可以通过分析vmcore分析出内核崩溃的原因。crash是一个被广泛应用的内核奔溃转储文件分析工具。
使用crash调试内核转储文件,需要安装crash工具和内核调试工具kernel-debuginfo。
kdump工作的过程如下:
系统内核启动的时候,要给dump-capture kernel预留一块内存空间;
内核启动完成后,kdump service执行 kexec -p 命令把dump-capture kernel载入预留的内存里;
然后,如果系统发生crash,会自动reboot进入dump-capture kernel,dump-capture kernel只使用自己 的预留内存,确保其余的内存数据不会被改动,它的任务是把系统内存里的数据写入到dump文件,比如/var/crash/vmcore,为了减小文件的大小,它会通过makedumpfile(8)命令对内存数据进行挑选和压缩;
dump文件写完之后,dump-capture kernel自动reboot。
Kdump 用于对内存镜像的转储,它不但可以转储内存镜像到本地硬盘,还可以将内存镜像通过 NFS, SSH 等协议转储到不同机器的设备上。
Kdump 分为两个组件: Kexec 和 Kdump。
Kexec 是一种内核的快速启动工具,可以使新的内核在正在运行的内核(生产内核)的上下文中启动,而不需要通过耗时的 BIOS 检测,方便内核开发人员对内核进行调试。
Kdump 是一种有效的内存转储工具,启用 Kdump 后,生产内核将会保留一部分内存空间,用于在内核崩溃时通过 Kexec 快速启动到新的内核,这个过程不需要重启系统,因此可以转储崩溃的生产内核的内存镜像。
二、安装kudmp、crash、kernel-debuginfo
RHEL5开始,kexec-tools是默认安装的。 如果需要调试kdump生成的vmcore文件,需要手动安装kernel-debuginfo包。
安装包的版本,要与linux内核一致,查看linux内核版本:
uname -a
2.1 安装、配置、启动kdump
安装kdump:确定kdump相关package已安装好
rpm -qa | grep kdump
kexec-tools-2.0.0-273.el6.x86_64
system-config-kdump-2.0.5-15.el6.noarch
kexec package
6.x配置kdump:
vim /boot/grub/menu.lst: 设置crashkernel=auto
vim /etc/kdump.conf: path /var/crash (core文件产生的目录)
6.x启动kdump:
chkconfig kdump on // 开机启动
service kdump status // start、stop、restart等
7.x配置kdump:
vim /etc/default/grub 修改crashkernel的大小
grub2-mkconfig -o /boot/grub2/grub.cfg
7.x启动kdump:
systemctl start kdump.service //启动kdump
systemctl enable kdump.service //设置开机启动
2.2 安装crash
crash analysis package
文件名:crash-6.1.0-5.el6.x86_64.rpm
yum install crash.x86_64
2.3 安装kernel-debuginfo //需单独另外安装,yum源里没有
文件名:kernel-debuginfo-common-x86_64-2.6.32-220.el6.x86_64.rpm
kernel-debuginfo-2.6.32-220.el6.x86_64.rpm
下载地址:http://debuginfo.centos.org/6/x86_64/
安装:rpm -ivh kernel-debuginfo-common-x86_64-2.6.32-220.el6.x86_64.rpm
rpm -ivh kernel-debuginfo-2.6.32-220.el6.x86_64.rpm
三、分析vmcore
3.1 模拟机内内核奔溃
echo c > /proc/sysrq-trigger
执行此命令内核崩溃,会在/var/crash目录下生成vmcore文件。(vim /etc/kdump.conf; path /var/crash)
3.2 分析vmcore
进入目录/var/crash/127.0.0.1-2014-02-24-09:30:19,可以看到vmcore文件。
1.执行/usr/bin/crash /usr/lib/debug/lib/modules/2.6.32-220.el6.x86_64/vmlinux vmcore
2.具体分析过程见:http://blog.csdn.net/guowenyan001/article/details/12975221
参考资料:
深入探索kdump、crash:http://www.ibm.com/developerworks/cn/linux/l-cn-kdump4/index.html?ca=drs
crash调试vmcore:http://blog.csdn.net/taget/article/details/7814740