玩转OurBMC第十一期:kdump原理分析(上)

news2024/11/23 15:17:01

栏目介绍:“玩转OurBMC”是OurBMC社区开创的知识分享类栏目,主要聚焦于社区和BMC全栈技术相关基础知识的分享,全方位涵盖了从理论原理到实践操作的知识传递。OurBMC社区将通过“玩转OurBMC”栏目,帮助开发者们深入了解到社区文化、理念及特色,增进开发者对BMC全栈技术的理解。

欢迎各位关注“玩转OurBMC”栏目,共同探索OurBMC社区的精彩世界。同时,我们诚挚地邀请各位开发者向“玩转OurBMC”栏目投稿,共同学习进步,将栏目打造成为汇聚智慧、激发创意的知识园地。

在BMC对服务器的监控与管理过程中,我们为了实现对服务器的更优化管理,往往需要与其它工具紧密协同工作,以增强监控的全面性,提高管理的灵活性,并促进问题的快速解决。本期内容,我们将对 内核崩溃转储机制kdump 进行介绍。首先,对kdump整体运行流程进行介绍,然后分别对kdump配置工具、内核启动参数、服务程序、系统重启转储流程等方面内容进行概述,以帮助读者更好的理解和运用kdump。

Kdump整体流程(简单流程)

Kdump是Linux系统中的一个内核崩溃转储机制,用于在系统崩溃时自动捕获系统内存和寄存器状态,从而允许系统管理员或开发者在事后分析崩溃原因。这一机制对于诊断系统稳定性问题、硬件故障或内核错误等非常有用。下图为kdump工作流程图。

图片

Kexec-tools 工具

Kexec-tools是用于配置和启动kdump的核心工具,它允许在系统崩溃时自动捕获内存映像,并可用于在不影响当前运行的系统的情况下加载和启动另一个内核。这对于进行内核崩溃分析和调试非常有用。Kexec-tools提供的kexec命令利用kexec_load系统调用将捕获内核加载到内存中。

Kexec命令用-l来加载捕获内核,并通过-e来启动:

图片

Kexec通过-p命令加载能够在内核crash时启动的捕获内核,并通过触发panic来启动:

图片

内核启动参数

为了让kdump正常工作,内核启动时需要通过GRUB等引导程序给内核添加启动参数,这些参数主要涉及到为kdump保留的内存大小(crashkernel)和其他可能需要的配置。参数格式如下:

格式 1:crashkernel=Y[@X],其中Y代表为捕获内核预留的内存空间大小(以MB为单位),而@X是可选的,表示保留内存区域的起始位置(同样以MB为单位)。例如,crashkernel=512M,代表为捕获内核预留512M内存空间;crashkernel=64M@16M,代表预留64M空间,且在物理内存16M的位置。

格式 2: crashkernel=range1:size1[,range2:size2,…][@offset],这个格式允许根据系统的总内存大小来动态地决定为kdump预留的内存量。比如:crashkernel=512M-2G:64M,2G-:128M:

-如果RAM小于512M,不需要为kdump预留内存;

-如果 RAM 大小介于 512M 和 2G 之间(不含),为kdump预留 64M内存;

-如果 RAM 大小大于 2G,为kdump预留 128M内存;

当系统启动后,可以通过查看/proc/iomem文件并结合grep命令来检索Crash kernel项占用的内存大小。比如设置crashkernel=512M。

图片

关于Linux内核中Crash kernel的具体配置参数,可以参考内核源代码目录下的Documentation/kdump/kdump.txt文档。

Kdump 服务程序

通过系统服务systemctl start kdump来启动kdump服务,其本质上是通过/usr/bin/kdumpctl 工具调用kexec加载捕获内核:

Kdump服务:

图片

Kdumpctl是kdump服务的控制工具,用于管理kdump的启动、停止和配置。Kdumpctl首次启动需要生成一个特定的initramfs镜像文件(initramfs-xxxxkdump.img),这个文件在捕获内核启动后提供基本的文件系统、必要的驱动程序以及kdump-capture服务,用于将vmcore文件转储到指定位置。这些功能由kexec-tools软件包提供。

图片

/usr/bin/kdumpctl  start 启动load_kdump:

图片

在当前系统kexec完整命令:

图片

系统重启转储流程

在内核启动kdump触发panic之后,系统会快速重新启动,并加载kexec预先配置的内核以及initrd。前面了解到kexec会有--initrd参数,该参数是指定一个initramfs文件,通常带有kdump后缀,说明其具有和kdump相关性。我们通过lsinitrd工具来查看。

图片

