什么是kdump?
kdump 是一种的基于 kexec 的内核崩溃转储机制,类似飞机的黑匣子,系统一但崩溃,内核无法正常记录信息了,这时kdump将转入带第二个捕获内核,将第二个内核加载的内存中,对第一个内核的信息进行捕获。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。
kexec是一个快速启动机制,可以通过已经运行的内核,启动另外一个内核不需要经过bios
kdump原理?
kdump 需要两个不同目的的内核,生产内核和捕获内核。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的 ramdisk 一起组建一个微环境,用以对生产内核下的内存进行收集和转存。
kdump配置和使用
操作系统:centos7.2
安装配置分析工具crash
yum install crash
安装kernel-debuginfo(需要根内核版本一一对应)
1 | wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64.rpm |
1 | wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-327.el7.x86_64.rpm |
rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-327.el7.x86_64.rpm kernel-debuginfo-3.10.0-327.el7.x86_64.rpm
1 | 安装完后确认是否有 |
/usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux此文件
1 |
|
grubby –update-kernel=DEFAULT –args=crashkernel=128M
1 | 重启服务器 |
systemctl start kdump && systemctl enable kdump
1 | ls /boot 会发现生成了一个kdump结尾的文件 |
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger
1 | 此时系统会立刻失去连接进入捕获内核 |
crash /usr/lib/debug/lib/modules/3.10.0-327.el7.x86_64/vmlinux /var/crash/127.0.0.1-2017-09-20-13:09:30/vmcore
1 | ![](https://image-1251900790.cos.ap-chengdu.myqcloud.com/image/kdmup_6.png) |
KERNEL: 系统崩溃时运行的 kernel 文件
DUMPFILE: 内核转储文件
CPUS: 所在机器的 CPU 数量
DATE: 系统崩溃的时间
TASKS: 系统崩溃时内存中的任务数
NODENAME: 崩溃的系统主机名
RELEASE: 和 VERSION: 内核版本号
MACHINE: CPU 架构
MEMORY: 崩溃主机的物理内存
PID:3507表示当崩溃时3507这个bash的进程在操作
PANIC: 崩溃类型,常见的崩溃类型包括:
SysRq (System Request):通常是测试使用。通过 echo c > /proc/sysrq-trigger,就可以触发系统崩溃。
oops:可以看成是内核级的 Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到 Segfault 信号,一般行为是 coredump,应用程序也可以自己截获 Segfault 信号,自行处理。如果内核自己犯了这样的错误,则会弹出 oops 信息。
1 |
|
参考链接
http://www.361way.com/centos-kdump/3751.html
http://blog.csdn.net/zhangskd/article/details/38084337
https://www.ibm.com/developerworks/cn/linux/l-cn-kdump4/index.html