kdump功能

前言

kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump会将内存导出为vmcore保存到磁盘。

在kernel1运行的时候,在内存中给kernel2(捕获内核)预留空间。在kernel1 crash的时候,就会进入kernel2,kernel2 执行用户态程序makedumpfile对kernel1的内存镜像进行裁剪和压缩,最后将kernel1的vmcore保留在磁盘中并重启。

1 kdump流程

在这里插入图片描述

  • 当系统内核启动时,它会为捕获内核保留一小部分内存。保留内存大小可以在cmdline中指定,比如crashkernel=64M。

  • kexec-p命令将捕获内核和根文件系统加载到保留内存中
    有关系统内核的内存使用和分布等所有必要信息都以ELF格式编码,并在崩溃之前存储在内存的保留区域中。这个ELF文件头的物理地址由kexec通过在kernel2的cmdline里添加elfcorehdr= 选项的方式传递给捕获内核,通过分析它,捕获内核就可以生成出/proc/vmcore。
    可以看到图中给捕获内核预留的内存里面有捕获内核镜像、根文件系统、Elf core headers。

  • 捕获内核通过/proc/vmcore访问内存映像
    捕获内核的ramdisk中的脚本可以通过通常的文件复制命令(如cp或scp)拷贝vmcore,也可以使用makedumpfile工具分析过滤内容,例如,使用“-d 31”,则只拷贝内核数据。

2 kdump配置

2.1 kexec、makedumpfile编译

下载编译kexec-tools:
http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz
下载编译makedumpfile:
https://github.com/makedumpfile/makedumpfile
里面有编译的方法,可以自行编译。

2.2 系统内核

1.config配置
CONFIG_KEXEC_CORE=y
2.给捕获内核预留内存
在cmdline里添加:crashkernel=64M
3.在脚本文件里添加kexec执行命令

   kexec -p <dump-capture-kernel-Image> \
   --initrd=<initrd-for-dump-capture-kernel> \
   --append="root=<root-dev> <arch-specific-options>"

–append是传递给捕获内核的cmdline,一般要加上

"nr_cpus=1 reset_devices"

2.3 捕获内核

1.config配置
CONFIG_CRASH_DUMP=y
2.制作根文件系统
3.在ramdisk脚本里加拷贝vmcore的命令

cp /proc/vmcore <dump-file>  
或
makedumpfile -l --message-level 1 -d 31 /proc/vmcore <dump-file>
reboot

4.如果内存资源有限,还需裁剪内核

3 kdump测试

1.主动触发panic

echo c > /proc/sysrq-trigger

2.使用crash解析vmcore

./crash vmlinux <dump-file>

Crash是一个用于分析内核转储文件的工具,和Kdump配套使用。

4 kdump的不足

  • 没有reset硬件,系统不稳定
  • watchdog等hung死的问题无法使用kdump,需结合其他手段
  • 占用资源较多,嵌入式设备资源有限,不过有很大优化空间,后面有空可以谈

后续打算在树莓派4B上使能kdump功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值