Linux内核转储---kdump原理梳理

news2025/4/12 15:03:27

文章目录

    • Kexec和Kdump设计的区别
      • kexec
      • kdump
    • Kdump的执行流程
    • kexec的实现
      • 用户空间kexec
      • 内核空间
    • vmcore

Kdump的实现可以分为两部分:内核和用户工具。内核提供机制,用户工具在这些机制上实现各种转储策略,内核机制对用户工具的接口是一个系统调用:kexec_load(),其被用来加载捕获内核和传递一些相关信息。
Kdump是一种先进的基于kexec的内核转储机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。当内核产生错误(系统崩溃、死锁或者死机)时,kdump会将内存导出为vmcore保存到磁盘。
Kdump是kexec机制工作的,kexec是一个快速启动机制,允许通过已经运行的内核的上下文启动一个Linux内核,不需要经过BIOS。

Kexec和Kdump设计的区别

kexec

Kexec的设计是用新内核去覆盖原内核位置,Kexec的实现包括两部分:

  • 一是内核空间的系统调用:kexec_load(),负责在生产内核(first kernel)启动时将捕获内核(capture kernel)加载到指定地址。
  • 二是用户空间的工具kexec-tools,他将捕获内核的地址传递给生产内核,从而在系统崩溃的时候能够找到捕获内核的地址并运行。没有kexec就没有kdump。先有kexec实现了在一个内核中可以启动另一个内核,才让kdump有了用武之地。
  • 内核空间:kexec_load()
  • kexec 在 kernel 里以一个系统调用 kexec_load()的形式提供给用户。这个系统调用主要用来把另一个内核和其 ramdisk 加载到当前内核中。在 kdump中,捕获内核只能使用事先预留的一小段内存。生产内核的内存镜像会被以 /proc/vmcore 的形式提供给用户。这是一个 ELF格式的文件,它的头是由用户空间工具 kexec 生成并传递来的。在系统崩溃时,系统最后会调用machine_kexec()。这通常是一个硬件相关的函数。它会引导捕获内核,从而完成 kdump 的过程。
    用户空间:kexec_tools
  • kdump 的很大一部分工作都是在用户空间内完成的。与 kexec相关的集中在一个叫“kexec-tools”的工具中的“kexec”程序中。该程序主要是为调用 kexec_load()收集各种信息,然后调用之。这些信息主要包括 purgatory 的入口地址,还有一组由 struct kexec_segment描述的信息。
    Kexec设计原理图如下:
    在这里插入图片描述

kdump

  • kdump机制的实现需要两个不同目的的内核,生产内核和捕获内核。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的ramdisk一起组建一个微环境,用以对生产内核下的内存进行收集和转存。
  • 第一个内核保留了内存的一部分给第二内核启动用。由于kdump利用kexec启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。
  • 为了在生产内核崩溃时能顺利启动捕获内核,捕获内核以及它的ramdisk是事先放到生产内核的内存中的。
  • 生产内核的内存是通过/proc/vmcore这个文件交给捕获内核的。为了生成它,用户工具在生产内核中分析出内存的使用和分布等情况,然后把这些信息综合起来生成一个ELF头文件保存起来。捕获内核被引导时会被同时传递这个ELF文件头的地址,通过分析它,捕获内核就可以生成出/proc/vmcore。有了/proc/vmcore这个文件,捕获内核的ramdisk中的脚本就可以通过通常的文件读写和网络来实现各种策略了。
  • Kdump的设计是预留一块内存来加载第二个内核(和相关数据),发送Crash后第二个内核在原位置运行(不然就达不到相关目的了),收集第一个内核的相关内存信息。
    kudmp的设计原理图:
    在这里插入图片描述
  • 捕获内核运行所需的内存一开始就被保留,在系统内核崩溃时被加载也不会影响系统内核本身的内存。并且在由于崩溃引起的重起中,新内核只会用到很少的内存,比如仅仅 16 兆字节,剩下的内存不会被用到,可以转储出来。
  • 新内核被启动后,转储过程的下一个阶段是提供写转储文件到目标设备的接口。在新内核中,有两个部分来获取要转储的内容。第一个部分用来处理内存被对待的方式,第二个部分用来处理用户空间怎样获取转储文件。第一部分被设计成把新内核未用的内存(前面出问题的内核的)当成高端内存设备。本质上,在第二次启动中,系统等价于一个有很大数值的高端内存的机器。在转储的过程中,在这个区域的页被映射成一个页表项,用这种方式去读要转储的内容的话,转储文件会被抽象成在/proc 下的一个文件,比如/proc/vmcore。用户
    仅仅需要像拷贝一个通常的文件一样拷贝转储文件。相似的,/proc/vmcore 也将对内核页转储起同样的作用。这个方法的另一个好处是转储文件会被自动存成 ELF格式,像 gdb 和 crash 等工具能够被直接用来分析转储出来的文件。

