什么是早期的 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
- 现在下一步是重新创建 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
- 重新启动服务器以加载更改
# reboot
- 一旦服务器重新上线,检查 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 崩溃来制造恐慌。
- 创建单元文件名 /etc/systemd/system/test_early_kdump.service 。
# touch /etc/systemd/system/test_early_kdump.service
- 提供适当的权限:
# 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
- 然后创建另一个脚本/usr/local/test_early_kdump.sh文件来传递sysrq crash命令:
# cat /usr/local/test_early_kdump.sh #!/bin/bash /usr/bin/echo c > /proc/sysrq-trigger
- 为脚本提供可执行权限:
# chmod +x /usr/local/test_early_kdump.sh
- 重新加载 systemd 守护进程:
# systemctl daemon-reload
重要提示:不要启动 test_early_kdump.service(测试崩溃)服务,否则系统会立即崩溃。
- 在引导级别启用此 test_early_kdump 服务:
# systemctl enable test_early_kdump.service
- 重启系统:
# reboot
注意:当系统按照自定义测试脚本启动时,它会触发崩溃并继续重启。
- 禁用自定义单元和脚本文件并在测试后删除。
使用“systemd.unit=rescue.target”以救援模式启动系统,并在启动时禁用“test_early_kdump”服务。
# systemctl disable test_early_kdump.service
以上命令禁用自定义单元文件。
下次系统将正常启动。
- 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
- 根据为 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服务
- 参考下面的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.
- 列出系统中可用的 early-dump 模块
# dracut --list-modules | grep earlykdump earlykdump
- 将参数 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