上述内容为系统中kdump相关配置的grep查询结果。其中,kdump-capture.service是一个在initramfs环境中启动的systemd服务单元文件,它负责在kdump过程中执行关键步骤,它依赖于在initramfs生成过程中添加的适当脚本和配置来执行内存转储。该文件在/usr/lib/dracut/modules.d/99kdumpbase目录下,由kexec-tools工具提供。kdump-capture.service文件的核心是指定了在服务启动时应该执行的命令,通常通过ExecStart指令设置为执行某个脚本:

ExecStart=/bin/kdump.sh.

该脚本会在kdump-lib-initramfs.sh脚本中调用dump_fs函数。

/bin/kdump.sh.:

图片

/usr/lib/kdump/kdump-lib-initramfs.sh:dump_fs函数(以下内容为部分截选)。

图片

由此可知,系统重启之后,通过kdump-capture服务,使用makedumpfile工具将/proc/vmcore文件保存到本地系统中。

makedumpfile 工具

操作系统触发kdump并进入 “捕获内核” 后,第一个内核(称为 “崩溃内核” )的内存映像可以在/proc/vmcore中获取,而第二个内核(称为 “kdump 内核” 或 “捕获内核” )正在运行。makedumpfile通过压缩转储数据或通过排除对分析内存错误没有任何帮助的页面,生成一个小的DUMPFILE文件。这个文件仅保留crash工具用来分析和调试所必须的页面。

makedumpfile在将vmcore复制到DUMPFILE时可以排除以下类型的页面,用户可以选择排除哪种类型的页面。

- 填充为零的页面

- 没有私有标志的缓存页面(非私有缓存)

- 有私有标志的缓存页面(私有缓存)

- 用户进程数据页面

- 空闲页面

makedumpfile提供了两种DUMPFILE格式(ELF格式和kdump压缩格式)。默认情况下,makedumpfile生成的是kdump压缩格式的DUMPFILE。Kdump压缩格式仅可用crash实用程序读取,由于支持压缩,因此其大小可能比ELF格式小。ELF格式可用GDB和crash实用程序读取。如果用户希望使用GDB,必须明确指定DUMPFILE格式为ELF格式。

makedumpfile可以将vmcore文件按照不同的压缩格式进行压缩,这种情况下只有crash功能能够解析。makedumpfile有参数-c,-l,-p分别对应不同的压缩方式:-c使用zlib,-l 使用lzo,默认情况下使用-l参数。

在默认情况下生成的vmcore文件格式如下:

图片

以下为通过修改/etc/kdump.conf配置将core_collector makedumpfile -l --message-level 1 -d 31修改为core_collector makedumpfile -E --message-level 1 -d 31后生成的ELF格式的vmcore文件:

图片

*开发者可以自行修改/etc/kdump.conf配置调整makedumpfile参数。修改后删除kdump版本的initramfs,重新启动kdump服务即可。

/proc/vmcore 和 /proc/kcore

正常启动的内核没有创建 /proc/vmcore文件,只有在crash kernel启动的时候才会创建,可以通过一定的手段进入到crash kernel中,让系统不重启:

第一步:进行修改/usr/bin/kdumpctl中代码:

图片

第二步:执行kexec -p /boot/vmlinuz-5.10.0-60.48.0.76.oe2203.x86_64 --initrd=/boot/initramfs-5.10.0-60.48.0.76.oe2203.x86_64.img --command-line="root=/dev/mapper/openeuler-root"

第三步 :echo c > /proc/sysrq-trigger触发crash,让系统快速重启进入crashkernel。

注意:如果使用正常initrd,通过以上描述的方式将不会执行kdump-capture服务。而是启动了kdump服务,由于此时使用的是crash kernel,会创建./proc/vmcore文件,如果不注释reboot则会保存vmcore且重启。

图片

从上述信息我们可以发现/proc/vmcore文件是ELF文件格式,这种格式是内核为之前的normal kernel创建的文件格式。其大小1.6G,是normal kernel启动时内存的大小。当前crash kernel启动后通过free命令发现是429M。大小和我们之前设置内核启动参数 “crashkernel=512M” 相近。

ELF 类型 4/ET_CORE:表示是elf文件格式的第四种类型。

其它三种格式:.o文件(ET_REL)、.so文件(ET_DYN)、static文件(ET_EXEC)

ET_CORE:通过crash调试就能恢复到故障现场。

图片

我们利用makedumpfile工具将其保存下来:

图片

/proc/vmcore文件只有捕获内核启动的时候才会创建,和vmcore类似,/proc/kcore是一个动态的内核文件,包含了系统运行中内核的所有数据(内核当前状态的映像),以ELF core file格式存储,与大多数/proc/目录下的文件不同的是:kcore显示了一个大小,该值以字节为单位。它由内核在fs/proc/kcore.c中创建,并允许从用户空间读取所有内核虚拟内存空间,通过ls -l展示它的大小是一个非常大数字(在64位系统上128T),但是它根本不占用任何磁盘空间:

