当前位置: 首页 > news >正文

kdump 机制

kdump 机制

1 相关概念

  • kdump:是获取崩溃的 Linux 内核转储的一种方法。
  • kexec:是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。"kexec --help"查看使用帮助。
  • crashkernel:在内核启动命令行中使用 crashkernel=YM@XM 预留的一片内存区域,用于放置和加载捕获内核。
  • initrd:boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘,作用在内核启动的第一阶段。
  • crash:是由 Dave Anderson 开发和维护的一个内存转储分析工具。
  • 生产内核:正常的内核,在崩溃时进行崩溃转储,最终被捕获内核捕获的内核。
  • 捕获内核:生产内核崩溃时运行的内核,捕获崩溃转储。
  • vmlinux-standard(debug):指含有 debug 信息的未压缩的生产内核,占用空间大。
  • vmlinuz-standard:指 kdump 中的压缩格式生产内核。
  • vmlinuz-capture:指 kdump 中的压缩格式捕获内核。

2 用户态: kexec-tools

基于系统调用 kexec_load, reboot 设计的用户态程序

2.1 加载第二内核功能

1)内核配置

# 生产内核: 支持KEXEC
CONFIG_KEXEC=y
CONFIG_KEXEC_CORE=y

# 可选项
CONFIG_DEBUG_INFO=y ## 用于分析内核
CONFIG_LOCALVERSION="standard"

2)加载第二内核

kexec -l /boot/vmlinuz-native --initrd=/boot/initrd.img --append="root=/dev/sda3 console=ttyS0,115200 init 3 nr_cpus=1 "
cat /sys/kernel/kexec_loaded

3)启动加载的内核

kexec -e

2.2 加载捕获内核功能

1)内核配置

# 捕获内核: 支持崩溃转储功能
CONFIG_KEXEC=y
CONFIG_KEXEC_CORE=y
CONFIG_CRASH_DUMP=y
CONFIG_CRASH_CORE=y
CONFIG_PROC_VMCORE=y
CONFIG_DEBUG_INFO=y
CONFIG_PHYSICAL_START=0x9000000004000000

# 可选项
CONFIG_LOCALVERSION="capture"
CONFIG_PANIC_ON_OOPS=y
CONFIG_PANIC_TIMEOUT=-1

# 命令行添加参数: /boot/boot.cfg
crashkernel=128M@64M

2)加载捕获内核

kexec -p /boot/vmlinuz-capture-128M_64M --append="root=/dev/sda3 console=ttyS0,115200 init 3 nr_cpus=1 swiotlb=2048"

3)查看 crashkernel

cat /sys/kernel/kexec_crash_size # 预留内存大小
cat /proc/iomem | grep "Crash kernel" # 查看地址布局
cat /sys/kernel/kexec_crash_loaded # 捕获内核是否载入

4)启动到捕获内核(系统panic)

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger # 手动触发 panic

5)查看 vmcore

root@dev-pc:~# ls -lh /proc/vmcore
-r-------- 1 root root 16G 611 11:18 /proc/vmcore

3 分析工具: crash

#ls -al /proc/vmcore
#makedumpfile -l -d 31 /proc/vmcore /var/crash/vmcore
#ls -al /var/crash/vmcore
#reboot

cp /proc/vmcore /data/vmcore

root@dev-pc:~# crash ./vmlinux /var/crash/vmcore
crash> bt
crash> dis <address>
crash> help
crash> man ptov

4 参考链接

  • 使用 Kdump 检查 Linux 内核崩溃 | LINUXCN
  • 用 Kexec 快速切换当前 Linux 内核 | TinyLab
  • 介绍 kdump 的基本原理 | openEuler

相关文章:

  • 一般网站的跳出率/淘宝如何提升关键词排名
  • 导购网站开发源码/网站推广怎样做
  • 深圳微信网站运营/百度站长seo
  • 怎样做网站后台/重庆网站建设维护
  • 网站子目录是什么/域名查询网站入口
  • wordpress批量上传/中国十大教育培训机构有哪些
  • 本地服务器如何让外网远程桌面连接?
  • 高级语言(C语言)、汇编语言、机器语言区别?编译器如何将高级语言编译成机器语言?
  • SOLIDWORKS 2023新功能揭秘!装配体升级 阵列实例、配合错误修复、零件替换同步更新
  • postman接口关联
  • APM vs NPM
  • 智能门锁-手机应用相机国产、非国产统计参数对比分析
  • 字符加密-C语言实现
  • 字符矩阵内单词搜索
  • C语言经典100例(027,028,029,030)
  • 虚拟机本地搭建Hadoop集群教程
  • 基于A*搜索和深度优先搜索解迷宫问题
  • RPC框架泛调用原理及转转的实践