Kdump简单介绍

什么是Kdump?

Kdump是在系统崩溃、死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。在第一kernel在运行的时候,系统内部在内存中就已经留存好了给第二kernel(捕获内核)的预留空间(这个预留空间的大小可以自己设定)。在第一kernelcrash的时候,就会进入第二kernel,在第二kernel中执行用户态程序makedumpfile对第一kernel的内存镜像进行裁剪和压缩,最后将第一kernel的vmcore保留在磁盘中并重启。

vmcore分析

对vmcore的分析是分析机器宕机原因的一个十分重要的手段。要分析vmcore,我们现在采用的主要就是crash的分析。在安装了crash以后,我们还需要安装相应的debuginfo等带有符号信息的vmlinx文件才能调试相应的vmcore。

一般我们可以通过安装kernel-debuginfo-common-$(uname -r)相应的包来完成相应文件的安装。但是需要注意的是,我们需要安装kernel-debuginfo-common以及kernel-debuginfo这两个包,而kernel-debuginfo又是依赖于kernel-debuginfo-common的。

但是除了安装上面的包以外,还有一种方法就是自己通过编译源码来获取vmlinux。

而kdump的主要流程如下:

下面我将会从系统开始的过程来介绍一下kdump的整体过程的:

系统启动阶段

在系统启动的时候,会调用start_kernel这个函数。这个函数就是启动kernel的入口。在系统的启动阶段,这个时候会调用reverse_crashkernel这个函数对crash kernle预留内存。其中,预留内存是根据cmdline给的参数来进行预留的。cmdline中根据crashkernel=Y@X来进行预留的。


crashkernel=Y@X : Y是预留内存的大小;X是偏移。 当机器的内存小于8G的时候,一般不预留;当机器的内存大于8G小于16G的时候,预留125M;当机器的内存大于16G的时候,预留512M

启动kdump服务阶段

在启动kdump服务阶段,这个时候系统已经启动了,systemd在把各项的服务给拉起来。这个时候,systemd会启动kudmp服务。【在kdump的脚本里面有具体的过程】

在启动kdump服务的时候,会按照配置将crash kernel的镜像以及initramfs给加载到预留内存中。


当然,在我们对kdump.conf文件进行了修改以后,我们是需要重启kdump服务来将修改生效的。那么为什么我们需要重启才能生效呢?现在给大家讲一下: 首先,我们知道了我们的normal kernel和crash kernel是隔离的,所有的信息都是需要通过elfcore header(在前面的主要流程里面我漏了elfcorehdr的准备。。。)以及vmcore等信息传递的。那么在修改了配置以后,我们通过命令 touch -m /bin/kdump.conf(这里的具体路径我记得不是很清楚了) 通过touch配置文件,可以更改kdump配置文件的修改时间 然后通过命令:systemctl restart kdump 重启kudmp服务 在源码中,kdump是通过判断配置文件的修改时间来确定是不是修改的,我们这里touch了配置文件,在重启的时候kdump就会重新打包,然后将新包给加载到预留内存中了。

系统崩溃阶段

当系统崩溃的时候,系统会调用panic函数,在这里完成到crash kernel的跳转操作。

下面的代码就是在源码kernel/panic.c文件中的panic函数的部分

其实真正的跳转的函数在__crash_kexec里面的,让我们来看看__crash_kexec这个函数的乾坤吧:

在这个函数里面,主要讲讲的就是machine_kexec:

进入这个函数,在x86的机器下,会执行一个叫做relocate_kernel的函数,这个函数就是执行一个.S文件 (这是一个汇编代码),在这里完成跳转到crash kernel的工作。但是如果这一系列操作出现了错误,导致了跳转到crash kernel出现了错误的时候,在panic函数里面就会执行emergency_restart直接重启到normal kernel。

触发panic的方法

在一般情况下我们向触发panic的时候有一个简单的方法:那就是通过下面的命令:


echo c > /proc/sysrq-trigger

这个命令往sysrq-trigger中写入一个c。那么为什么为这个proc节点写入c就会导致宕机呢?

在sysrq-trigger中,当我们往里面echo c以后,这个节点会首先判断你输入的字符是什么,然后判断这个字符是什么,如果这个字符是c的话,那么就会执行panic的一个处理器(handler),在这个处理器中就会调用panic()函数。(这下知道了为啥这个可以触发宕机了吧。。)

/proc/kcore 与 /proc/vmcore

/proc/kcore 与 /proc/vmcore都是系统内存的镜像。那么他们都啥区别呢?

其中,/proc/kcore是normal kernel可见的,在crash kernel中不存在;在crash kernel中只有/proc/vmcore存在。

在系统启动的时候,会判断commandline中有没有参数 elfcorehdr=。在启动阶段,都会调用函数__init_vmcore函数,但是在这个函数里面会判断这次启动的内核是不是crash kernel,判断的方法及时通过判断elfcorehdr是否存在,以及这个elfcorehdr在不在一个合法的范围里面。如果通过了检查,这个时候就会调用proc_create创建/proc/vmcore这个节点,否则就不创建了。

vmcore的转储

在进入了crash kernel以后,就会开始使用makedumpfile对vmcore进行裁剪压缩。