图片

与/proc中的所有其他文件一样,它的内容是由内核在读取文件时动态生成的,并且只能以root权限读取。我们可以通过makedumpfile -l --message-level 31 -d 31 /proc/kcore /tmp/kcore将其转储出来,利用crash工具进行调试。其本质和vmcore一样,在内部具有ELF核心转储文件的格式(ELF类型4/ET_CORE)。这种格式上的一致性确保了它与系统崩溃时自动生成的单个进程核心文件(core dump)在结构上保持一致,便于使用相同的工具集进行分析。然而,与进程级别的核心文件不同,makedumpfile生成的转储文件并非旨在捕获某个特定进程在崩溃瞬间的静态状态,而是旨在提供整个系统内存状态的实时快照。

/proc/kcore将当前系统的物理内存空间模拟成一个ELF核心转储(core dump)文件的格式,通过特定的工具和技术,如使用gdb(GNU调试器)结合一些特定的调试技巧和内核调试模块,以类似于调试程序的方式,来查看和分析系统的当前状态。

在拥有/proc/kcore文件以及当前版本的、包含调试信息的vmlinux内核映像的情况下,可以使用gdb(或crash)来实时检查和分析内核中任何数据结构的当前状态。

调试 vmcore 文件

生成的vmcore文件可以通过crash工具或者gdb进行调试。一般情况下我们使用crash工具来调试。Crash命令使用 :

方式crash [OPTION]... NAMELIST MEMORY-IMAGE[@ADDRESS]     (dumpfile form)

上述NAMELIST代表未压缩的内核vmlinux文件,如果使用的是官方的rpm包,需要安装kernel-debuginfo软件包,直接安装的内核是压缩过并且不带调试信息。Openeuler系统可以在yum配置文件中打打开debuginfo仓库,执行yum install kernel-debuginfo安装。如果是自己编译的内核则位于源码编译目录下的vmlinux文件。

执行crash /usr/lib/debug/lib/modules/5.10.0-60.48.0.76.oe2203.x86_64/vmlinux vmcore进行调试。

本期内容为大家详细介绍了kdump基本知识。通过kdump,Linux系统管理员和开发者可以获得强大的工具来诊断和解决系统稳定性问题,从而提高系统的可靠性和安全性。下期内容我们将继续深入探索kdump,欢迎大家关注。

欢迎大家关注OurBMC社区,了解更多BMC技术干货。

OurBMC社区官方网站:

https://www.ourbmc.cn/

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

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

相关文章

echarts 中添加图片/图标

let myChart echarts.init(this.$refs.chartOne); // 注意这里的 ref 引用 myChart.setOption({ tooltip: {trigger: item,formatter: {b} : {c}},series: [{type: pie,radius: 50%,data: this.swjList,label: {formatter: (params) > {if (params.name ! ) {let percent…

代码随想录 -- 回溯 -- N皇后

51. N 皇后 - 力扣(LeetCode) 题解: 从抽象树中可以看出递归的层数取决于棋盘的行数,for循环的次数取决于棋盘的列数。 递归参数:存放当前棋盘的数组chessboard、当前行row、总行数n。递归终止条件:当 ro…

【C++网络编程】(二)Linux平台下UDP客户/服务端程序

Linux平台下UDP客户/服务端程序 图片来源&#xff1a;https://subingwen.cn/linux/udp/ UDP服务器无法直接检测客户端断开连接。 UDP 服务端 server.cpp #include <iostream> #include <cstdlib> // std::exit #include <cstring> // memset #i…

在线制作PPT图表!这个好用轻量的ppt软件值得推荐!

ppt图表怎么制作&#xff1f; ppt是一种可以承载多种内容形式的媒介&#xff0c;我们在一个ppt页面中添加文本、形状、图片、视频、图表、思维导图等&#xff0c;对于其中的图表&#xff0c;在ppt中应该怎么制作呢&#xff1f; Office Powerpoint是很多人非常熟悉的演示软件&…

【宽搜】5.leetcode 199 二叉树的右视图

1 题目描述 题目链接&#xff1a;二叉树的右视图 2 题目解析 思路&#xff1a; 可以运用 层序遍历&#xff0c; 将每一层的结点值存入到vector< int >中&#xff0c;然后对每一层的vector&#xff0c;将vector的最后一个值加入到结果的vector中去 层序遍历的模板可以…

选择三品软件作为合作伙伴,确保PLM系统成功实施和长期稳定运行

企业在初次实施PLM&#xff08;Product Lifecycle Management&#xff0c;产品生命周期管理&#xff09;系统时&#xff0c;需要细致规划和充分准备。 一、明确需求和目标 战略对齐&#xff1a;首先&#xff0c;企业需要明确PLM系统如何与企业的长期战略相匹配&#xff0c;比如…

