[monitor] 6. Linux kdump(系统临终快照)

1、kdump概念

前面讲过进程在崩溃的时候可以使用core dump功能存储一个快照,那么系统崩溃有没有类似的存储故障快照的功能呢?答案是肯定的,kdump可以实现。

kdump在系统崩溃的时候,另外起一个内核系统,这个新系统起来以后,把崩溃系统的内存信息和cpu信息等故障场景存储为一个快照文件。

kdump使用了两个内核系统,一个是正常运行的内核系统,一个是捕捉故障的内核系统,在运行的系统崩溃时转而启动捕捉系统,捕捉系统起来以后把已经崩溃的系统的故障场景保存起来。

这种两个系统的运行机制利用了系统的kexec机制。kexec机制允许系统在启动的时候保留一段内存给另外一个内核,在第一个内核启动以后,使用kexec_load()系统调用把第二个内核和文件系统加载到保留内存。在第一个系统故障时,不用重启,直接跳到第二个系统的内核中运行。

kdump巧妙的使用了kexec机制来实现系统故障的快照功能。当然实现类似功能的不仅仅有kdump,还有其他dump:

  • LKCD(Linux Kernel Crash Dump) 是 Linux 下第一个内核崩溃内存转储项目,它最初由 SGI 的工程师开发和维护。它提供了一种可靠的方法来发现、保存和检查系统的崩溃。LKCD 作为 Linux 内核的一个补丁,它一直以来都没有被接收进入内核的主线。目前该项目已经完全停止开发。
  • Diskdump 是另外一个内核崩溃内存转储的内核补丁,它由塔高 (Takao Indoh) 在 2004 年开发出来。与 LKCD 相比,Diskdump 更加简单。当系统崩溃时,Diskdump 对系统有完全的控制。为避免混乱,它首先关闭所有的中断;在 SMP 系统上,它还会把其他的 CPU 停掉。然后它校验它自己的代码,如果代码与初始化时不一样。它会认为它已经被破坏,并拒绝继续运行。然后 Diskdump 选择一个位置来存放内存转储。Diskdump 作为一个内核的补丁,也没有被接收进入内核的主线。在众多的发行版中,它也只得到了 RedHat 的支持。
  • Netdump。RedHat 在它的 Linux 高级服务器 2.1 的版本中,提供了它自己的第一个内核崩溃内存转储机制:Netdump。 与 LKCD 和 Diskdump 将内存转储保存在本地磁盘不同,当系统崩溃时,Netdump 将内存转储文件通过网络保存到远程机器中。RedHat 认为采用网络方式比采用磁盘保的方式要简单,因为当系统崩溃时,可以在没有中断的情况下使用网卡的论询模式来进行网络数据传送。同时,网络方式对内存转储文件提供了更好的管理支持。与 Diskdump 一样,Netdump 没有被接收进入内核的主线,目前也只有 RedHat 的发行版对 Netdump 提供支持。
  • Kdump 是一种基于 kexec 的内存转储工具,目前它已经被内核主线接收,成为了内核的一部分,它也由此获得了绝大多数 Linux 发行版的支持。与传统的内存转储机制不同不同,基于 Kdump 的系统工作的时候需要两个内核,一个称为系统内核,即系统正常工作时运行的内核;另外一个称为捕获内核,即正常内核崩溃时,用来进行内存转储的内核。 在本文稍后的内容中,将会介绍如何设置 kump。
  • MKdump(mini kernel dump) 是 NTT 数据和 VA Linux 开发另一个内核内存转储工具,它与 Kdump 类似,都是基于 kexec,都需要使用两个内核来工作。其中一个是系统内核;另外一个是 mini 内核,用来进行内存转储。与 Kdump 相比,它有以下特点:
    将内存保存到磁盘。
    可以将内存转储镜像转换到 lcrash 支持格式。
    通过 kexec 启动时,mini 内核覆盖第一个内核。

2、kdump的配置

2.1、软件包的安装

  • 1、 内核中已经支持kexec功能,需要安装用户态的kexec工具包和kdump工具包:

    1
    2

  • 2、调试需要的内核和文件系统:

最新的内核已经实现了可重定位内核的功能,就是说内核加载到任意地址都可以运行。第二份内核不需要使用新的内核和文件系统,直接使用原有系统的内核和文件系统。所以不需要提供额外的调试系统的内核和文件系统。

  • 3、解析kdump文件,需要安装crash解析工具和带调试信息的内核工具包kernel-debuginfo:

3

2.2、捕捉内核的保留内存