Kdump的执行流程

Kdump的执行流程如下图所示:
在这里插入图片描述
基本流程为:

  1. First kernel(生产内核)正常运行;
  2. 运行过程中,系统出现异常(也可以是模拟通过sysrq触发panic);
  3. 在系统崩溃时,系统最后会调用 machine_kexec(),触发并启动Sencond kernel(捕获内核),传递ELF头文件的地址;
  4. 捕获内核与相应的ramdisk一起组建一个微环境,获取ELF头文件的地址,并生成出/proc/vmcore文件;
  5. 捕获内核的ramdisk中的脚本开始执行,将/proc/vmcore文件中的数据通过文件读写和网络来实现对生产内核下的内存进行收集和转存;
  6. 通过gdb、crash等工具,对收集到的vmcore文件镜像分析。

kexec的实现

Kexec的实现包括用户空间和内核空间。

用户空间kexec

本质上是一个系统调用,主要做的事情有:

  1. 获取reserved内存块,读取/proc/iomem中Crash kernel字段的信息
    在这里插入图片描述
  2. 把指定的内核放到自己定义的变量中,名字为struct kexec_info,包含代码段和加载地址,还有其他信息,如设备树、启动参数cmdline等。指定的加载地址空间来自reserved内存块。
  3. 设置vmcore的生成开关—elfcorehdr。

内核空间

内核层会完成kexec_info接收,设置新内核实体。
Kexec会陷入系统调用:

SYSCALL_DEFINE4(kexec_load,unsigned long,entry,unsigned long,nr_segments,struct kexec_segment __user *,segments,unsigned long,flags)

在这里插入图片描述
其主函数为:do_kexec_load::

static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
        struct kexec_segment __user *segments, unsigned long flags)
{
    struct kimage **dest_image, *image;
    unsigned long i;
    int ret;

    if (flags & KEXEC_ON_CRASH) {
        //新内核 kexec_crash_image
        dest_image = &kexec_crash_image;  
        if (kexec_crash_image)
            arch_kexec_unprotect_crashkres();
    } else {
        dest_image = &kexec_image;
    }
    if (nr_segments == 0) {
        /* Uninstall image */
//卸载内核
        kimage_free(xchg(dest_image, NULL));
        return 0;
    }
    if (flags & KEXEC_ON_CRASH) {
        //清除新内核内容
        kimage_free(xchg(&kexec_crash_image, NULL));
    }
    //将kexec_info 读进来,存到image中
    ret = kimage_alloc_init(&image, entry, nr_segments, segments, flags);
    if (ret)
        return ret;
    if (flags & KEXEC_PRESERVE_CONTEXT)
        image->preserve_context = 1;
    ret = machine_kexec_prepare(image);
    if (ret)
        goto out;
    ret = kimage_crash_copy_vmcoreinfo(image);
    if (ret)
        goto out;
    //将各个段存到指定的加载地址,使用kmap,本质上就是从加载地址获取一个page,转为地址,然后存到该地址
    //如果预留内存不足,返回-ENOMEM
    for (i = 0; i < nr_segments; i++) {
        ret = kimage_load_segment(image, &image->segment[i]);
        if (ret)
            goto out;
    }
    kimage_terminate(image);
    /* Install the new kernel and uninstall the old */
    //安装新内核并卸载老内核
    image = xchg(dest_image, image);
out:
    if ((flags & KEXEC_ON_CRASH) && kexec_crash_image)
        arch_kexec_protect_crashkres();
    kimage_free(image);
    return ret;
}

各个段的存放地址是在reserved中…
Panic后会加载新内核:__crash_kexec:

在这里插入图片描述
读取新内核信息,然后热重启,重启与架构有关。Arm64会执行cpu_soft_restart,然后调用到汇编。

vmcore

Vmcore的生成是initcall函数自动完成的:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为HCIE学习之Openstack Nova组件

文章目录一、openstack组成形式二、Nova的模块1、Nova-api功能2、Nova-scheduler功能3、Nova-conductor功能4、Nova-novncproxy5、Nova-compute三、nova中的一些概念 一、openstack组成形式 openstack由一个个组件组成&#xff0c;每个组件由一个个模块组成。 二、Nova的模块…

mac上安装redis的两种方法

mac上安装redis的两种方法1. 安装方式1->使用homebrew安装redis1.1 安装redis1.1.1 安装homebrew1.1.2 查看redis安装目录1.2 安装等简单命令1.3 启动等相关命令1.3.1 使用brew命令启动1.3.2 redis-cli连接redis服务1.3.3 使用配置文件启动1.42. 安装方式2->官网下载安装…

Spring Cloud之Zuul

目录 简介 Zuul中的过滤器 过滤器的执行流程 使用过滤器 route过滤器的默认三种配置 路由到服务 路由到url地址 转发给自己 自定义过滤器 简介 Zuul是Netflix开源的微服务网关&#xff0c;主要功能是路由转发和过滤器&#xff0c;其原理也是一系列filters&#xff0…

