如何在 CentOS/RHEL 8 中配置 Early-kdump 支持功能

什么是早期的 kdump 支持?

在以前的 CentOS/RHEL 版本 (5/6/7) 中,kdump 服务会在启动顺序中很晚才启动。
所以早期崩溃信息在启动过程中丢失了。
从 CentOS/RHEL 8 开始,引入了一种称为“早期 kdump 支持”的新 kdump 机制来解决这个问题。
早期 Kdump 将崩溃内核的 vmlinuz 和 initramfs 存储在引导内核的 initramfs 中,并在早期引导阶段将它们直接加载到保留内存(crashkernel)中。

“kexec-tools”包现在有 2 个另外的模块,用于在引导序列期间尽早加载崩溃内核和 initramfs,以捕获引导内核的内核崩溃转储。

/usr/lib/dracut/modules.d/99earlykdump/early-kdump.sh
/usr/lib/dracut/modules.d/99earlykdump/module-setup.sh
# dracut --list-modules | grep earlykdump
earlykdump

默认情况下,早期的 kdump 支持是禁用的,我们必须手动启用它。
它还支持 CentOS/RHEL 5. 6. 7 中早期 kdump 配置支持的所有转储目标和配置参数。

更多: zhilu jiaocheng

重新创建 iniramfs

  1. 现在下一步是重新创建 initramfs 以添加 early-kdump 模块:
# lsinitrd | grep -i early
# dracut -f --add earlykdump

例如:

# lsinitrd |grep -i early
Arguments: -f --add 'earlykdump'
earlykdump
-rwxr-xr-x 1 root root 1940 Jun 17 10:29 usr/lib/dracut/hooks/cmdline/00-early-kdump.sh
  1. 重新启动服务器以加载更改
# reboot
  1. 一旦服务器重新上线,检查 early-kdump 的状态:
# journalctl -x |grep -i early-kdump
Aug 20 16:08:09 [HOSTNAME] dracut-cmdline[196]: early-kdump is enabled.
Aug 20 16:08:10 [HOSTNAME] dracut-cmdline[196]: kexec: loaded early-kdump kernel

测试早期kdump

现在让我们使用自定义的 systemd 单元文件测试 early-kdump,并使用 SysRq 崩溃来制造恐慌。

  1. 创建单元文件名 /etc/systemd/system/test_early_kdump.service 。
# touch /etc/systemd/system/test_early_kdump.service
  1. 提供适当的权限:
# chmod 664 /etc/systemd/system/test_early_kdump.service

单元文件应如下所示:

# cat /etc/systemd/system/test_early_kdump.service
[Unit]
Description=test_early_kdump Service
Before=kdump.service
[Service]
ExecStart=/usr/local/test_early_kdump.sh
Type=simple
[Install]
WantedBy=default.target
  1. 然后创建另一个脚本/usr/local/test_early_kdump.sh文件来传递sysrq crash命令:
# cat /usr/local/test_early_kdump.sh
#!/bin/bash
/usr/bin/echo c > /proc/sysrq-trigger
  1. 为脚本提供可执行权限:
# chmod +x /usr/local/test_early_kdump.sh
  1. 重新加载 systemd 守护进程:
# systemctl daemon-reload

重要提示:不要启动 test_early_kdump.service(测试崩溃)服务,否则系统会立即崩溃。

  1. 在引导级别启用此 test_early_kdump 服务:
# systemctl enable test_early_kdump.service
  1. 重启系统:
# reboot

注意:当系统按照自定义测试脚本启动时,它会触发崩溃并继续重启。

  1. 禁用自定义单元和脚本文件并在测试后删除。
    使用“systemd.unit=rescue.target”以救援模式启动系统,并在启动时禁用“test_early_kdump”服务。
# systemctl disable test_early_kdump.service

以上命令禁用自定义单元文件。
下次系统将正常启动。

  1. TEST 崩溃完成后,删除自定义单元文件和崩溃脚本文件:
# rm /etc/systemd/system/test_edump.service
rm: remove regular file '/etc/systemd/system/test_edump.service'? y
# rm /usr/local/test_early_kdump.sh
  1. 根据为 vmcore 提到的 kdump.conf(路径 /var/crash)检查 /var/crash/ 文件夹:
# ls -l /var/crash/127.0.0.1-2019-08-20-17:09:23
total 56648
-rw-------. 1 root root 57959829 Aug 20 17:09 vmcore
-rw-r--r--. 1 root root 41452 Aug 20 17:09 vmcore-dmesg.txt

配置kdump服务

  1. 参考下面的kdump配置贴来配置kdump并确保kdump服务处于运行状态。

CentOS/RHEL 7:如何配置 kdump

# systemctl enable --now kdump.service
# systemctl status kdump.service
● kdump.service - Crash recovery kernel arming
Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2019-08-19 23:42:11 IST; 16h ago
Main PID: 1255 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 26213)
Memory: 0B
CGroup: /system.slice/kdump.service
Aug 19 23:42:09 <HOSTNAME> systemd[1]: Starting Crash recovery kernel arming...
Aug 19 23:42:11 <HOSTNAME> kdumpctl[1255]: Kdump already running: [WARNING]
Aug 19 23:42:11 <HOSTNAME> systemd[1]: Started Crash recovery kernel arming.
  1. 列出系统中可用的 early-dump 模块
# dracut --list-modules | grep earlykdump
earlykdump
  1. 将参数 rd.earlykdump 添加到 /boot/grub2/grubenv 文件中的 kernelopts 行:
# cat /boot/grub2/grubenv
# GRUB Environment Block
saved_entry=4eb68bf18e86437d9c957ff4863a3288-4.18.0-80.el8.x86_64
kernelopts=root=/dev/mapper/ol-root ro crashkernel=auto resume=/dev/mapper/ol-swap rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rd.earlykdump
boot_success=0
日期:2020-09-17 00:13:18 来源:oir作者:oir