什么是kdump?

kdump 是一种可靠的内核故障转储机制,它利用 kexec 软件。
崩溃转储是从新启动的内核的上下文中捕获的;不是来自崩溃内核的上下文。
每当系统崩溃时,Kdump 使用 kexec 引导到第二个内核。
第二个内核,通常称为捕获内核,以很少的内存启动并捕获转储镜像。

使用 kdump 允许在不通过 BIOS 的情况下启动捕获内核,因此第一个内核内存的内容被保留,这本质上是内核崩溃转储。

配置核心收集器

为了减小 vmcore 转储文件的大小,kdump 允许我们指定一个外部应用程序(一个核心收集器)来压缩数据,并可以选择忽略所有不相关的信息。
目前,唯一完全受支持的核心收集器是 makedumpfile。

要启用转储文件压缩,请添加 -c 参数。
例如:

core_collector makedumpfile -c

要从转储中删除某些页面,请添加 -d value 参数,其中 value 是要省略的页面值的总和。

例如,要同时删除零页和空闲页,请使用以下命令:

core_collector makedumpfile -d 17 -c

在哪里可以找到生成的 vmcores?

当虚拟机管理程序恢复时,默认情况下可以在 /var/crash/下找到 vmcore:

[root@host ~]# egrep '^path' /etc/kdump.conf
path /var/crash

重要说明:确保我们指定用于存储 vmcore 的分区的可用磁盘空间至少大于系统上的整个物理内存。
如果物理内存为 131GB,请保持我们在 kdump.conf 中使用的位置的磁盘空间/大小至少超过 131GB

安装 kdump

为了在系统上使用 kdump 服务,请确保我们安装了 kexec-tools 包。

为此,请以 root 身份在 shell 提示符下键入以下内容:

# yum install kexec-tools

在 IBM Power (ppc64) 和 IBM System z (s390x) 上,捕获内核在一个名为 kernel-kdump 的单独软件包中提供,必须安装该软件包才能使 kdump 发挥作用:

# yum install kernel-kdump

启用服务

要在引导时启动 kdump 守护进程,请以 root 身份在 shell 提示符下键入以下内容:

# systemctl enable kdump.service

这将为 multi-user.target 启用服务。
同样,键入 systemctl stop kdump 将禁用它。
要在当前会话中启动服务,请以 root 身份使用以下命令:

# systemctl start kdump.service

分析被挂起的任务(僵死的进程)

当检测到挂起的任务时,我们必须使用“hung_task_panic”来控制内核的行为。

如果启用了 CONFIG_DETECT_HUNG_TASK,则会显示此文件。

0: continue operation. This is the default behavior.
1: panic immediately

对于临时更改:

# echo 1 > /proc/sys/kernel/hung_task_panic

对于永久性更改

# echo 'kernel.hung_task_panic=1' >> /etc/sysctl.d/99-sysctl.conf
# sysctl -p

有了这个,每当看到阻塞进程时,就会发生内核恐慌并生成核心转储,可以进一步分析以调试问题。

kernel: INFO: task taskMonitor:6223 blocked for more than 120 seconds.
kernel: INFO: task top:7355 blocked for more than 120 seconds.

添加引导参数

“crashkernel=”选项可以通过多种方式定义。

  • auto 值启用根据系统中的内存总量自动配置保留内存。从 RHEL7 内核开始,通常应该使用 crashkernel=auto。内核会自动为 kdump 内核预留适量的内存。
    注意:带有 crashkernel=auto 的 RHEL7 只会在具有 2GB 或者更多物理内存的系统上保留内存。如果系统内存小于2GB,则必须通过显式请求预留大小来预留内存,例如:crashkernel=128M。
  • 某些系统需要保留具有特定固定偏移量的内存。如果设置了偏移量,则保留的内存从那里开始。要偏移保留内存,请使用以下语法:
crashkernel=128M@16M

上面的例子意味着 kdump 保留了 128 MB 的内存,从 16 MB(物理地址 0x01000000)开始。
如果 offset 参数设置为 0 或者完全省略,kdump 会自动偏移保留的内存

示例 GRUB2 配置文件 (/etc/sysconfig/grub)

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="novga console=ttyS0,115200 panic=1 numa=off elevator=cfq rd.md.uuid=3b1e2dc9:8f31253e:a3a9cb3f:2c9cd9d1 rd.lvm.lv=os/root rd.md.uuid=dbf7f100:c0850807:9423a785:1a3f0acd rd.md.uuid=31eb0dce:3cc298b6:8d64f1d1:e3db25b2 rhgb quiet crashkernel=auto"
GRUB_DISABLE_RECOVERY="true"

修改 /etc/sysconfig/grub 后,使用编辑后的默认文件重新生成 GRUB2 配置。
如果系统使用 BIOS 固件,请执行以下命令:

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-862.6.3.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.6.3.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-744622670ad74ca599b5c9c5734c1c81
Found initrd image: /boot/initramfs-0-rescue-744622670ad74ca599b5c9c5734c1c81.img
done

注意:添加 crashkernel 参数后,系统必须重新启动,以便保留 crashkernel 内存供 kdump 使用。

内存要求

为了让 kdump 能够捕获内核崩溃转储并将其保存以供进一步分析,必须为捕获内核永久保留一部分系统内存。
保留时,这部分系统内存不可用于主内核。

内存要求因某些系统参数而异。
主要因素之一是系统的硬件架构。
要找出机器架构的确切名称(例如 x86_64)并将其打印到标准输出,请在 shell 提示符下键入以下命令:

# uname -m

影响要保留的内存量的另一个因素是已安装的系统内存总量。
例如,在 x86_64 架构上,每 4 KB 内存 保留的内存量为 160 MB + 2 位。
在安装了 1 TB 总物理内存的系统上,这意味着 224 MB (160 MB + 64 MB)。

测试 kdump 配置

要测试配置,请在启用 kdump 的情况下重新启动系统,并确保服务正在运行:

# systemctl is-active kdump
active

然后在 shell 提示符下键入以下命令:

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

这会强制 Linux 内核崩溃,并将地址-YYYY-MM-DD-HH:MM:SS/vmcore 文件复制到我们在配置中选择的位置(即默认为 /var/crash/) .

# tree /var/crash/
/var/crash/
├── 127.0.0.1-2015-08-20-13:12:35
│   └── vmcore
│ └── vmcore-dmesg.txt
└── lost+found
如何在 RHEL 7/CentOS 7 中配置和安装 kdump (crashkernel)
日期:2020-06-02 22:18:25 来源:oir作者:oir