《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文针对 Linux 的版本为 RHEL 8。
文章目录
kdump 是一种提供崩溃转储机制的服务,当系统出现崩溃后 kdump 可生 vmcore 转储文件。通过使用 crash 工具可分析 vmcore 文件中的内容以找到系统崩溃原因。
内核崩溃生成的文件
系统崩溃后,kdump 服务会在转储文件(vmcore) 中捕获内核内存,并生成额外的诊断文件,以帮助故障排除和事后分析。
kdump 生成的文件主要有:
- vmcore
- vmcore-dmesg.txt
- kexec-dmesg.log - 包含了使用 kexec 功能加载新内核过程以及新内核启动时的详细信息。
vmcore 文件
vmcore 是系统崩溃时的内核转储文件,它包含了以下各种数据。由于其大小通常与系统物理内存大小相关,因此文件可能会非常大。
- 物理内存内容:系统崩溃时的所有物理内存数据。
- 进程列表:崩溃时所有进程的信息。
- CPU寄存器状态:
- 设备状态:硬件设备的寄存器和状态信息。
- 缓存数据:文件系统缓存中的数据,可能包含未写入磁盘的文件内容。
- 网络连接:网络套接字和连接状态、网络协议栈的缓冲区内容。
- 内核模块:已加载内核模块的信息和状态。
- 虚拟内存映射:进程的虚拟内存布局。
- 崩溃信息:导致崩溃的错误类型和位置。
vmcore-dmesg.txt 文件
vmcore-dmesg.txt 文件记录了内核消息缓冲区中所包含的和系统崩溃相关的重要信息。当系统发生内核崩溃时,该文件是分析崩溃原因的重要依据。
默认情况 vmcore-dmesg.txt 位于 /var/crash/ 目录中。文件包含的信息有以下几类:
- 崩溃前的内核消息:包括硬件设备的异常、内核模块的错误、系统调用的异常等信息,这些信息可以帮助定位导致崩溃的根本原因。
- 系统状态信息:例如 CPU 使用率、内存使用情况、设备驱动的状态等,这些信息可以帮助了解系统在崩溃前的运行状态。
- 错误堆栈信息:如果内核崩溃是由于代码错误导致的,vmcore-dmesg.txt 文件可能包含错误堆栈信息,指示出错的代码位置和调用路径。
分析内核崩溃原因
使用 Kernel Oops Analyzer 工具分析
- 打开 https://access.redhat.com/labs/kerneloopsanalyzer/ 页面。
- 在 Option 1: File Input 中提供 vmcore-dmesg.txt 文件,然后点击 Detect。
- 在 Detected Kernel Opps 区域可以看到分析出的 Kernel 相关错误原因。例如下图,提示故障是由 RHEL 8.4 的 4.18.0-305.el8.x86_64 内核引起的,并且可以根据解决方案的提示解决该问题。
用 crash 命令分析 vmcore 文件
crash、vmcore 和 vmlinux 的关系
在使用 crash 命令分析 vmcore 文件时需要用到 vmlinux,这主要与 vmlinux 文件的特性以及 crash 工具分析崩溃信息的原理有关。
vmcore 文件是内核崩溃时系统内存的快照,其中包含了大量的内存地址信息。但这些地址本身对于人类来说是难以理解的,需要将其转换为有意义的代码位置和变量名。
vmlinux 是未经压缩处理的内核可执行文件。vmlinux 包含了完整的内核符号表和调试信息,因为它们可以将内存中的地址映射到具体的内核代码位置、函数名和变量名,所以这些信息对于分析内核崩溃至关重要。
crash 工具利用 vmlinux 中的调试符号,将 vmcore 文件中的内存地址解析为具体的函数名、变量名和源代码行号,从而帮助分析人员快速定位问题所在。
安装 crash 工具及其用到的环境
需要注意的是在使用 crash 命令分析 vmcore 文件的时候,分析环境必须有与生成 vmcore 文件相同 kernel 版本的 vmlinux。
- 先安装 crash 工具。
$ yum install crash
- 再根据 https://access.redhat.com/solutions/9907 的说明为 RHEL 8 启用将用到的 repo。
$ subscription-manager repos --enable=rhel-8-for-$(uname -m)-baseos-debug-rpms --enable=rhel-8-for-$(uname -m)-appstream-debug-rpms
- 然后安装特定版本的 kernel-debuginfo 相关模块,模块将安装到 $(uname -r) 目录下。
$ yum install kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -m)-$(uname -r)
$ ls /usr/lib/debug/lib/modules/$(uname -r)
分析 vmcore 文件相关命令
- 运行 crash 工具,分析 vmcore 文件。注意:以下命令使用的 vmcore 文件是与 “使用 Kernel Oops Analyzer 工具分析” 章节中使用的 vmcore-dmesg.txt 文件对应。另外命令执行输出提示 PID 为 4098504 的进程导致了系统 PANIC。
$ crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcore
crash 8.0.4-2.el8
Copyright (C) 2002-2022 Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation
Copyright (C) 1999-2006 Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited
Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011, 2020-2022 NEC Corporation
Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
Copyright (C) 2015, 2021 VMware, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions. Enter "help copying" to see the conditions.
This program has absolutely no warranty. Enter "help warranty" for details.
GNU gdb (GDB) 10.2
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
KERNEL: /usr/lib/debug/lib/modules/4.18.0-305.el8.x86_64/vmlinux
DUMPFILE: vmcore [PARTIAL DUMP]
CPUS: 16
DATE: Wed Jan 15 09:43:01 CST 2025
UPTIME: 77 days, 11:00:23
LOAD AVERAGE: 1.08, 1.04, 1.05
TASKS: 1136
NODENAME: xxx-xxxx-xxxx
RELEASE: 4.18.0-305.el8.x86_64
VERSION: #1 SMP Thu Apr 29 08:54:30 EDT 2021
MACHINE: x86_64 (2793 Mhz)
MEMORY: 32 GB
PANIC: "kernel BUG at lib/list_debug.c:50!"
PID: 4098504
COMMAND: "kworker/13:2"
TASK: ffff9f40427d9e40 [THREAD_INFO: ffff9f40427d9e40]
CPU: 13
STATE: TASK_RUNNING (PANIC)
crash>
- 使用 help 子命令累出其他所有子命令,使用它们可对 vmcore 中包含的各类信息进行分析。
crash> help
* files mod sbitmapq union
alias foreach mount search vm
ascii fuser net set vtop
bpf gdb p sig waitq
bt help ps struct whatis
btop ipcs pte swap wr
dev irq ptob sym q
dis kmem ptov sys
eval list rd task
exit log repeat timer
extend mach runq tree
- 在以上子命令中常用的有:
子命令 | 说明 |
---|---|
log | 内核消息缓存,即 vmcore-dmesg.txt 中的内容 |
bt | 内核栈跟踪 |
files | 打开的文件信息 |
mount | 挂载信息 |
ps | 进程信息 |
vm | 虚拟内存信息 |
net | 网络信息 |
例如通过 bt 命令可以看到运行在 CPU:13 的进程 PID: 4098504 在执行 __list_del_entry_valid.cold.1 时出现了 invalid_op 提示。
crash> bt
PID: 4098504 TASK: ffff9f40427d9e40 CPU: 13 COMMAND: "kworker/13:2"
#0 [ffffafda13117bf0] machine_kexec at ffffffffb7c6156e
#1 [ffffafda13117c48] __crash_kexec at ffffffffb7d8f99d
#2 [ffffafda13117d10] crash_kexec at ffffffffb7d9088d
#3 [ffffafda13117d28] oops_end at ffffffffb7c2434d
#4 [ffffafda13117d48] do_trap at ffffffffb7c20b13
#5 [ffffafda13117d90] do_invalid_op at ffffffffb7c21476
#6 [ffffafda13117db0] invalid_op at ffffffffb8600d64
[exception RIP: __list_del_entry_valid.cold.1+69]
RIP: ffffffffb8091209 RSP: ffffafda13117e68 RFLAGS: 00010246
RAX: 000000000000004e RBX: ffff9f415c9fb090 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff9f41de1567c8 RDI: ffff9f41de1567c8
RBP: ffffffffb9426040 R8: 00000000000006d4 R9: 000000000000005f
R10: 3531346639666666 R11: 66202c6e6f697470 R12: ffff9f415c9fb000
R13: ffff9f3f775ed000 R14: ffff9f3fea1b0fc0 R15: ffff9f415c9fb098
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
#7 [ffffafda13117e60] __list_del_entry_valid.cold.1 at ffffffffb8091209
#8 [ffffafda13117e68] css_release_work_fn at ffffffffb7d96b0f
#9 [ffffafda13117e98] process_one_work at ffffffffb7cfe397
#10 [ffffafda13117ed8] worker_thread at ffffffffb7cfea60
#11 [ffffafda13117f10] kthread at ffffffffb7d04406
#12 [ffffafda13117f50] ret_from_fork at ffffffffb860023f
参考
https://access.redhat.com/labs/kerneloopsanalyzer/
https://access.redhat.com/solutions/9907
https://access.redhat.com/solutions/2121
https://access.redhat.com/solutions/6038
https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/9/html/managing_monitoring_and_updating_the_kernel/files-produced-by-kdump-after-system-crash_configuring-kdump-on-the-command-line