在makedumpfile中,有lzo,snappy,zlib这三种的压缩方式,按照配置,对/proc/vmcore进行裁剪和压缩,过程会写到一个叫做vmcore-incomplete的文件中。

当完成了所有的操作了以后,就会调用命令:


mv vmcore-incomplete vmcore

然后调用reboot 重启到normal kernel

kdump的更多相关文章

  1. 手动添加kdump

    背景:     Linux嵌入式设备内核挂死后,无法自动重启,需要手动重启.而且如果当时没有连串口的话,就无法记录内核挂死时的堆栈,所以需要添加一种方式来记录内核挂死信息方便以后调试使用.设备中增加k ...

  2. centos 7 系统服务auditd kdump tuned irqbalance

    tuned是红帽推出的一个动态调优方案,用户可以在不同的时间段内采用不同的调优方案.由于以服务进程形式存在,就可以很方便的和crontab结合!Tuned 是监控并收集各个系统组件用量数据的守护进程, ...

  3. kdump failed

    kdump  是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump 使用 kexec 启动到第二个内核. 第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像.第一个内核保留 ...

  4. linux 3.10的kdump配置的小坑

    之前在2.6系列linux内核中,当发现某个模块不要在保留内核中加载的时候,可以通过blacklist参数将其在/etc/kdump.conf中屏蔽 blacklist <list of ker ...

  5. 内核调试工具 — kdump & crash

    kdump简介 kdump是系统崩溃的时候,用来转储运行内存的一个工具. 系统一旦崩溃,内核就没法正常工作了,这个时候将由kdump提供一个用于捕获当前运行信息的内核, 该内核会将此时内存中的所有运行 ...

  6. Centos7/RHEL7 开启kdump

    Kdump是一种基于kexec的Linux内核崩溃捕获机制,简单来说系统启动时会预留一块内存,当系统崩溃调用命令kexec(kdump kernel)在预留的内存中启动kdump内核, 该内核会将此时 ...

  7. kdump简单的介绍

    kdump是2.6.16之后,内核引入的一种新的内核崩溃现场信息收集工具.当一个内核崩溃后(我们称之为panic),内核会使用kexec(类似于进程的exec,把当前内核换掉)进入到一个干净的备份内核 ...

  8. Linux内核调试:kdump、vmcore、crash、kernel-debuginfo【转】

    转自:https://blog.csdn.net/guowenyan001/article/details/19807555 一.简介 linux内核发送崩溃时,kdump会生成一个内核转储文件vmc ...

  9. CentOS 6.4中升级编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 以及Kdump配置

    在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 今天在isocpp上看到"GCC 4.8.1 released, C++11 feature ...

  10. kdump内核转储

    目录 CentOS 7.5 配置Kdump 安装Kdump 安装Kdump图形化 配置保留内存 配置kdump类型 核心转储到本地 核心转储到设备 使用NFS指定核心转储 使用SSH指定核心转储 配置 ...

随机推荐

  1. 如何让SQL Server像MySQL一样拥有慢查询日志(Slow Query Log慢日志)

    如何让SQL Server像MySQL一样拥有慢查询日志(Slow Query Log慢日志) SQL Server一直以来被人诟病的一个问题是缺少了像MySQL的慢日志功能,程序员和运维无法知道数据 ...

  2. adb shell 批处理文件

    adb shell 批处理文件 手机截屏,并把图片传到电脑

  3. 【Kotlin】官网学习笔记

    0.IDEA环境设置: 1.基础语法 BasicSyntax 地址:https://kotlinlang.org/docs/basic-syntax.html 一.方法与变量 可以直接编写main方法 ...

  4. 【爬虫】Java爬取KFC全国门店信息

    官网地址: http://www.kfc.com.cn/kfccda/storelist/index.aspx 基础库 <dependencies> <dependency> ...

  5. Java IO流的简单使用 通俗易懂 超详细 【内含案例】

    IO流简单使用 InputStream 字节输入流 OutputStream 字节输出流 Reader 字符输入流 Writer 字符输出流 代码示例 输入和输出是相对于程序来说的,读取到程序中叫做输 ...

  6. SMU Summer 2024 Contest Round 4

    SMU Summer 2024 Contest Round 4 Made Up 题意 给你三个序列 \(A,B,C\) ,问你满足 \(A_i = B_{C_j}\) 的 \((i,j)\) 对有多少 ...

  7. SMU Summer 2023 Contest Round 13

    SMU Summer 2023 Contest Round 13 A. Review Site 我们总是可以把差评放到另一个服务器,好评和中立放另一个,这样最多投票数就是好评与中立数 #include ...

  8. 牛客周赛 Round 7

    牛客周赛 Round 7 A-游游的you矩阵_牛客周赛 Round 7 (nowcoder.com) 把四种字符凑一起看看有没有\(y,o,u\)就行 #include <bits/stdc+ ...

  9. 微服务全链路跟踪:grpc集成zipkin

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  10. Docker不同宿主机网络打通

    本方式使用docker Swarm集群的方式创建overlay 网络进行打通 背景 因java微服务使用nacos做配置中心,为了解决Nacos服务注册使用Docker容器内网ip问题,使用此方案 前 ...