kdump功能
- 前言
- 1 kdump流程
- 2 kdump配置
- 2.1 kexec、makedumpfile编译
- 2.2 系统内核
- 2.3 捕获内核
- 3 kdump测试
- 4 kdump的不足
前言
kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump会将内存导出为vmcore保存到磁盘。
在kernel1运行的时候,在内存中给kernel2(捕获内核)预留空间。在kernel1 crash的时候,就会进入kernel2,kernel2 执行用户态程序makedumpfile对kernel1的内存镜像进行裁剪和压缩,最后将kernel1的vmcore保留在磁盘中并重启。
1 kdump流程
-
当系统内核启动时,它会为捕获内核保留一小部分内存。保留内存大小可以在cmdline中指定,比如crashkernel=64M。
-
kexec-p命令将捕获内核和根文件系统加载到保留内存中
有关系统内核的内存使用和分布等所有必要信息都以ELF格式编码,并在崩溃之前存储在内存的保留区域中。这个ELF文件头的物理地址由kexec通过在kernel2的cmdline里添加elfcorehdr= 选项的方式传递给捕获内核,通过分析它,捕获内核就可以生成出/proc/vmcore。
可以看到图中给捕获内核预留的内存里面有捕获内核镜像、根文件系统、Elf core headers。 -
捕获内核通过/proc/vmcore访问内存映像
捕获内核的ramdisk中的脚本可以通过通常的文件复制命令(如cp或scp)拷贝vmcore,也可以使用makedumpfile工具分析过滤内容,例如,使用“-d 31”,则只拷贝内核数据。
2 kdump配置
2.1 kexec、makedumpfile编译
下载编译kexec-tools:
http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz
下载编译makedumpfile:
https://github.com/makedumpfile/makedumpfile
里面有编译的方法,可以自行编译。
2.2 系统内核
1.config配置
CONFIG_KEXEC_CORE=y
2.给捕获内核预留内存
在cmdline里添加:crashkernel=64M
3.在脚本文件里添加kexec执行命令
kexec -p <dump-capture-kernel-Image> \
--initrd=<initrd-for-dump-capture-kernel> \
--append="root=<root-dev> <arch-specific-options>"
–append是传递给捕获内核的cmdline,一般要加上
"nr_cpus=1 reset_devices"
2.3 捕获内核
1.config配置
CONFIG_CRASH_DUMP=y
2.制作根文件系统
3.在ramdisk脚本里加拷贝vmcore的命令
cp /proc/vmcore <dump-file>
或
makedumpfile -l --message-level 1 -d 31 /proc/vmcore <dump-file>
reboot
4.如果内存资源有限,还需裁剪内核
3 kdump测试
1.主动触发panic
echo c > /proc/sysrq-trigger
2.使用crash解析vmcore
./crash vmlinux <dump-file>
Crash是一个用于分析内核转储文件的工具,和Kdump配套使用。
4 kdump的不足
- 没有reset硬件,系统不稳定
- watchdog等hung死的问题无法使用kdump,需结合其他手段
- 占用资源较多,嵌入式设备资源有限,不过有很大优化空间,后面有空可以谈
后续打算在树莓派4B上使能kdump功能。