linux内核调试之 kdump安装配置

https://zhuanlan.zhihu.com/p/280737119

 

【1】Kexec 机制

Kexec是实现 kdump 机制的关键,介绍kdump之前先介绍下linux kexec机制。kexec 是 Linux 内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。起初是方便系统可以极其快速地重新启动,后来在crash dump领域得到新的应用。

Kexec包括 2 个组成部分:一是内核空间的系统调用 kexec_load,负责在生产内核(production kernel 或 first kernel)启动时将捕获内核(capture kernel 或 sencond kernel)加载到指定地址。二是用户空间的工具 kexec-tools,他将捕获内核的地址传递给生产内核,从而在系统崩溃的时候能够找到捕获内核的地址并运行。

【2】kdump原理

1、什么是kdump?

Kdump 的概念出现在 2005 左右,是迄今为止最可靠的内核转存机制,已经被主要的 linux™ 厂商选用。kdump是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。

2、如何使用 kdump?

kdump 需要两个不同目的的内核,生产内核和捕获内核。有两种方式:

1、构建一个单独的自定义转储捕获内核以捕获内核转储;

2、或者将系统内核本身作为转储捕获内核,这就不需要构建一个单独的转储捕获内核。

方法2 只能用于可支持可重定位内核的体系结构上;目前有 i386,x86_64,ppc64 和 ia64 。

3、如何访问捕获内存

在内核崩溃之前所有关于核心映像的必要信息都用 ELF 格式编码并存储在保留的内存区域中。ELF 头所在的物理地址被作为命令行参数(fcorehdr=)传递给新启动的转储内核。

在第二个内核中,“前一个系统的内存”可以通过两种方式访问:

1) 通过 /dev/oldmem 这个设备接口。

一个“捕捉”设备可以使用“raw”(裸的)方式 “读”这个设备文件并写出到文件(根据ELF头信息定位);

2)通过 /proc/vmcore。

这个方式是将转储输出为一个 ELF 格式的文件,并且可以使用一些文件拷贝命令(比如 cp,scp 等)将信息读出来。

 

【3】安装配置kdump

(1)安装软件包

Kdump 用到的各种工具都在 kexec-tools 中。kernel-debuginfo 则是用来分析 vmcore 文件。

1、很多发行版系统预装了kexec-tools,可以使用命令查看:

rpm -qa|grep kexec
kexec-tools-2.0.3-0.18.17

如果没有可以yum install 或者源码安装

2、kernel-debuginfo

(2)配置系统内核和捕捉内核都需要的内核选项

CONFIG_KEXEC

CONFIG_SYSFS

CONFIG_DEBUG_INFO

CONFIG_CRASH_DUMP

CONFIG_PROC_VMCORE

其他

(3)为kdump预留内存空间

如果是suse11 系统X86和X86_64结构,参考以下配置预留表格

 

SUSE11 SP4上cmdline:

root=/dev/sda2 resume=/dev/sda1 splash=silent crashkernel=256M-:128M vga=0x317

centos8上的 cmdline:

BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-193.19.1.el8_2.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet

(4)检查kdump状态

SUSE11:

rckdump
status

redhat:

service
kdump status

(5)kdump配置文件

在redhat、centos上:

/etc/kdump.conf

SUSE11上:

/etc/sysconfig/kdump

下面贴出一个centos8里的配置(可自己根据配置注释进行配置):

#raw
/dev/vg/lv_kdump
#ext4
/dev/vg/lv_kdump
#ext4 LABEL=/boot
#ext4
UUID=03138356-5e61-4ab3-b58e-27507ac41937
#nfs
my.server.com:/export/tmp
#ssh
user@my.server.com
#sshkey
/root/.ssh/kdump_id_rsa
path
/var/crash
core_collector
makedumpfile -l --message-level 1 -d 31
#core_collector
scp
#kdump_post
/var/crash/scripts/kdump-post.sh
#kdump_pre
/var/crash/scripts/kdump-pre.sh

配置完成后使用mkdumprd -f

来创建kdump使用的initrd(SUSE11)

(6)修改cmdline,加上crashkernel

/boot/grub/menu.list

或者

/boot/grub/grub.conf

 

【4】参考:

CENTOS7 配置KDUMP和使用CRASH工具分析CRASH现场​blog.csdn.net

 

Linux内核调试方法总结 - FGQ的开源人生 - OSCHINA - 中文开源技术交流社区​my.oschina.net图标

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值