1、kdump简单描述
kdump是Linux中的一个内核转储机制,主要用于当Linux内核发生崩溃时,将该内核相关的信息和崩溃原因通过转储的形式保留下来,在debian系统中,相关信息会存储在dump文件中,在OpenEuler和CentOS等系统中则是vmcore文件中,以供后期开发人员通过crash工具进行相关的分析。
2、kdump转储过程的简明描述
2.1、信息转储运行环境:生产内核+捕捉内核+ramdisk
在kdump中,构成转储运行环境大致由三个部分构成,即生产内核、捕捉内核和ramdisk,其相关概念如下:
- 生产内核(production kernel)——指当前Linux系统运行的内核;
- 捕捉内核(crash kernel)——当生产内核发生崩溃时,用于转储生产内核各类信息的内核;
- ramdisk——部分运存(RAM)模拟出来的虚拟磁盘,因为这个虚拟磁盘是通过RAM模拟出来的,而非物理磁盘,因此其读写速度非常快。
基于这三个部分,转储的过程可以简单描述为——当生产内核发生崩溃时,捕捉内核会随之启动,同时RAM中的一部分会被模拟为虚拟磁盘ramdisk,从而构成一个简单的运行环境,因ramdisk读写速度很快的特点,生产内核在崩溃时的相关信息会通过捕捉内核快速写入ramdisk中,然后由ramdisk将转储信息生成为ELF格式的文件,并输出到物理磁盘中,文件生成的过程全部结束后,系统将进行重启。
2.2、kexec的作用和运行原理
kexec用于启动捕捉内核,正常情况下,系统内核的启动需要通过BIOS进行引导,但kexec能使得捕捉内核绕开BIOS进行启动,原因在于,BIOS启动内核的过程中会启动大量的外设设备,延长了启动时间,而这些外设设备对于捕捉内核来说是无用的,加之生产内核崩溃时的不稳定状态需要捕捉内核尽可能快的进行信息的转储,因此捕捉内核的启动是通过kexec进行的,kexec实现了在生产内核的基础上快速启动捕捉内核。
而针对于kexec的运行原理,主要围绕内核空间中的kexec_load和用户空间中的kexec_tools来进行,相关作用如下:
- kexec_load——在生产内核正常启动时,将捕捉内核加载到指定的地址;
- kexec_tools——将捕捉内核的地址传递给生产内核,以便生产内核崩溃时,能快速寻址到捕捉内核,实现捕捉内核的启动。
3、kdump的安装、配置和使用
3.1、针对kdump的安装说明
每个Linux发行版安装kdump的思路是相同的,如下:
- 安装kdump本身组件(kexec-tools、kdump-tools)、crash工具和kernel-debuginfo;
- 然后是通过修改
/etc/default/grub
文件中的GRUB_CMDLINE_LINUX
参数来定义分配给捕捉内核的运存(RAM)大小; - 更新grub后重启系统。
而针对于需要安装的组件,说明如下:
- kexec-tools和kdump-tools——kdump本身的组件;
- crash——用于结合vmlinux文件对转储文件(dump或vmcore)进行分析的工具;
- kernel-debuginfo——用于生成当前版本内核vmlinux文件的debug安装包;
kernel-debuginfo在各个发行版的名称不一样,部分发行版名称如下(均以amd64架构为例):
Linux发行版名称 | kernel-debuginfo名称 | 获取方式 |
---|---|---|
debian | linux-image-amd64-dbg | apt包管理器获取 |
OpenEuler | kernel-debuginfo | yum包管理器获取 |
CentOS 7/CentOS-Stream 8 | kernel-debuginfo | 在debuginfo.centos.org手动搜索下载对应内核版本 |
CentOS-Stream 9 | kernel-debug* | yum包管理器获取,但安装完成后未生成vmlinux文件,编译内核源码也暂未成功 |
3.2、debian下安装kdump并模拟内核崩溃过程
(1)确保软件下载、安全更新和系统更新的apt源是一致的(/etc/apt/sources.list)
之所以强调debian系统中需要三个源保持一致,是因为debian系统在最初的安装过程中,虽然有让用户自行选择镜像源的选项,但这个镜像源只会改变软件下载和系统更新两个源,而安全更新仍旧是设置的debian的官方源,这会导致两个问题——一是在国内网络环境里下载linux-image-amd64-dbg十分缓慢;二是debian在全球的镜像源缓存官方源存在一个时间差的问题,可能会导致从官方安全源上获取到的linux-image-amd64-dbg和镜像源更新到的Linux内核出现版本不一致的情况,从而致使crash无法通过vmlinux文件解析到dump转储文件内容。
(2)通过命令“apt install kexec-tools kdump-tools crash -y
”安装相应组件
(3)通过命令“vim /etc/default/grub
”修改GRUB_CMDLINE_LINUX
参数,设定捕捉内核的RAM大小
示例:GRUB_CMDLINE_LINUX参数的语法规则如下:
GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M quit,4G-64G:256M quit,64G-:512M"
以上表示:若RAM在1G~4G之间,分配192M给捕捉内核,后面也这样对比;
quit表示内核启动时过滤掉不必要的输出信息
(4)输入“grub2-mkconfig -o /boot/grub2/grub.cfg
”命令,更新grub
(5)输入“reboot
”命令,重启操作系统
(6)输入“kdump-config show
”或者“cat /sys/kernel/kexec_crash_loaded
”命令,查看kdump是否成功开启
(7)通过命令“echo c > /proc/sysrq-trigger
”,人为制造一个内核崩溃,此命令会触发kdump转储机制,转储完成后,操作系统会自动重启,重启完成后,/var/crash目录下会生成转储日志和转储文件
(8)通过命令“apt install linux-image-amd64-dbg -y
”下载debian的kernel-debuginfo工具,此命令会生成当前版本内核的vmlinux文件,用于crash工具去解析生成的dump转储文件,一般来说,debian系统在安装linux-image-amd64-dbg后,vmlinux文件会在以下类似目录:
(9)通过命令“crash /usr/lib/debug/lib/modules/5.10.0-21-amd64/vmlinux /var/crash/202301261819/dump.202301261819
”,利用crash工具解析dump转储文件,可看到内核崩溃时的大体信息,如果要深入进行分析,则可以利用crash工具中的命令进行查看,crash工具的命令可自行查阅
KERNEL:系统崩溃时运行的 kernel 文件
DUMPFILE:内核转储文件
CPUS: 所在机器的 CPU 数量
DATE: 系统崩溃的时间
TASKS:系统崩溃时内存中的任务数
NODENAME:崩溃的系统主机名
RELEASE:和 VERSION: 内核版本号
MACHINE:CPU 架构
MEMORY:崩溃主机的物理内存
PANIC:崩溃类型,常见的崩溃类型包括:
SysRq(System Request):通过魔法组合键导致的系统崩溃,通常是测试使用。通过 echo c > /proc/sysrq-trigger,就可以触发系统崩溃。
oops:可以看成是内核级的 Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到 Segfault 信号,一般行为是 coredump,应用程序也可以自己截获 Segfault 信号,自行处理。如果内核自己犯了这样的错误,则会弹出 oops 信息。
(参考来源:https://zhuanlan.zhihu.com/p/354552321)
3.3、OpenEuler下安装kdump并模拟内核崩溃过程
(1)OpenEuler本身已经内置并启用了kdump,因此不用单独下载,通过“systemctl status kdump
”或者“cat /sys/kernel/kexec_crash_loaded
”检查kdump状态即可
(2)通过命令“vim /etc/default/grub
”修改GRUB_CMDLINE_LINUX
参数,设定捕捉内核的RAM大小
(3)输入“grub2-mkconfig -o /boot/grub2/grub.cfg
”命令,更新grub
(4)输入“reboot
”命令,重启操作系统
(5)通过命令“echo c > /proc/sysrq-trigger
”,人为制造一个内核崩溃,此命令会触发kdump转储机制,转储完成后,操作系统会自动重启,重启完成后,/var/crash目录下会生成转储日志和转储文件
(6)通过命令“yum install crash -y
”安装crash工具
(7)通过命令“yum install kernel-debuginfo -y
” 下载OpenEuler的kernel-debuginfo工具,此命令会生成当前版本内核的vmlinux文件,用于crash工具去解析生成的vmcore转储文件,一般来说,OpenEuler系统在安装kernel-debuginfo后,vmlinux文件会在以下类似目录:
(8)通过命令“crash /usr/lib/debug/usr/lib/modules/4.19.90-2301.5.0.0185.oe1.x86_64/vmlinux /var/crash/127.0.0.1-2023-01-28-10\:39\:33/vmcore
”,利用crash工具解析dump转储文件,可看到内核崩溃时的大体信息,如果要深入进行分析,则可以利用crash工具中的命令进行查看,crash工具的命令可自行查阅
3.4、自定义编译内核的Linux系统下使用kdump
下图展示的是Linux内核源码编译安装的大致过程,一般以来说,当源码编译安装成功进行到“make bzImage
”后,vmlinux就会编译生成至kernel编译目录下,这里的vmlinux可用于crash工具的解析:
4、注意事项和扩充知识
(1)kdump的配置过程中,最费精力的一个步骤是kernel-debuginfo的安装和vmlinux文件的获取,因为每个发行版对于kernel-debuginfo的安装方式是不同的,因此需要具体查阅对应发行版的官方手册;
(2)正如3.2章节的第一个步骤那样,如果是debian系统,需要在配置前检查软件下载、系统更新和安全更新三个源是否一致,以防止vmlinux和dump转储文件不一致的情况出现;
(3)vmlinux和vmlinuz这两个文件均是Linux内核运行文件,区别在于vmlinuz是压缩之后的文件,而vmlinux没有压缩,在各个Linux发行版中,如果内核不是自行通过编译方式安装的话,vmlinux通常不会附带在系统中,需要通过安装kernel-debuginfo生成。