【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

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结构,参考以下配置预留表格




centos conda 指定channels centos kdump_linux mutt安装配置


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现场

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

centos conda 指定channels centos kdump_centos_02