CentOS7 配置kdump和使用crash工具分析crash现场

原文  http://smilejay.com/2016/04/centos7-kdump-configuration/

1. 关于kdump 和 crash

kdump是一种kernel crash dump的机制,它可以在内核crash时保存系统的内存信息用于后续的分析。kdump是基于kexec的。

crash是一个用于交互式地分析正在运行的Linux系统或者kernel crash后的core dump数据的工具。

dump的工作原理图:

CentOS7 <wbr>配置kdump和使用crash工具分析crash现场

CentOS7 <wbr>配置kdump和使用crash工具分析crash现场

2. 在CentOS 7 中配置kdump

需要在kernel启动命令行参数中添加crashkernel参数,并启动kdump服务。

一般设置为 crashkernel=auto 表示根据系统内存自动reserve一些内存给kernelcrash用,在x86_64系统中内存大于等于2GB时会reserve内存,最小保留内存计算方法是:160 MB + 2 bits for every 4 KB of RAM.

当然,也可以设置crashkernel=512M这样的固定保留内存。

用 yum install kexec-tools 安装kdump工具和服务

用 systemctl start kdump 命令可以启动kdump.service,用 systemctl enable kdump 让dump服务在开机时自动启动。

kdump.service 相关的配置文件 /etc/kdump.conf 里面可以修改一些默认的配置,比如dump完成后的动作(默认是reboot)、dump文件存放的方式(本地目录、NFS、scp到另外服务器等)。

3. 测试kdump

用root权限执行如下命令,可以让kernel crash。

# echo 1 > /proc/sys/kernel/sysrq
# echo c > /proc/sysrq-trigger

kernel dump完成后,系统重启,进入到 /var/crash/ 目录下可以看到保存下来的crash时系统的内存数据文件。 (默认保存在/var/crash目录)

4. 用crash工具分析

首先需要安装对应的kernel-debuginfo软件包,比如:

补充;注意下载的时候,要下载 与生成dump文件相同的内核版本的kernel-debuginfo。

查看uname -a

wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64.rpm

wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-327.el7.x86_64.rpm

安装好kernel-debuginfo包后,执行类似这样的crash命令即可进入交互式的分析:

crash /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux /var/crash/127.0.0.1-2016-03-28-15\:28\:59/vmcore

在输入bt可以展示kernel-stack的backtrace,更多crash中的命令见 man crash。

另外,给个我启动kdump.service失败的情况:内存较小时,没有reserve内存给crashkernel;启动kdump.service会失败,systemctl status kdump 会看到如下log:

[root@localhost ~]# systemctl status kdump
● kdump.service - Crashrecoverykernelarming
  Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendorpreset: enabled)
  Active: failed (Result: exit-code) sinceMon 2016-03-28 14:17:21 CST; 7s ago
  Process: 29388 ExecStart=/usr/bin/kdumpctlstart (code=exited, status=1/FAILURE)
 MainPID: 29388 (code=exited, status=1/FAILURE)
 
Mar 28 14:17:20 localhost.localdomain systemd[1]: StartingCrashrecoverykernelarming...
Mar 28 14:17:21 localhost.localdomain kdumpctl[29388]: Nomemoryreservedfor crashkernel.
Mar 28 14:17:21 localhost.localdomain kdumpctl[29388]: Startingkdump: [FAILED]
Mar 28 14:17:21 localhost.localdomain systemd[1]: kdump.service: mainprocessexited, code=exited, status=1/FAILURE
Mar 28 14:17:21 localhost.localdomain systemd[1]: Failedto startCrashrecoverykernelarming.
Mar 28 14:17:21 localhost.localdomain systemd[1]: Unitkdump.service enteredfailedstate.
Mar 28 14:17:21 localhost.localdomain systemd[1]: kdump.service failed.

Configuring Kdump to troubleshoot kernel crashes, hangs, or reboots in RHEL5/RHEL6/RHEL7

参考:

1  Systemtap 安装

    yum install systemtap    

    跟systemtap有关的有6,7个,全装上,别偷懒

    就用yum安装,别傻傻的去下rpm包,吃力不讨好

2  kernel debuginfo包安装

这一点RHEL6 跟 RHEL5不同, redhat没有提供 kernel debuginfo 包的ftp下载(也可能是我没有找到),

估计可能是要收钱了,网上大部分都是centos或者其他源码编译的(rpm -qi xxx.rpm 的Vendor字段)

用 http://rpm.pbone.net/ 搜

rpm -ivh kernel-debuginfo-2.6.32-279.el6.x86_64.rpm

rpm -ivh kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64.rpm

Leave a Reply

Your email address will not be published. Required fields are marked *