美文网首页
Linux内核转储机制分析:从kexec到crash

Linux内核转储机制分析:从kexec到crash

作者: 2puT | 来源:发表于2018-08-05 15:08 被阅读0次

想要了解 Linux 内核转储机制,就要从 kexec - > kdump - > crash 这个递进过程去分析。

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

一. 工具介绍及其所负责任务

  1. kexec
  2. kdump
  3. crash

1. kexec工具

kexec是内核更换,免于再次经历固件的工具,节省了内核开发者的时间。kexec实现了在一个内核里启动另一个内核。

安装
yum install kexec-tools

kexec两种使用方式

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

kdump是内核转储工具,kexec是实现kdump机制的关键。kdump是基于kexec的内核崩溃转储机制。内存转存机制。

引用自:深入探索 Kdump,第 1 部分:带你走进 Kdump 的世界 过程逻辑图
安装
# yum install kexec-tools
# yum install kernel-debuginfo #包管理器会解决其依赖common包
  • 需要检测本系统内核是否已经选中支持kexec system call,若在“/boot/config-XXXXX”中CONFIG_KEXEC=y则是本版本号的内核已开启;若=n,则需要重新编译内核,选中CONFIG_KEXEC。

  • 替换内核的两个步骤,第一个把新内核的模块目录(在编译内核时创建一个临时目录安装编译好内核的模块)

# 编译好内核之后,建立一个临时目录lib
mkdir -pv lib-kexecKdump-kernel
# 安装内核模块
make modules_install INSTALL_MOD_PATH=./lib/
  • 复制lib/下编译好内核版本号目录的模块,到/lib/modules/下。

一.内核崩溃转储的本质

  • 当系统崩溃时,kdump利用kexec启动另一个内核,这一个内核叫捕获内核,以很小的内存启动捕获内核,第一个内核保留了内存的一部分给捕获内核启动用。kdump利用kexec启动捕获内核,免去启动BIOS(绕过BIOS,没有经历BIOS,节省了系统启动的时间),所以第一个内核的内存得以保留。

  • 捕获内核只会使用分配给他的内存空间,不会污染第一内核的内存数据。

二.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:代表保留内存的起始位置地址。

要设置好“Y保留内存的起始位置地址”,则需要知道你编译捕获内核时的内核载入地址(会在在编译内核开启kdump、vmcore时的第二行会有设置修改)。

### 修改后的文件
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>"
  • 当执行“kexec -p”后,可能会有root没有挂载的情况。是因为initrd参数未起作用,然后在“root=”变量使用设备号(/dev/sdaX),不要使用“hd0,msdogs”或“UUID”,则可以成功。若系统装有crash,则“/var/crash/”有vmcore;若未装vmcore存在于“/proc/vmcore”。
  1. 测试配置是否有效
  • 使用sysrq-c中断将系统崩溃,让kdump捕获崩溃时产生的vmcore,默认存放位置在/var/crash/host@time,配置文件/etc/dump.conf。
    echo c > /proc/sysrq-trigger
  • 成功,重新进入稳定系统。若系统装有crash,则“/var/crash/”有vmcore;若未装vmcore存在于“/proc/vmcore”。

编译内核时小技巧

make menconfig
  • 启用或者禁用某项时,可按“/”搜索某项模块或服务,搜索结果会显示出此服务的地址,与此服务模块依赖的模块是否启用。

参考文献:linux kdump.txt:https://www.kernel.org/doc/Documentation/kdump/kdump.txt

crash

对内核崩溃转储文件做分析的工具,更好的使用此工具,请认真阅读man crash。

crash  kernel-debuginfo vmcore

相关文章

网友评论

      本文标题:Linux内核转储机制分析:从kexec到crash

      本文链接:https://www.haomeiwen.com/subject/yssbvftx.html