Linux诊断和故障排除系列(十一) — dump设置和分析

kdump 是 Linux 系统中一个用于内核崩溃转储的工具。当 Linux 系统发生内核崩溃时(,kdump 能够将崩溃时的内存和寄存器状态等信息转储到一个文件中,供事后分析和调试使用。这对于系统管理员和开发人员来说是非常重要的,因为它可以帮助他们理解崩溃的原因,并采取相应的措施来防止未来的崩溃。

1. 安装并启动kdump

1.1 安装 kdump 工具:

首先,您需要通过系统的包管理器安装 kdump 所需的工具。可以使用 dnf 执行以下命令来安装 kexec-tools,这是 kdump 服务的依赖项:

$ dnf install kexec-tools

1.2 启动并启用 kdump 服务:

安装完成后,您需要启动 kdump 服务,并确保在系统启动时自动运行。这可以通过以下命令实现:

$ systemctl enable --now kdump

此命令不仅立即启动了 kdump 服务,还设置了其在系统启动时自动启动。

1.3检查 kdump 服务状态:

为了确认 kdump 服务已成功启动并运行,您可以使用以下命令查看服务状态:
如果服务运行正常,您将看到类似于以下的输出,表明 kdump 服务已启动并处于活动状态:

$ systemctl status kdump
● kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sun 2024-04-28 15:35:41 CST; 1 months 20 days ago
 Main PID: 678 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/kdump.service

2. 配置kdump

2.1 配置kdump位置

默认转储位置:kdump 默认将转储文件存储在本地文件系统的 /var/crash/ 目录中。这个位置可以根据您的系统需求进行更改。
要自定义崩溃转储文件的存储位置,您需要编辑 /etc/kdump.conf 配置文件。此文件包含了控制 kdump 行为的指令。
使用文本编辑器打开 /etc/kdump.conf 文件。例如,您可以使用 vi 或 nano:
在 /etc/kdump.conf 文件中,使用 path 指令指定转储文件的路径。例如,要将转储文件保存在 /var/crash/ 目录,添加以下行:

path /var/crash

这条指令告诉 kdump 在该路径下保存崩溃转储文件。

2.2 估算 kdump 大小

在配置 kdump 服务时,确保有足够的磁盘空间来存储内核崩溃转储文件是至关重要的。转储文件可能非常大,如果磁盘空间不足,转储过程可能会失败,从而导致无法进行事后分析。以下是如何使用 makedumpfile 工具来估算内核崩溃转储文件大小的步骤:
打开终端并使用以下命令来运行 makedumpfile 并查看预估的内存转储大小:

makedumpfile --mem-usage /proc/kcore

TYPE            PAGES                   EXCLUDABLE      DESCRIPTION
----------------------------------------------------------------------
ZERO            19894                   yes             Pages filled with zero
NON_PRI_CACHE   123490                  yes             Cache pages without private flag
PRI_CACHE       533911                  yes             Cache pages with private flag
USER            55632                   yes             User process pages
FREE            197063                  yes             Free pages
KERN_DATA       82981                   no              Dumpable kernel data 

page size:              4096            
Total pages on system:  1012971         
Total size on system:   4149129216       Byte

根据输出,我们可以看到预估的总大小大约为 4GB。这个预估大小将帮助我们确定是否有足够的磁盘空间来存储转储文件。

2.3 配置 kdump 内存用量

正确配置 kdump 的内存用量对于确保在系统崩溃时能够成功生成内存转储文件至关重要。
kdump 的自动内存分配因系统硬件架构和可用内存大小而异。
例如,在 AMD64 和 Intel 64 上,crashkernel=auto 参数仅在可用内存超过 2GB 时才起作用。
一般建议将crashkernel设置为auto,不然可能因为内存不足而无法生成dump
auto会让系统根据总内存的大小自动决定预留的内存量。例如,在 Red Hat Enterprise Linux 中,如果系统内存小于 2GB,可能不会预留内存;如果内存在 2GB 到 4GB 之间,可能会预留 128MB;如果内存超过 4GB,可能会预留更多的内存。

3. 测试 kdump 配置

在评估或验证 kdump 配置时,您可能会考虑执行一些操作来强制系统生成崩溃转储。然而,以下操作具有潜在的风险,并且应该在充分了解后果的情况下谨慎使用。
执行以下命令将触发系统调用紧急重启(emergency reboot),这将导致当前运行的所有进程被突然中断,可能会丢失未保存的工作,并可能导致数据损坏或其他系统问题。
不要在生产环境中执行此命令,因为它将立即重启操作系统,没有预警!!!
在执行此命令之前,请确保已经通知所有用户并安排在维护窗口期间进行!!!
确保所有关键任务都已经完成或保存,以避免数据丢失!!!

以下步骤会强制生成一个dump,这个命令会导致操作系统会重启!!!

$ echo c > /proc/sysrq-trigger

4. 分析kdump文件

Linux 提供了多种工具来分析内存转储文件,如 gdb、crash等。
在开始分析之前,请确保您具备正确的内核调试符号和崩溃转储文件。
不同的分析工具会提供不同的功能。但都会提供系统崩溃的日志和报告,包括栈跟踪、内存使用情况、进程状态等信息。通过分析转储文件,可以诊断导致系统崩溃的原因,如硬件故障、驱动问题、内核错误等。
每种工具都有其独特的功能和命令,了解并利用这些特性可以更有效地分析问题。
分析时,首先从崩溃的调用栈和寄存器状态入手,这通常是最直接的线索。
必要时可以通过反汇编和源代码查看,理解崩溃发生时的代码逻辑和执行流程。
要注意内核日志和其他系统信息可以提供崩溃前后的上下文,有助于诊断问题。
通过这些步骤和方法,您可以对内核转储文件进行深入分析,以确定崩溃的原因并采取相应的修复措施。

更多内容请参见本系列其他文章

<<Linux诊断和故障排除系列(一) -- 修复启动分区>>
<<Linux诊断和故障排除系列(二) -- 修复内核服务>>
<<Linux诊断和故障排除系列(三) -- 重置root密码>>
<<Linux诊断和故障排除系列(四) -- 修复文件系统>>
<<Linux诊断和故障排除系列(五) -- 修复iSCSI>>
<<Linux诊断和故障排除系列(六) -- 修复软件包及管理器>>
<<Linux诊断和故障排除系列(七) -- 应用程序诊断>>
<<Linux诊断和故障排除系列(八) -- 网络问题诊断>>
<<Linux诊断和故障排除系列(九) -- 身份验证和授权问题诊断>>
<<Linux诊断和故障排除系列(十) -- 硬件问题日志>>
<<Linux诊断和故障排除系列(十一) -- dump设置和分析>>
<<Linux诊断和故障排除系列(十二) -- 日志持久化和转发>>
<<Linux诊断和故障排除系列(十三) -- 官方支持数据sos_report及其分析可视化软件>>

本文内容为原创,如需转载,请务必注明原文出处。
更多相关内容,欢迎访问我的个人网站:hongxu.wang。
我们还提供免费的技术支持,欢迎与我们联系。

Index
滚动至顶部