Linux系统崩溃破案实录

现代计算环境中,系统的稳定性和可靠性至关重要。然而,即使是最优化的系统也可能会由于硬件故障、软件漏洞或配置错误而崩溃。为了解决这一问题,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控制器、硬盘等设备的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马立杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值