Kernel Core Dump 的配置与常见问题

Linux Kernel Core dump是一种在Linux内核崩溃时收集系统状态的机制。它会生成一个包含内核崩溃时的内存快照的文件,这个文件可以用于后续的调试和分析,以确定崩溃的原因。

以下是生成和分析Kernel Core Dump的基本步骤:

  1. 配置kdump :kdump是Linux内核的一个功能,它在内核崩溃时生成Kernel Core Dump。要使用kdump,你需要在系统启动时为崩溃内核分配一些内存。这可以在GRUB的配置文件中设置。详见后面章节
  2. 触发Kernel Core Dump :在某些情况下,你可能需要手动触发内核崩溃以生成Kernel Core Dump。这可以通过发送一个特殊的系统调用或写入/proc/sysrq-trigger文件来实现。详见后面章节
  3. 收集Kernel Core Dump :当内核崩溃时,kdump会将内核的内存快照写入一个文件,通常是/var/crash目录下的一个文件。这个文件就是Kernel Core Dump。详见后面章节
  4. 分析Kernel Core Dump :你可以使用crash工具来分析Kernel Core Dump。crash工具可以读取Kernel Core Dump文件,并提供一个交互式的命令行界面,你可以在这个界面中执行各种命令来查看崩溃时的系统状态。详见后面章节

请注意,生成和分析Kernel Core Dump需要具有root权限。此外,Kernel Core Dump通常非常大,因此你需要确保有足够的磁盘空间来存储它。

下面以SUSE SLES 15为例来说明如何处理Kernel core dump 相关的问题。

安装Kdump

sudo zypper install kdump

配置 kdump

配置 kdump:以 root 权限打开文件 /etc/sysconfig/kdump。例如,你可以使用 sudo vi /etc/sysconfig/kdump。在此文件中,确保 KDUMP_KERNELVER 设置被注释掉或设置为 "",并且 KDUMP_DUMPFORMAT 设置为 compressed。

分配内存:在同一文件中,将 KDUMP_FREE_DISK_SIZE 设置为写入转储后应保留的空闲磁盘空间(以 MiB 为单位)。另外,将 KDUMP_CRASH_KERNEL 设置为为崩溃内核保留的内存量。例如,你可以将其设置为 256M。

启用并启动 kdump 服务 启用并启动 kdump 服务:使用以下命令启用并启动 kdump 服务:

sudo systemctl enable kdump.service

sudo systemctl start kdump.service

触发core dump

触发Kernel Core Dump:这应该谨慎进行,因为它会导致系统崩溃并重新启动。触发内核崩溃的常见方法是使用 SysRq 触发器。首先,使用命令 echo 1 | sudo tee /proc/sys/kernel/sysrq 启用触发器。然后,使用命令 echo c | sudo tee /proc/sysrq-trigger 触发崩溃。

系统重新启动后,你应该在 /var/crash/ 目录中找到Kernel Core Dump。你可以使用 crash 实用程序或支持Kernel Core Dump的其他调试器进行分析。

分析Core Dump文件

使用下面的crash命令来分析Kernel core dump:

crash /usr/lib/debug/boot/vmlinux-$(uname -r) /path/to/dumpfile

  • bt: Display a backtrace of all active tasks.
  • ps: Display status of each process.
  • log: Display the kernel log buffer.
  • files: Show open files for a task.
  • vm: Display virtual memory layout.

注意

请注意,这些指令适用于 SLES 15。具体步骤可能会根据你的具体配置有所不同。在触发内核崩溃之前,一定要备份所有重要数据。

常见问题

未生成Kernel Core Dump

如果你已触发Kernel Core Dump,但在磁盘上找不到它,可能有几个原因:

  • 为 kdump 保留的内存不足: 如果为崩溃内核保留的内存不足,kdump 可能无法捕获Kernel Core Dump。你可以在 /etc/sysconfig/kdump 文件中检查保留的内存。KDUMP_CRASH_KERNEL 设置应设置为足够的值(例如,256M)。

  • kdump 服务未运行: 如果在崩溃发生时 kdump 服务未运行,它将无法捕获Kernel Core Dump。你可以使用命令 systemctl status kdump.service 检查 kdump 服务的状态。如果它没有运行,你可以使用 systemctl start kdump.service 启动它。

  • 磁盘空间不足: 如果系统上没有足够的空闲磁盘空间,kdump 可能无法将Kernel Core Dump写入磁盘。你可以使用命令 df -h 检查你的磁盘空间。

  • 配置错误: 如果 kdump 配置错误,它可能无法捕获Kernel Core Dump储。你可以在 /etc/sysconfig/kdump 文件中检查配置。

要解决问题,你应该检查每个可能的原因,并纠正你发现的任何问题。如果在检查这些事情后仍无法捕获Kernel Core Dump,可能存在更复杂的问题,你可能需要寻求进一步的帮助。

无法调试Kernel Core Dump

下面是分析kernel Core Dump文件时遇到的错误信息

crash: /usr/lib/debug/boot/vmlinux-5.14.21-150400.24.60-default.debug: 没有 .gnu_debuglink 部分

crash: /usr/lib/debug/boot/vmlinux-5.14.21-150400.24.60-default.debug: 没有文本和数据内容

crash: 在这种情况下提供的名称列表参数是一个 debuginfo 文件,必须伴随着从其派生的内核文件。

错误消息表明 crash 工具无法在 vmlinux 文件中找到必要的调试信息。这可能是由于内核 debuginfo 文件和实际运行的内核之间的不匹配。

要分析Kernel Core Dump,你需要运行内核的 vmlinux 文件和相应的 debuginfo 文件。vmlinux 文件包含内核可执行代码,而 debuginfo 文件包含额外的调试信息,如函数名和行号。

以下是你可以解决这个问题的方法:

确保内核和内核 debuginfo 版本匹配。你可以用 uname -r 命令检查内核版本,并将其与内核 debuginfo 包的版本(rpm -q kernel-default-debuginfo)进行比较。

如果版本不匹配,你需要安装正确的内核 debuginfo 包。你可以用 zypper install kernel-default-debuginfo-$(uname -r) 命令来做这件事。

一旦安装了正确的 debuginfo 包,你应该能够用 crash 工具分析核心转储。命令可能如下所示:

crash /usr/lib/debug/boot/vmlinux-$(uname -r).gz /var/crash//vmcore

相关推荐
XY.散人9 分钟前
初识Linux · 文件(1)
linux·运维·服务器
bug菌22 分钟前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
叶北辰CHINA1 小时前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡
不惑_2 小时前
在 Ubuntu 安装 Python3.7(没有弯路)
linux·运维·ubuntu
夜月行者2 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
Yvemil72 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
sdg_advance2 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
猿java3 小时前
使用 Kafka面临的挑战
java·后端·kafka
碳苯3 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
玉树临风江流儿3 小时前
Linux驱动开发(速记版)--设备模型
linux·驱动开发