图文解说S参数(进阶篇)

S参数是RF工程师/SI工程师必须掌握的内容&#xff0c;业界已有多位大师写过关于S参数的文章&#xff0c;即便如此&#xff0c;在相关领域打滚多年的人&#xff0c; 可能还是会被一些问题困扰着。你懂S参数吗? 图文解说S参数&#xff08;基础篇&#xff09; 请继续往下看...台湾…

数据结构(三):集合、字典、哈希表

数据结构&#xff08;三&#xff09;一、集合&#xff08;Set&#xff09;1.封装一个集合类2.集合常见的操作&#xff08;1&#xff09;并集&#xff08;2&#xff09;交集&#xff08;3&#xff09;差集&#xff08;4&#xff09;子集二、字典&#xff08;Map&#xff09;三、…

Powershell Install SQL Server 2022

前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…

nginx如何用html显示多个图片并加入播放链接

需求背景通过nginx来做个点播服务&#xff0c;ffmpeg截取视频中的某一帧作为视频的封面&#xff0c;前端页面展示这个封面&#xff0c;&#xff0c;并链接到对应的视频播放链接&#xff0c;加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…

HashedWheelTimer

序言这种算法是一种轮询算法的优化升级,能够以只有一个Timer的情况下处理大量的定时任务.Begin结合HashedWheelTimer的思想根据自然时间1分钟为例,来做大批量的定时任务触发首先定一个长度为60的数组,数组中存放的是Set集合,集合里面是任务详情.当有定时任务刚来的时候判断是否…

死锁检测组件 -- 使用hook检测死锁

目录 hook hook是什么 dlsym()函数 hook的实现步骤 加入hook的demo C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 hook hook可以把系统或第三方库提供的函数&#xff0c;替换成我们写的同名函数。会调用我们实现的函数。 hook是什么 hook提供了两…

07-Java异常分类以及处理机制

1.异常概念 Java标准库内建了一些通用的异常&#xff0c;这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。 1.错误&#xff1a;是程序无法处理的错误&#xff0c;表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关&#xff0c;而表示…

企业电子招采系统源码——信息数智化招采系统

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…

Centos7.9安装GitLab

1、下载 Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载最新版本gitlab-ce-15.4.2-ce.0.el7.x86_64 2、安装基础依赖并启动 #安装依赖 yum install -y curl policycoreutils-python openssh-server postfix #配置开机启动 sys…

APP测试面试题汇总基础+进阶

目录 一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f; 2、APP测试需要提前准备哪些测试资源&#xff1f; 3、APP测试和Web测试的区别&#xff1f; 1.系统结构方面 2.性能方面 3.兼容性方面 4、相对于 Wed 项目&#xff0c;APP有专项测试 5、Android手机和…

七种方式实现高并发秒杀

新建skill模块 pom依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId>…

@Intercepts为基础实现数据完整性保护

本文以Intercepts为基础&#xff0c;通过拦截器的方式拦截数据库操作包括query、insert、update、delete操作对数据的完整性保护。Intercepts是mybatis中的一个常用拦截器注解&#xff0c;表明当前对象是一个拦截器&#xff0c;当前类通过implements Interceptor实现Intercepto…

cuda性能分析工具

NVIDIA nvprof / nvvpNSight系列Nsight Systems本地使用远程使用结果分析Nsight Compute本地使用远程使用结果分析NVIDIA nvprof / nvvp 由2008年起开始支持的性能分析器&#xff0c;交互性好&#xff0c;利于使用记录运行日志时使用命令nvprof可视化显示日志时使用命令nvvp&a…

SpringCloud+Nacos+Gateway

SpringCloudNacosGatewaySpringBoot整合GatewayNacos一. 环境准备1. 版本环境2. 服务环境二. 实战1.创建用户服务2.创建订单服务3.创建网关服务4.测试三. 避坑指南问题1--503问题问题2--网关服务启动报错SpringBoot整合GatewayNacos 本篇文章只演示通过gateway网关服务访问其他…

【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能

【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能 【论文原文】&#xff1a;A New Local Transformation Module for Few-shot Segmentation 【作者信息】&#xff1a;Yuwei Yang, Fanman Meng, Hongliang Li, Qingbo Wu,Xiaolong Xu an…

SpringMVC(2)

一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据&#xff0c;我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…

读懂下文,安装数据库不再求人

想要数据存储必须要有数据库为支撑。在项目运行的时候也是要提前安装好并导入表结构和数据。通俗点来说&#xff0c;学会了万事不求人。 这里就整理了一份关于Windows和Linux系统下安装Mysql的操作命令。 Windows下安装MySQL 1、设置环境变量 设置环境变量是为了让你在任何…