一、简介
本文主要介绍如何打开Kdump并对其相关文件进行配置。前面章节已经对Kdump调试机理进行总结总结,具体可以点击下面链接:
二、Kdump整体介绍
1、kdump
kdump 是一种先进的基于 kexec 的内核崩溃转储机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。当内核产生错误时,kdump会将内存导出为vmcore保存到磁盘。
2、 kdump流程
当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核启动时会保留一段内存给kdump用。
3、kdump的配置流程具体如下:
内核配置
安装kdump(kexec-tools)工具
修改内核启动参数
修改kdump配置文件
启动kdump功能
验证Kdump功能
- 1
- 2
- 3
- 4
- 5
- 6
三、Kdump具体配置
3.1 内核配置
通常设备默认内核是已经配置了Kdump功能的。
想要确认当前内核是否支持kexec,可通过查看在/sys/kernel/下有没有kexec等文件去确认,同时通过查看 /sys/kernel/kexec_crash_loaded 的值,判断Kdump功能是否加载(“1”为已经加载,“0”为还未加载)
[root@localhost /]# cat /sys/kernel/kexec_crash_loaded
- 1
如果没有,则需要我们对内核进行配置,具体如下(make menuconfig):
CONFIG_KEXEC=y
Boot options --->[*] Kexec system call (EXPERIMENTAL)
//此参数告诉系统使用Kexec跳过BIOS和引导(新)内核。(提供内核层面的kexec功能支持)
CONFIG_CRASH_DUMP=y
Boot options --->[*] Build kdump crash kernel (EXPERIMENTAL)
//崩溃转储需要启用。没有此选项,Kdump将毫无用处。(提供内核层面的kdump功能支持)
CONFIG_SYSFS=y
File systems --->Pseudo filesystems --->[*] Tmpfs virtual memory file system support
//启用sysfs文件系统支持
CONFIG_PROC_VMCORE=y
File systems --->Pseudo filesystems --->-*- /proc file system support--->[*] /proc/vmcore support
//此配置允许Kdump将内存转储保存到/proc/vmcore。
CONFIG_DEBUG_INFO=y
Kernel hacking --->Compile-time checks and compiler options --->[*] Compile the kernel with debug info
//此参数表示将使用调试符号构建内核。尽管这将增加内核映像的大小,但是具有可用的符号对于深入分析内核崩溃非常有用,因为它不仅使您可以跟踪导致崩溃的有问题的函数调用问题,而且可以跟踪特定行在相关来源中。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3.2 安装kdump(kexec-tools)工具
[root@localhost /]# yum install kexec-tools
//安装完成之后可以通过kexec -v查看kexec的版本
- 1
- 2
3.3 修改内核启动参数
(1)直接配置
[root@localhost /]# vim /boot/grub2/grub.cfg
//直接在加载内核这一行(linux ${prefix}/vmlinuz console=tty xxx)最后加上crashkernel=auto
//auto为自动根据内存分配vmcore的生成的大小,也可以指定具体大小,如crashkernel=128M,具体grub.cfg的配置可以查看本人博客:
- 1
- 2
- 3
(2)通过工具重置grub.cfg
[root@localhost /]# vim /etc/default/grub
- 1
修改为
GRUB_CMDLINE_LINUX="crashkernel=auto" //自动分配大小,部分系统需要指定固定大小
- 1
说明:
crashkernel=xxx //预留内存大小
注意:
注意预留内存大小,过大/过小都会导致生成vmcore文件失败(不知道设置多少时,可以尝试每次增加128M)
[root@localhost /]# grub2-mkconfig -o /boot/grub2/grub.cfg
- 1
(3)重启确认配置是否成功
[root@localhost /]# reboot
[root@localhost /]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-4.4.13-200.nd7.3.x86_64 root=/dev/sda3 ro rhgb quiet loglevel=0 LANG=zh_CN.UTF-8 crashkernel=auto
- 1
- 2
- 3
说明:
如果在cmdline里找到了crashkernel参数,代表已经将配置写入内核了.
3.4 修改kdump配置文件
[root@localhost /]# vim /etc/kdump.conf //其中需要注意的三行内容:
path /var/crash #指定coredump文件放在/var/crash文件夹中
core_collector makedumpfile -c -l -message-level 1 -d 31 #加上-c表示压缩,原文件中没有
default reboot #生成coredump后,重启系统
- 1
- 2
- 3
- 4
3.5 启动kdump功能
[root@localhost /]# systemctl enable kdump.service
[root@localhost /]# systemctl start kdump.service
[root@localhost 桌面]# systemctl status kdump.service
● kdump.service - Crash recovery kernel arming
Loaded: loaded (/usr/lib/systemd/system/kdump.service; disabled)
Active: active (exited) since 四 2022-05-05 19:12:31 CST; 1min 14s ago
Process: 2272 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
Main PID: 2272 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/kdump.service
5月 05 19:12:31 localhost kdumpctl[2272]: kexec: loaded kdump kernel
5月 05 19:12:31 localhost kdumpctl[2272]: Starting kdump: [OK]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
注意:
本人在用x86的系统打开kdump服务时,指定的crashkernel=auto不生效,导致启动失败,可以用crashkernel=128M@48M格式测试;
3.6 验证Kdump功能
我们来模拟系统异常崩溃,验证之前的操作是否都成功了:
[root@localhost /]# echo 1 > /proc/sys/kernel/sysrq
[root@localhost /]# echo c > /proc/sysrq-trigger
- 1
- 2
重启后,查看/var/crash目录
[root@localhost /]# ls /var/crash/
- 1
保留内存是否预留成功,可以通过cat /proc/meminfo查看。
[root@localhost /]# cat /proc/meminfo | grep Crash
- 1
四、其他相关链接
</article>