什么是 kdump 和 Kexec
Kdump 是 Linux 内核崩溃转储机制。
在系统崩溃的情况下,Kdump 会提供内存转储 (vmcore) 镜像。
该图像可以帮助确定崩溃的原因。
强烈建议我们启用 Kdump 功能。
Kexec 和 Kdump 一起确保更快的启动和创建可靠的内核 vmcores 用于诊断目的。
Kexec 是一种快速启动机制,它允许从已经运行的内核的上下文中启动 Linux 内核,而无需通过 BIOS。
每当系统崩溃时,Kdump 使用 Kexec 引导到第二个内核。
崩溃转储是从新启动的内核的上下文中捕获的,而不是从崩溃内核的上下文中捕获的。
第二个内核以很少的内存启动并捕获转储镜像。
启用 kdump
将 crashkernel 参数添加到 /boot/grub2/grub.cfg 文件后,重新启动系统,以便为捕获内核保留内存。
“free –m”命令正确显示系统可用的内存较少。
使用 systemctl 命令启用 Kdump 服务在引导时启动。
使用 systemctl 命令启动 Kdump 服务。
# systemctl enable kdump # systemctl start kdump
这会通过 Kexec 加载 kernel-kdump 镜像,让系统准备好在崩溃时捕获 vmcore。
生成强制故障转储
我们可以通过使用以下命令强制崩溃系统来测试 kdump 配置:
# echo c > /proc/sysrq-trigger
这会导致显示紧急输出,然后系统重新启动到 Kdump 内核。
当引导过程到达它启动 Kdump 服务的点时,vmcore 被复制到磁盘的默认位置,/var/crash/[YYYY-MM-DD-HH:MM]/vmcore。
然后系统重新引导回正常内核。
注意:Xen domU 来宾不支持 Kdump。
虚拟化系统可以使用 xm dump-core 命令处理紧急情况。
安装和配置 kdump
要启用和使用 Kdump,请安装以下软件包:
# yum install kexec-tools
启用 Kdump 需要我们为捕获内核保留一部分系统内存。
这部分内存不可用于其他用途。
为 Kdump 内核保留的内存量由 crashkernel 引导参数表示。
这将添加到 GRUB 配置文件 /boot/grub2/grub.cfg 中的内核行。
以下示例启用 Kdump 并保留 128 MB 内存:
linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=128M
除了预留内存,你还可以指定这个预留内存的起始地址(偏移量)。
例如,将以下选项添加到内核行会保留 128 MB 的内存,从物理地址 0x01000000 (16 MB) 开始:
crashkernel=128M@16M
要将偏移量设置为 48M:
crashkernel=128M@48M
如果 内存 超过 128 GB,请使用以下设置:
crashkernel=512M@64M
如果需要对保留内存的大小和位置进行更多控制,请使用以下格式:
crashkernel=range1:size1[,range2:size2,...][@offset]
range[n] 值指定与系统中存在的物理 内存 量匹配的值范围。
相应的 size[n] 值指定要保留的 Kexec 内存量。
如果系统包含 512 MB 到 2 GB 的内存,以下示例告诉 Kexec 保留 64 MB 的 内存。
如果系统包含超过 2 GB 的物理内存,请预留 128 MB:
crashkernel=512M-2G:64M,2G-:128M
在内存至少为 2 GB 的 x86_64 系统上,我们可以自动为 kdump 分配内存。
使用以下参数自动为 kdump 分配内存:
crashkernel=auto