【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】参考