crash linux主要命令,kdump和crash的配置方法以及故障分析方法
Linux的内核十分稳定,但仍不可避免会遇到崩溃的情况,获取内核崩溃时的内存镜像,有助于分析系统在崩溃前发生了什么,分析原因并修复错误,进而进一步提升系统的稳定性。【正文】一 kdump简介kdump 是目前最有效的linux内存镜像收集机制,广泛应用于各大linux厂商的各种产品中,在 debug 内核方面起着不可替换的重要作用。Kdump 是一种基于 kexec 的 Linux 内核崩溃捕..
Linux的内核十分稳定,但仍不可避免会遇到崩溃的情况,获取内核崩溃时的内存镜像,有助于分析系统在崩溃前发生了什么,分析原因并修复错误,进而进一步提升系统的稳定性。
【正文】
一 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 用到的各种工具都在 kexec-tools 中。kernel-debuginfo 则是用来分析 vmcore 文件。从 rhel5 开始,kexec-tools 已被默认安装在发行版。而如果需要调试 kdump 生成的 vmcore 文件,则需要手动安装 kernel-debuginfo 包。检查安装包操作,注意kernel-debuginfo和kernel-debuginfo的版本要和内核版本一致:

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
…
#raw /dev/sda5 (如果写入到裸设备上,需要取消该行的注释)
#ext4 /dev/sda3 (指定写入设备的文件系统类型和分区)
#ext4 LABEL=/boot (支持LABEL以及UUID来标识设备)
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
#net my.server.com:/export/tmp (NFS方式写入)
#net user@my.server.com (SSH方式写入)
path /var/crash (内存镜像文件的保存路径)
core_collector makedumpfile -c --message-level 1 -d 31
(设置保存内存镜像内容的级别,-c表示使用makedumpfile压缩数据,--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服务设置为开机自启动。

2.5 验证配置是否成功。
使用命令出发内核的崩溃,如在指定目录下生成内核镜像文件则表示配置成功。


三 crash简介
crash是目前广泛使用的 linux 内核崩溃转储文件的分析工具,掌握crash的使用技巧,对于分析定位内核崩溃的问题,有着非常重要的作用。
对于内核开发人员,crash 已经成了必不可少的一个工具。
四 crash配置以及初步使用
4.1 检查安装包

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


各项参数的意义为:
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是严重错误,代表整个系统崩溃。深入的分析需要使用更多的命令进行追踪和查找,并需要对内核的运行机制和内核开发编程有一定的了解。
4.3 crash常用命令
help #查看命令的帮助信息,也可用man命令
h #查看历史命令,相当于shell下的history
log #该命令用于打印出内存的日志信息
bt #该命令用于获取当前线程的调用堆栈
foreach bt #该命令用于获取所有线程的调用堆栈
ps #该命令用于查看内核崩溃时的进程信息
vm #该命令用于查看当前的内核上下文的虚拟内存信息
files #该命令用于查看当前的内核上下文中打开的文件
exit or q #退出Crash
4.4 使用 bt 命令查看堆栈

[exception RIP: sysrq_handle_crash+22]字段显示,指令指针发生异常,原因为内核函数sysrq_handle_crash发生错误,偏移量为22,可以看出,这也和文件系统相关。
CS: 0010字段表示代码段寄存器的信息,其最低位为0,表示当前进程的特权等级(CPL)为0,表示错误发生在内核空间。
4.5 log 命令可以打印系统消息缓冲区,从而可能找到系统崩溃的线索(截图已省略部分行,只显示末尾)

与bt结果类似,内核通过Call Trace打印出来系统调用的堆栈信息,以供分析。
4.6 ps 命令用于显示进程的状态,(如图)带 > 标识代表是活跃的进程。

其中swapper表示系统的交换进程,是内核的一部分,负责内核任务的调度,其pid为0,每个CPU都会有一个swapper进程。这里可以看到导致内核崩溃的进程bash的状态,进程号为1728。
4.7 files命令可以查看当前的内核上下文中打开的文件

可以看到有相关的文件操作/proc/sysrq-trigger
4.8 vm命令查看虚拟内存信息

4.9 mount命令查看挂载状态

4.10 net命令查看简单的网络信息

五 结论
当 linux 系统内核发生崩溃的时候,可以通过 kdump 等方式收集内核崩溃之前的内存,生成一个转储文件 vmcore。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因,从而进行操作系统的代码改进。crash就是一个被广泛使用的内核崩溃转储文件分析工具。通过kdump和crash的亲密配合,可以排除不少问题。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)