配置kdump功能,需要在系统启动的时候给第二个内核保留一段内存。这个动作通过修改grub传递给内核的参数中配置。以下是一个支持kdump保留内存的grub配置文件menu.lst:

4

2.3、加载捕捉内核

在安装完kdump工具包以后,系统自动启动了一个boot.kdump服务。

5

boot.kdump服务有对应的脚本在/etc/rc.d/boot.kdump,可以看到其主要功能就是调用/sbin/kexec加载捕捉内核和文件系统到保留内存中:

6
7

这个时候仅仅只是把第二份内核和文件系统加载到了内存,但是还没有运行。

2.4、启动捕捉内核

上一步把第二份内核加载到了内存,在第一份内核出现故障的时候就会启动第二份内核。我们查看内核的故障处理函数panic()和die()其中会调用crash_kexec()来启动第二份内核进行故障处理。

8

2.5、捕捉内核的动作

第二份内核启动以后,可以根据两种方式来保存第一份内核的系统信息:

  • 1、/proc/vmcore ELF 格式。kexec 在加载捕获内核时,会计算并生成一个 ELF 文件头。这个 ELF 头含有生产内核的内存位置等等一系列信息。这个 ELF 头连同其他信息一起保存在由 reserve_crashkernel() 保留的那段内存中。当崩溃发生时,此 ELF 头的位置会被传给捕获内核,由它生成 /proc/vmcore 以供 保存。
  • 2、/dev/oldmem raw 格式。captured kernel 启动后,还会用 raw 格式通过 /dev/oldmem 来提供生产内核的内存。用户态的工具可能要自己提取其中的 ELF header 以便得到 vmcore。但它的好处是可以只提取 vmcore 的一部分而不用 dump 出全部 vmcore。

最终捕捉内核会根据/etc/sysconfig/kdump文件中的配置生成一份vmcore快照文件到对应目录中。

3、kdump的使用

使用kdump功能,首先必须确保上一节提到的工具包都已经安装,kdump的服务也已经启动。

3.1、触发panic

使用魔术键功能来模拟一次系统崩溃。

  • 1、 使能魔术键:
echo 1 > /proc/sys/kernel/sysrq

-2、使用“c”命令触发一次系统crash:

echo c > /proc/sysrq-trigger

3.2、得到vmcore

系统kdump完成重启以后,根据/etc/sysconfig/kdump文件中的配置可以在对应目录得到一份vmcore文件。

一般的目录下/var/crash或者/var/log/dump下:

9

3.3、使用crash分析

得到vmcore文件以后,需要使用crash工具来分析当时的系统故障场景。分析还需要用到带调试信息的内核,由kernel-debuginfo工具包安装的。

kernel-debuginfo工具包不太好找,不得已自己用源码编译了一个,记得使能”Kernel hacking.”=>”Compile the kernel with debug info” ,.config文件中“CONFIG_DEBUG_INFO=Y”被配置,保证编译出的内核带有调试符号。

使用“crash vmlinux vmcore”命令来调试文件:

10

使用bt命令来查看调用栈:

11

Crash命令和gdb类似,可以使用相同风格的名林来对转储文件进行分析。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,根据kdump信息快速定位问题的方法可以分为以下几步: 1. 分析转储文件:首先,使用crash工具加载转储文件。在crash命令行中输入"crash <转储文件路径>",然后使用"bt"命令查看堆栈信息。堆栈信息可以告诉你问题发生在哪个函数或模块中。 2. 查看关键日志:在转储文件中,你可以使用"log"命令查看内核日志。关注与问题发生时间相关的日志,特别是错误、警告或异常信息。这些日志可以提供有关问题的更多上下文和线索。 3. 检查内核参数:使用"sysctl"命令或查看/proc/sys/目录下的文件,检查系统的内核参数配置。某些问题可能与内核参数设置不当相关。 4. 检查硬件相关问题:如果问题涉及硬件,例如驱动程序或设备故障,你可以通过检查系统日志(如dmesg)和/sys/目录中的设备文件来获取更多信息。 5. 观察系统状态:使用top、vmstat、iostat等工具观察系统的CPU、内存、磁盘等资源使用情况。这有助于确定是否存在资源瓶颈或异常情况。 6. 调试代码:如果以上方法还不能确定问题的根本原因,可能需要使用调试器(如gdb)来对问题进行更详细的分析。通过在关键函数处设置断点,可以逐步跟踪和调试代码,找到问题所在。 以上是一些常用的方法,可以帮助你快速根据kdump信息定位问题所在。根据具体情况,你可能需要结合其他工具和技术进行更深入的分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值