kdump是什么?

kdump是一种先进的基于kexec的内核崩溃转储机制。

kdump有啥用?

当系统崩溃时使用第二内核捕获第一内核的内存镜像生成vmcore文件。
使用makedumpfile工具压缩vmcore,使用crash工具分析崩溃原因。

kdump怎么用?

如果系统中存在kdump服务,直接启动kdump服务即可,否则可以按照以下步骤操作。

1.准备工作

kdump功能需要2个内核,第1内核是生产内核,第2内核是捕获内核。

通常需要确保生产内核使能了以下配置,前2个配置用于快速重启,是必备配置,
第3个配置会生成包含调试信息的vmlinux,否则crash无法解析vmcore。

CONFIG_KEXEC   
CONFIG_KEXEC_CORE   
CONFIG_DEBUG_INFO

捕获内核需要确保使能了以下配置:

CONFIG_CRASH_DUMP
CONFIG_PROC_VMCORE
CONFIG_PHYSICAL_START

生产内核启动时需要在grub命令行里添加crashkernel=96M@64M,预留一段内存给捕获内核使用。

2.触发panic进入捕获内核

生产内核启动后,执行以下命令后系统会重启进入捕获内核。

sudo kexec -p /boot/vmlinux-kdump --append="root=/dev/sda2 console=ttyS1,115200 nr_cpus=1 init 3"
echo c | sudo tee /proc/sysrq-trigger

在捕获内核的命令行界面下可以看到生成的vmcore文件,可以使用makedumpfile工具压缩vmcore文件到指定目录。

ls -lh /proc/vmcore
makedumpfile -l --message-level 1 -d 31 /home/loongson/vmcore

3.重启捕获内核到生产内核

使用crash工具和带有调试信息的vmlinux解析vmcore文件:

sudo crash vmlinux-debuginfo vmcore
crash> bt -p
PID: 1977   TASK: 900000045a44c600  CPU: 3   COMMAND: "bash"
 #0 [90000004667a3d30] sysrq_handle_crash at 900000000082b200
 #1 [90000004667a3d30] __handle_sysrq at 900000000082bbb8
 #2 [90000004667a3d70] write_sysrq_trigger at 900000000082c12c
 #3 [90000004667a3d90] proc_reg_write at 90000000004ca638
 #4 [90000004667a3db0] __vfs_write at 9000000000445ae8
 #5 [90000004667a3e30] vfs_write at 9000000000445df4
 #6 [90000004667a3e60] ksys_write at 90000000004460d4
 #7 [90000004667a3ea0] syscall_common at 9000000000210b98