LINUX常用工具之kdump分析

发布时间:2024年01月11日

前言:

Linux操作系统的内核一般来说比较稳定,有些机器跑了十多年没有重启过,但是海量机器面前仍不可避免会遇到各种崩溃的情况,本文介绍使用kdump获取内核崩溃时的内存镜像,有助于分析系统在崩溃前发生了什么,分析原因并修复错误,进而进一步提升系统的稳定性。

一、kdump简介

kdump 是目前最有效的linux内存镜像收集机制,广泛应用于各大linux厂商的各种产品中,在 debug 内核方面起着不可替换的重要作用。
Kdump 是一种基于 kexec 的 Linux 内核崩溃捕获机制,将 kernel 崩溃前的内存镜像保存,程序员通过分析该文件找出 kernel 崩溃的原因,从而进行系统改进。
Kdump用于对内存镜像的转储,它不但可以转储内存镜像到本地硬盘,还可以将内存镜像通过NFS,SSH等协议转储到不同机器的设备上。
Kdump分为两个组件:Kexec和Kdump。
Kexec是一种内核的快速启动工具,可以使新的内核在正在运行的内核(生产内核)的上下文中启动,而不需要通过耗时的BIOS检测,方便内核开发人员对内核进行调试。Kdump是一种有效的内存转储工具,启用Kdump后,生产内核将会保留一部分内存空间,用于在内核崩溃时通过Kexec快速启动到新的内核,这个过程不需要重启系统,因此可以转储崩溃的生产内核的内存镜像。

二、kdump安装

2.1???????安装包
调试 kdump 生成的 vmcore 文件,需要手动安装 kernel-debuginfo 包。检查安装包操作,注意kernel-debuginfo和kernel-debuginfo的版本要和内核版本一致:

以 RHEL 为例,安装 crash 及内核调试信息包的步骤如下:

rpm -ivh crash-5.1.8-1.el6.ppc64.rpm rpm -ivh kernel-debuginfo-common-ppc64-2.6.32-220.el6.ppc64.rpm rpm -ivh kernel-debuginfo-2.6.32-220.el6.ppc64.rpm

安装可从这里下载:

?http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-1127.el7.x86_64.rpm
?http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-1127.el7.x86_64.rpm

2.2??????配置kdump配置文件
在/boot/grub/grub.conf文件中添加内核参数"crashkernel=Y@X",这里,Y 是为 kdump 捕捉内核保留的内存,X 是保留部分内存的开始位置。对于 i386 和 x86_64, 编辑 /etc/grub.conf, 在内核行的最后添加"crashkernel=128M"?。另外建议不要设置为crashkernel=auto,因为rhel6引入的”auto”已经要被抛弃了。


2.3??????配置kdump的一些参数。
kdump默认将文件存放在本地硬盘的/var/crash/目录下,该位置可以是本地文件系统的某个目录,或者某个块设备,或者通过网络存储在其他机器上,可以修改文件:
cat /etc/kdump.conf

注: --message-devel 1表示提示信息的级别,1表示只显示进度信息。

-d 31表示不复制所有可以去掉的内存页,包括zero page, cache page, cache private, user data, free page等
---#default shell
表示如果kdump转储内存镜像失败后的执行的动作,默认为挂载根文件系统并执行/sbin/init进程,可更改为reboot, halt, poweroff, shell等

2.4??????将kdump服务设置为开机自启动。

[root@node1 crash]# systemctl enable kdump
[root@node1 crash]# systemctl start kdump
?

2.5??????验证配置是否成功。(注意只能测试环境模拟宕机)
使用命令出发内核的崩溃,如在指定目录下生成内核镜像文件则表示配置成功。

echo c > /proc/sysrq-trigger

三、crash介绍

1、crash是目前广泛使用的 linux 内核崩溃转储文件的分析工具,掌握crash的使用技巧,对于分析定位内核崩溃的问题,有着非常重要的作用。
对于内核开发人员,crash 已经成了必不可少的一个工具。
?

2、使用crash分析内存转储文件。
两个参数分别是debug kernel 和 dump file,即带有调试信息的内核以及崩溃产生的内核转储文件,命令如下:

crash vmcore /usr/lib/debug/lib/modules/2.6.32-220.el6.x86_64/vmlinux


各项参数的意义为:

Kernel——表示调试内核的位置和版本信息
DUMPFILE——表示所分析的内存转储镜像
CPUS——表示本机的CPU数目
DATE——表示内核崩溃发生的时间
UPTIME——表示内核已正常运行的时间
LOAD AVERAGE——表示内核崩溃时系统的负载
TASKS——表示内核崩溃时系统运行的任务数
NODENAME——表似乎内核崩溃的机器的主机名
RELEASE——表示内核的发布版本
VERSION——表示内核的其他版本信息
MACHINE——表示CPU架构和主频信息
MEMORY——表示发生内核崩溃的系统的内存大小
PANIC——表示崩溃的类型。可能有SysRq,即通过系统请求造成的内核崩溃;Oops,表示内核发生了不可预测或不正确的行为,这时会杀死相应的进程,内核可能恢复正常,也可能处于一种不确定的状态,进而导致内核的Panic;Pannic,内核崩溃,即发生了严重且不可修复的错误,如发生了非法的地址访问,强制加载或卸载内核模块,以及硬件错误等等
PID——表示导致内核崩溃的的进程号
COMMAND——表示导致内核崩溃的进程名称
TASK——表示导致内核崩溃的进程访问的内存地址
CPU——表示导致内核崩溃的进程占用的CPU数目
STATE——表示导致内核崩溃的进程的运行状态
?

以上信息可用于初步分析内核崩溃的原因,内核态有三种出错情况,分别是bug, oops和panic。bug属于轻微错误,oops代表某一用户进程出现错误,需要杀死用户进程,这时如果用户进程占用了某些信号锁,这些信号锁将永远不会得到释放,这会导致系统潜在的不稳定性。Panic是严重错误,代表整个系统崩溃。深入的分析需要使用更多的命令进行追踪和查找,并需要对内核的运行机制和内核开发编程有一定的了解。
?

3、?crash常用命令

help??????????????????#查看命令的帮助信息,也可用man命令
h??????????????????????#查看历史命令,相当于shell下的history
log????????????????????#该命令用于打印出内存的日志信息
bt?????????????????????#该命令用于获取当前线程的调用堆栈
foreach bt #该命令用于获取所有线程的调用堆栈
ps?????????????????????#该命令用于查看内核崩溃时的进程信息
vm????????????????????#该命令用于查看当前的内核上下文的虚拟内存信息
files??????????????????#该命令用于查看当前的内核上下文中打开的文件
exit??or??q???????#退出Crash

(1)使用 bt 命令查看堆栈


(2)log 命令可以打印系统消息缓冲区,从而可能找到系统崩溃的线索


(3)ps 命令用于显示进程的状态,(如图)带 > 标识代表是活跃的进程。


(4)files命令可以查看当前的内核上下文中打开的文件,可以看到我们测试触发的trigger


(5)vm命令查看虚拟内存信息


(6)mount命令查看挂载状态


(7)net命令查看简单的网络信息

四、经验总结

?当 linux 系统内核发生崩溃的时候,可以通过 kdump 等方式收集内核崩溃之前的内存,生成一个转储文件 vmcore。通过分析该 vmcore 文件就可以诊断出内核崩溃的原因,通过kdump和crash的亲密配合,可以排除不少问题。

文章来源:https://blog.csdn.net/vincent0920/article/details/135520062
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。