前言
我们在分析 Linux 操作系统为什么异常重启的时候,往往会用到一个工具--kdump,今天就介绍一下这个工具的用法。
kdump
kdump 是一种内核崩溃转储机制,它会在系统崩溃时收集整个内存信息,用于异常事件的定位分析。
当程序或操作人员通过魔术键c或其他原因导致标准内核(即正常运行的内核)崩溃时,kdump 会切换到crash内核,该内核用于捕获标准内核崩溃时的内存信息。
配置kdump服务
系统启动配置
kdump 服务依赖于预留内存,可以通过内核启动参数 carshkernel 配置预留内存,配置后,必须重启系统以生效。配置文件为/boot/grub2/grub.cfg
,参数配置如下:
| 系统内核启动参数 | 描述 | 默认值 | 备注 | |--------------------------------------|------------------------------------------|-----------------------|----------------------------------------------------| | crashkernel=A | 在4G以下的物理内存预留A大小的内存给kdump使用 | 默认配置512M,用户可以根据实际情况调整 | 该配置方法只在4G一下内存预留,必须保证4G以下连续可用内存足够预留 | | crashkernel=A@B | 在B起始地址预留A大小的内存给kdump使用 | 无,用户可根据实际情况调整 | 需要确保B起始地址的A大小内存未被其它模块预留 | | crashkernel=A,high | 在4G以下的物理内存预留256M大小,在4G以上预留A大小的内存给kdump使用 | 无,用户可根据实际情况调整 | 确保4G以下内存有连续256M可用内存,4G以上有连续A大小可用内存。实际预留内存大小为256M+A | | crashkernel=A,low crashkernel=B,high | 在4G以下的物理内存预留A大小,在4G以上预留B大小内存给kdump使用 | 无,用户可根据实际情况调整 | 需要确保4G以下有A大小连续内存可用,4G以上有B大小连续可用内存。实际预留内存大小为A+B |
注意:
系统启动后的 cmdline 参数中必须包含预留内存参数 crashkernel=xx,否则不能预留kdump内存,kdump服务无法正常工作。可以通过命令cat /proc/cmdline
进行查看。
预留内存总大小建议配置512M及以上。
kdump内核配置
kdump内核启动的相关参数在/etc/sysconfig/kdump
文件中配置:
| 参数 | 含义 | 取值 | |--------------------------|---------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | KDUMP_COMMANDLINE_APPEND | kdump启动参数中追加的参数 | irqpoll nr_cpus=1 reset_devices cgroup_disable=memory udev.children-max=2 panic=10 swiotlb=noforce novmcoredd rd.timeout=120 rd.emergency=reboot acpi_no_memhotplug transparent_hugepage=never nokaslr numa=off | | KDUMP_COMMANDLINE_REMOVE | 大内核命令行中的一些参数不适合kdump内核,可以通过这个变量将这些参数删除,然后作用于kdump内核的命令行 | hugepages hugepagesz slub_debug quiet |
kdump服务配置
kdump的各服务配置在/etc/kdump.conf
文件中配置:
| 参数 | 含义 | 取值 | |----------------|----------------------------------|----------------------------------------------------------| | failure_action | kdump失败后的默认执行操作 | shell:kdump失败后启动bash;reboot:重启;或者poweroff:关机。当前默认为reboot | | path | 保存kdump日志的绝对路径 | 默认保存在/var/crash路径下 | | dracut_args | dracut打包kdump initrd的参数 | 默认值参看/etc/kdump.conf文件中的dracut_args | | core_collecter | 保存kdump日志工具 | 默认为makedumpfile,其中-d项指定过内存级别为31,用户无需修改 | | kdump_obj | 设置kdump保存vmcore | vmcore:保存vmcore | | keep_old_dumps | 历史kdump日志保存个数 | 0和-1:只保存当前日志,默认设置-1;其它大于0的值:保存日志数 | | watchdog_time | 设置kdump过程自动复位时间(秒),防止kdump保存时间过长 | 默认为3600秒。 | | kdump_post | kdump流程中日志转储完成后执行的脚本 | 默认配置不要修改 | | kdump_pre | kdump流程中日志转储开始前执行的脚本 | 默认配置不要修改 |
管理kdump服务
以下命令可以管理kdump服务:
systemctl status kdump # 查询kdump服务状态
systemctl start kdump # 开启kdump服务
systemctl stop kdump # 停止kdump服务
systemctl restart kdump # 重启kdump服务
注意项
-
• kdump过程受到磁盘写速度、内存使用率、逻辑狗叫时间等因素限制、kdump过程产生的vmcore可能存在不完整的情况。
-
• kdump时间与内存规格强相关,内存越大,dump时间越长,产生的vmcore越大。
-
• 在KASLR机制开启并且生效时,如果将
/proc/sys/kernel/kptr_restrict
设置为2,会导致kdump服务不可用。/proc/sys/kernel/kptr_restrict
用来控制/proc/kallsyms
文件的读写权限,取值范围为0、1、2,默认为0. -
• 首次启动kdump时,由于需要制作initramfs镜像,且io压力会影响次过程时间,因此启动时间可能会比较长,最长耗时1~2分钟。