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