kdump 机制
kdump 机制
1 相关概念
kdump
:是获取崩溃的 Linux 内核转储的一种方法。kexec
:是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。"kexec --help"查看使用帮助。crashkernel
:在内核启动命令行中使用 crashkernel=YM@XM 预留的一片内存区域,用于放置和加载捕获内核。initrd
:boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘,作用在内核启动的第一阶段。crash
:是由 Dave Anderson 开发和维护的一个内存转储分析工具。生产内核
:正常的内核,在崩溃时进行崩溃转储,最终被捕获内核捕获的内核。捕获内核
:生产内核崩溃时运行的内核,捕获崩溃转储。vmlinux-standard(debug)
:指含有 debug 信息的未压缩的生产内核,占用空间大。vmlinuz-standard
:指 kdump 中的压缩格式生产内核。vmlinuz-capture
:指 kdump 中的压缩格式捕获内核。
2 用户态: kexec-tools
基于系统调用 kexec_load, reboot 设计的用户态程序
2.1 加载第二内核功能
1)内核配置
# 生产内核: 支持KEXEC
CONFIG_KEXEC=y
CONFIG_KEXEC_CORE=y
# 可选项
CONFIG_DEBUG_INFO=y ## 用于分析内核
CONFIG_LOCALVERSION="standard"
2)加载第二内核
kexec -l /boot/vmlinuz-native --initrd=/boot/initrd.img --append="root=/dev/sda3 console=ttyS0,115200 init 3 nr_cpus=1 "
cat /sys/kernel/kexec_loaded
3)启动加载的内核
kexec -e
2.2 加载捕获内核功能
1)内核配置
# 捕获内核: 支持崩溃转储功能
CONFIG_KEXEC=y
CONFIG_KEXEC_CORE=y
CONFIG_CRASH_DUMP=y
CONFIG_CRASH_CORE=y
CONFIG_PROC_VMCORE=y
CONFIG_DEBUG_INFO=y
CONFIG_PHYSICAL_START=0x9000000004000000
# 可选项
CONFIG_LOCALVERSION="capture"
CONFIG_PANIC_ON_OOPS=y
CONFIG_PANIC_TIMEOUT=-1
# 命令行添加参数: /boot/boot.cfg
crashkernel=128M@64M
2)加载捕获内核
kexec -p /boot/vmlinuz-capture-128M_64M --append="root=/dev/sda3 console=ttyS0,115200 init 3 nr_cpus=1 swiotlb=2048"
3)查看 crashkernel
cat /sys/kernel/kexec_crash_size # 预留内存大小
cat /proc/iomem | grep "Crash kernel" # 查看地址布局
cat /sys/kernel/kexec_crash_loaded # 捕获内核是否载入
4)启动到捕获内核(系统panic)
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger # 手动触发 panic
5)查看 vmcore
root@dev-pc:~# ls -lh /proc/vmcore
-r-------- 1 root root 16G 6月 11 11:18 /proc/vmcore
3 分析工具: crash
#ls -al /proc/vmcore
#makedumpfile -l -d 31 /proc/vmcore /var/crash/vmcore
#ls -al /var/crash/vmcore
#reboot
cp /proc/vmcore /data/vmcore
root@dev-pc:~# crash ./vmlinux /var/crash/vmcore
crash> bt
crash> dis <address>
crash> help
crash> man ptov
4 参考链接
- 使用 Kdump 检查 Linux 内核崩溃 | LINUXCN
- 用 Kexec 快速切换当前 Linux 内核 | TinyLab
- 介绍 kdump 的基本原理 | openEuler