RHEL故障诊断4 - 根据 Kdump 转储文件分析内核崩溃原因

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 工具分析

  1. 打开 https://access.redhat.com/labs/kerneloopsanalyzer/ 页面。
  2. 在 Option 1: File Input 中提供 vmcore-dmesg.txt 文件,然后点击 Detect。
  3. 在 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。

  1. 先安装 crash 工具。
$ yum install crash
  1. 再根据 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
  1. 然后安装特定版本的 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 文件相关命令

  1. 运行 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>
  1. 使用 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
  1. 在以上子命令中常用的有:
子命令说明
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值