现代计算环境中,系统的稳定性和可靠性至关重要。然而,即使是最优化的系统也可能会由于硬件故障、软件漏洞或配置错误而崩溃。为了解决这一问题,Linux系统提供了强大的内核崩溃转储机制,本文介绍如何收集和分析崩溃日志,定位系统崩溃的根本原因,从而采取适当的措施来防止此类问题的再次发生。
01安装及配置Kdump
1.1安装Kdump工具
如CentOS RedHat或者redhat中
配置命令:
sudo yum install kexec-tools
1.2配置内核参数
编辑GRUB配置文件,添加crashkernel参数以预留内存。例如,在/etc/default/grub文件中,对于主机内存较大的情况下可以适当增加:
配置命令:
GRUB_CMDLINE_LINUX="crashkernel=256M"
重新生成GRUB文件
配置命令:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
1.3设置Kdump日志存储路径
编辑KDUMP配置文件/etc/kdump.conf,添加如下参数,指定内存转储文件的保存位置:
配置命令:
path /var/crash
启动并启用KDUMP服务
配置命令:
sudo systemctl start kdump&sudo systemctl enable kdump
1.4验证KDUMP配置
验证KDUMP是否正确配置,手动触发系统崩溃
配置命令:
echo c > /proc/sysrq-trigger
系统将会崩溃并重启,KDUMP服务会生成内存转储文件
02Dump转储日志分析
2.1设置日志路径
查看/etc/kdump.conf 的path参数确认日志存放目录,收集故障时间的日志文件
如:
2.2安装内核文件vmlinux
新建或编辑/etc/yum.repos.d/CentOS-Debuginfo.repo 加入如下内容:
配置命令:
[base-debuginfo]
name=CentOS-$releasever - Debuginfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=1
enabled=1
查看内核版本:
配置命令:
uname -r
清理 Yum 缓存以确保使用最新的仓库信息,然后安装相同内核版本的vmlinux:
配置命令:
sudo yum clean all
sudo yum --enablerepo=base-debuginfo
install kernel-debuginfo-3.10.0-1160.el7.x86_64 -y
2.3使用crash工具打开vmcore
指定当前版本vmlinux读取vmcore:
配置命令:
sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcore
2.4crash常用命令
log:使用命令查看系统发生BUG的详细信息,包括无法处理的空指针引用错误。
bt:使用命令查看堆栈信息,显示了进程ID(PID)、任务结构地址(TASK)、CPU编号及进程名称(COMMAND)。
ps:使用命令显示系统中所有进程的信息,包括进程 ID、状态、优先级等。
files:使用命令列出进程打开的文件描述符
vm: 显示虚拟内存信息
mount: 显示挂载的信息
help: 显示可用命令的列表
03案例分析
3.1模块加载导致系统异常
堆栈信息查看:
crash视图下执行bt查看堆栈信息:
PID: 17114 TASK: ffff8cab78456300 CPU: 5 COMMAND: "insmod"
表明系统在尝试加载模块(insmod命令)时遇到了一个致命错误,导致了系统崩溃。
crash_module: loading out-of-tree module taints kernel
crash_module: module verification failed: signature and/or required key missing - tainting kernel
这段表明该模块是非官网模块,没有经过适当的签名验证。
[exception RIP: init_module+8]
表明故障寄存器位置在init_module函数的第8个字节处,需要查看代码对应函数位置是否存在问题。
3.2阵列卡问题导致系统异常
日志信息查看:
crash视图下执行log查看日志信息:
BUG: unable to handle kernel NULL pointer dereference at 00000000
IP: [] some_faulty_function+0x23/0x50
内核检测到一个空指针引用, 表示在 some_faulty_function 函数中的偏移量为 0x23 处发生错误。
Modules linked in: raid_module scsi_mod libata
CPU: 0 PID: 1234 Comm: some_process Not tainted 5.4.0-42-generic #46-Ubuntu Hardware name: Manufacturer Model/Type
当前加载的模块:raid_module scsi_mod libata,硬件的基本信息:Manufacturer Model/Type
从模块和硬件信息查看可以确认是raid卡引起的问题,可以使用硬件诊断工具检查RAID控制器、硬盘等设备的状态。