Python和C++的差异在哪里

1.编程应用领域 C&#xff1a;广泛应用于系统级开发、嵌入式系统、游戏开发等领域。C的底层控制和高性能使其成为这些领域的理想选择。 Python&#xff1a;广泛应用于数据科学、Web开发、人工智能等领域。Python的简洁语法和强大库支持使其成为这些领域的首选语言。 2.语法风…

基于Arduino的智能避障小车的控制方法

一.工作原理 上图为超声波模块转动角度与探测方向的关系&#xff0c;正常情况下&#xff0c;智能小车会沿直线行驶&#xff0c;当遇到前方有障碍物且小于一定距离时&#xff08;设定距离可根据具体情况调整&#xff09;&#xff0c;智能小车立即停止运行。舵机转动超声波模块探…

精益生产现场管理和改善:从知识到实操的落地

在制造业的广阔天地中&#xff0c;精益生产作为一种追求浪费最小化、效率最大化的生产管理模式&#xff0c;已成为众多企业转型升级的关键路径。本文&#xff0c;深圳天行健企业管理咨询公司将从精益生产现场管理和改善的理论知识出发&#xff0c;深入探讨其从理念导入到实操落…

Windows10如何关闭自动更新

1. 右键"此电脑"&#xff0c;选择"管理"。 2. 选择"服务和应用程序 > 服务"、然后找到"Windows Update"双击打开 3. 在"常规"选项卡下&#xff0c;把启动类型改为 "禁用" 4. 点击"恢复"选项卡&…

AGI|如何构建一个RAG应用?入门新手攻略!

目录 一、概述 二、过程概述 三、如何优化提问&#xff1f; 四、路由和高级查询 五、丰富索引结构 六、重排序上下文 七、总结 一、概述 Retrieval Augmented Generation RAG 检索增强的内容生成。 从字面上来看检索只是一种手段途径&#xff0c;在人工智能领域中存在多种…

【解决】虚拟机VMTool安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装

这个问题的原因是系统安装服务没有开启 打开任务管理器-服务-打开服务 找到windows installer 服务&#xff0c;开启即可

leetcode-85. 最大矩形

题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1&…

【Cursor教程】探索Cursor颠覆编程体验的创新工具!教程+示例+快捷键

文章目录 Cursor的全新定义Cursor的灵活订阅模式使用Cursor轻松创建支付页面Cursor的快捷键使用指南Cursor的未来展望Cursor的实际应用案例案例一&#xff1a;快速原型开发示例 案例二&#xff1a;教育培训示例 案例三&#xff1a;企业内部工具开发示例 更多的选择结语 在当今技…

turtlebot3使用

roslaunch turtlebot3_gazebo turtlebot3_house.launch roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:/home/hou/maps/housemap/map.yaml 以下为melodic版本 其他版本的ros命令有区别 …

SQL优化 where谓词条件OR优化

1.测试表&#xff0c;及测试语句where条件中OR对应两个字段选择度很高 create table t618 as select * from dba_objects; select object_name from t618 where (object_id12043 or DATA_OBJECT_ID12043) and STATUSVALID; 2.没有索引情况下&#xff0c;全表扫描逻辑读…

vue项目中使用drive.js元素未定位成功

在使用drive.js时&#xff0c;button我设了一个id 但是在使用时却定位失败 只要在mounted设置setTimeout即可

算法-依据先序遍历和中序遍历构建二叉树

简单的二叉树遍历算法&#xff0c; 为了通过给定的先序遍历&#xff08;preorder&#xff09;和中序遍历&#xff08;inorder&#xff09;数组构造二叉树&#xff0c;我们需要理解这两种遍历方式的特点&#xff1a; 先序遍历&#xff08;Preorder&#xff09;&#xff1a;首先…

基于SpringBoot+Vue+MySQL的药品信息管理系统

系统展示 管理员界面 医生界面 员工界面 系统背景 随着医疗技术的不断提升&#xff0c;药品在治疗疾病中扮演着越来越重要的角色。传统的药品管理方式以人工方式为主&#xff0c;但人工管理难以满足现代社会快速发展的需求。因此&#xff0c;需要一种更加高效、便捷的信息化管理…

作为一个直播运营,需要关注哪些数据指标?

在直播电商这一高度竞争且日新月异的行业中&#xff0c;作为直播运营的专业人士&#xff0c;若未能充分利用先进工具并紧密关注一系列核心数据指标&#xff0c;将难以推动直播间的持续成长与突破&#xff0c;且在达到一定规模后极易陷入停滞不前的困境。 本人在直播带货领域深耕…