Linux kernel dump mechanism analysis

  只有清楚他们在各个过程负责的任务、功能,搞通了工作原理、功能后,就去实际环境中使用,最后再去分析其源码,只有这样你是真正的知道了整个转储机制。

一. 工具介绍及其所负责任务
  1. kexec
  2. kdump
  3. crash
1. kexec工具
安装
yum install kexec-tools

kexec两种使用方式

kexec -l /boot/vmlinuz+  --initrd=/boot/initramfs+  --append="root=/dev/sdaX ro"
2. kdump

引用自:深入探索 Kdump,第 1 部分:带你走进 Kdump 的世界 过程逻辑图

安装
# yum install kexec-tools
# yum install kernel-debuginfo #包管理器会解决其依赖common包
# 编译好内核之后,建立一个临时目录lib
mkdir -pv lib-kexecKdump-kernel
# 安装内核模块
make modules_install INSTALL_MOD_PATH=./lib/

一. 内核崩溃转储的本质

二. kdump由两部分组成

  1. 内核空间的系统调用,由kexec_load在生产内核启动时把捕获内核加载到指定地址。

  2. 用户空间的工具kexec-tools,将捕获内核的地址传递给生产内核,在系统崩溃时能找到捕获内核地址,并运行它。

三. 如何使用kdump

  1. 定制自定义的转储捕获内核(编译内核前开启kdump、vmcore),即捕获内核。

  2. 或者将第一个内核本身作为转储捕获内核使用,但此方法只支持可重定位内核的体系结构。

四. 观察前一个内核内存方式

  1. 通过/dev/oldmem设备接口。

  2. 通过/proc/vmcore

五.修改内核引导参数,为启动捕获内核预留内存

  1. 在grub启动时,修改/boot/grub.cfg;若EFI启动则在/boot/efi/EFI/fedora/grub.cfg。其实只是在里面加入了捕获内核的预留内存值的关键字“crashkernel=X@Y”,修改位置在类似:“linux linuxefi /vmlinuz-4.17.7-200.fc28.x86_64 root=/dev/mapper/fedora-root ro”之后的位置,X:捕获内核预留的内存大小,Y:代表保留内存的起始位置地址。
### 修改后的文件
menuentry 'Fedora (4.17.7-200.fc28.x86_64) 28 (Workstation Edition)' --class fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-4.16.3-301.fc28.x86_64-advanced-56130196-332b-4c5d-8387-67bba2d45054' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt2'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root crashkernel=auto  --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  9cc3b942-1abe-4b8e-98fb-c0cd1186223e
    else
      search --no-floppy --fs-uuid --set=root 9cc3b942-1abe-4b8e-98fb-c0cd1186223e
    fi
    linuxefi /vmlinuz-4.17.7-200.fc28.x86_64 root=/dev/mapper/fedora-root ro resume=/dev/mapper/fedora-swap crashkernel=auto   rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet LANG=zh_CN.UTF-8
    initrdefi /initramfs-4.17.7-200.fc28.x86_64.img
}
  1. 开启kdump服务

    • x86平台:
     systemctl start kdump && systemctl enable kdump
    
    • mips平台:不用自己手动启动此服务。
  2. 第一个内核启动后,载入转储捕获内核

载入转储捕获内核,命令规范:

   kexec -p <dump-capture-kernel-vmlinux-image> \
   --initrd=<initrd-for-dump-capture-kernel> --args-linux \
   --append="root=<root-dev> <arch-specific-options>"
  1. 测试配置是否有效
	echo c > /proc/sysrq-trigger
 make menconfig
crash
crash  kernel-debuginfo vmcore