Linux Kernel Core dump是一种在Linux内核崩溃时收集系统状态的机制。它会生成一个包含内核崩溃时的内存快照的文件,这个文件可以用于后续的调试和分析,以确定崩溃的原因。
以下是生成和分析Kernel Core Dump的基本步骤:
- 配置kdump :kdump是Linux内核的一个功能,它在内核崩溃时生成Kernel Core Dump。要使用kdump,你需要在系统启动时为崩溃内核分配一些内存。这可以在GRUB的配置文件中设置。
详见后面章节
。 - 触发Kernel Core Dump :在某些情况下,你可能需要手动触发内核崩溃以生成Kernel Core Dump。这可以通过发送一个特殊的系统调用或写入/proc/sysrq-trigger文件来实现。
详见后面章节
。 - 收集Kernel Core Dump :当内核崩溃时,kdump会将内核的内存快照写入一个文件,通常是/var/crash目录下的一个文件。这个文件就是Kernel Core Dump。
详见后面章节
。 - 分析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