文章目录
一、Kdump 和 Crash 工具介绍
1.1 Kdump
Kdump是一种基于kexec的Linux内核崩溃捕获机制,kexec的全称是Kernel execution,即立即执行,它可以跳过BIOS或者bootloader等引导程序,快速启动一个新的内核。这样第一个内核的内存就得以保留。在第二个内核中可以对第一个内核产生的崩溃数据进行分析。
1.2 Crash
Crash是由Red Hat Enterprise Linux 项目师开发的,和Kdump配套使用的一个用于分析内核转储文件的工具。
Kdump+Crash分析宕机问题的流程并不复杂,首先Kdump会在内存中保留一块区域,这个区域用来存放捕获内核。当生产内核在运行过程中遇到崩溃等情况。Kdump会通过kexec机制自动启动捕获内核,跳过BIOS,以免破坏了生产内核的内存,然后把生产内核的完整信息(包括CPU寄存器,栈数据等)转储到指定文件中。接着使用Crash工具来分析这个转储文件,以快速定位宕机问题。
二、配置kdump和Crash工具
目前大部分服务器基于RHEL或者其开源版本Centos部署,本节介绍如何在Centos中配置和安装Kdump和Crash工具。
2.1 安装kexec-tools
yum install kexec-tools
2.2 设置crashkernel预留内存大小
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=256M"
修改crashkernel的大小,我的系统内存是3G,保留了256M,注意预留内存大小,过小会导致生成coredump文件失败(不知道设置多少时,可以尝试每次增加128M)
修改后还需重新生成grub配置文件,重启系统才能生效
[vagrant@localhost ~]$ grub2-mkconfig -o /boot/grub2/grub.cfg
[vagrant@localhost ~]$ reboot
[root@localhost ~]$ cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=256M rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
2.3 修改kdump默认配置/etc/kdump.conf
centos7 默认已安装kdump,根据需要修改默认配置
[root@localhost ~]$ vi /etc/kdump.conf
path /var/crash #指定coredump文件存储位置
core_collector makedumpfile -c -l --message-level 1 -d 31 #增加-c参数,代表压缩coredump文件
default reboot #生成coredump后,重启系统
2.4 开启kdump服务
systemctl start kdump.service //启动kdump
systemctl enable kdump.service //设置开机启动
2.5 测试kdump功能 检查kdump是否开启成功
[root@localhost ~]# service kdump status
Redirecting to /bin/systemctl status kdump.service
● kdump.service - Crash recovery kernel arming
Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2022-11-16 10:48:09 CST; 18s ago
Process: 1342 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
Main PID: 1342 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/kdump.service
...
Jan 05 11:07:03 localhost.localdomain kdumpctl[1082]: Starting kdump: [OK]
...
如果看到”Starting kdump: [OK]“字样,说明Kdump服务已经成功配置。
2.6 手动触发crash
[root@cloud ~]# echo 1 > /proc/sys/kernel/sysrq ; echo c > /proc/sysrq-trigger
如果Kdump配置正确,上述命令会让系统快速重启并且启动捕获内核以进行转储。
2.7 查看生成的crash文件
[root@localhost ~]# ls /var/crash/
127.0.0.1-2022-11-16-11:11:43
转储完成之后会自动切换回生产内核。在/var/crash
目录下存放了对应的coredump目录。(在2.3节中设置了将coredump目录存放在/var/crash中)。该目录是以IP地址和日期来命令的,目录里面包含了vmcore
和vm