生产内核(production kernel):产品或者线上服务器当前运行的内核。
捕获内核(capture kernel):系统崩溃时,使用kexec启动的内核,该内核用于捕获生产内核当前内存中的运行状态和数据信息。
Kdump是系统崩溃的时候,用来转储运行内存的一个工具。系统一旦崩溃,生产内核就没法正常工作,这时Kdump启动捕获内核,将此时内存中的所有运行状态和数据信息收集到一个dump core文件中,以便之后分析崩溃原因。一旦内存信息收集完成,系统将自动重启。
Kdump的核心实现基于Kexec(Kernel execution),kexec类似于Linux的exec系统调用。
Kexec可以快速启动一个新的内核(捕获内核),它会跳过BIOS或者Bootloader等引导程序的初始化阶段,这个特性可以让系统崩溃时快速切换到捕获内核,这样生产内核的内存就得到保留,Kdump的工作流程如下图所示:
捕获内核启动后,会像一般内核一样,去运行为它创建的ramdisk上的init程序。而各种转储机制都可以事先在init中实现。
为了在生产内核崩溃时能顺利启动捕获内核,捕获内核以及它的ramdisk是事先放到生产内核的内存中的(保留内存)。
生产内核的内存是通过/proc/vmcore这个文件交给捕获内核的,为了生成它,用户工具在生产内核中分析出内存的使用和分布等情况,然后把这些信息综合起来生成一个ELF头文件保存起来。捕获内核被引导时会被同时传递这个ELF文件头的地址,通过分析它,捕获内核就可以生成出/proc/vmcore。有了/proc/vmcore这个文件,捕获内核的ramdisk中的脚本就可以通过通常的文件读写和网络来实现各种策略了。
资料直通车:Linux内核源码技术学习路线+视频教程内核源码