41.2. 在命令行中配置 kdump
在系统引导过程中为 kdump 保留内存。您可以在系统的 Grand Unified Bootloader (GRUB)配置文件中配置内存大小。内存大小取决于配置文件中指定的 crashkernel= 值以及系统物理内存的大小。
41.2.1. 估算 kdump 大小 复制链接链接已复制到粘贴板!
在规划和构建 kdump 环境时,务必要知道崩溃转储文件所需的空间。
makedumpfile --mem-usage 命令估计崩溃转储文件所需的空间。它生成一个内存使用率报告。这个报告可帮助您决定转储级别以及安全排除的页面。
流程
输入以下命令生成内存用量报告:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
makedumpfile --mem-usage 命令会以页为单位报告所需的内存。这意味着您必须根据内核页面大小计算所使用的内存大小。
41.2.2. 配置 kdump 内存用量 复制链接链接已复制到粘贴板!
为 kdump 的内存保留在系统引导过程中发生。内存大小是在系统的 Grand Unified Bootloader (GRUB)配置中设定的。内存大小取决于配置文件中指定的 crashkernel= 选项的值以及系统物理内存的大小。
您可以使用多种方式定义 crashkernel= 选项。您可以指定 crashkernel= 值或配置 auto 选项。crashkernel=auto 参数根据系统中的物理内存总量自动保留内存。配置后,内核将自动为捕获内核保留适当数量的所需内存。这有助于防止内存不足(OOM)错误。
kdump 的自动内存分配因系统硬件架构和可用内存大小而异。
如果系统自动分配低于最小内存阈值,您可以手动配置保留内存量。
先决条件
- 您在系统上具有 root 权限。
-
满足
kdump配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
准备
crashkernel=选项。例如:要保留 128 MB 内存,请使用:
crashkernel=128M
crashkernel=128MCopy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以根据安装的内存总量将保留内存量设置为变量。变量中的内存保留语法为
crashkernel=<range1>:<size1>,<range2>:<size2>。例如:crashkernel=512M-2G:64M,2G-:128M
crashkernel=512M-2G:64M,2G-:128MCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统内存总量为 512 MB 和 2 GB,则命令保留 64 MB 内存。如果内存量超过 2 GB,则内存保留为 128 MB。
保留内存的偏移。
有些系统需要保留具有特定固定偏移量的内存,因为
crashkernel保留在早期发生,您可能需要为特殊用途保留更多内存。当您定义了一个偏移时,保留的内存将从这个偏移位置开始。要偏移保留的内存,请使用以下语法:crashkernel=128M@16M
crashkernel=128M@16MCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在这个示例中,
kdump从 16 MB 开始保留 128 MB 内存(物理地址0x01000000)。如果将偏移参数设置为 0 或完全省略,kdump会自动偏移保留内存。在设置变量内存保留时,也可以使用此语法。在这种情况下,偏移总是指定最后一个。例如:crashkernel=512M-2G:64M,2G-:128M@16M
crashkernel=512M-2G:64M,2G-:128M@16MCopy to Clipboard Copied! Toggle word wrap Toggle overflow
将
crashkernel=选项应用到引导装载程序配置:grubby --update-kernel=ALL --args="crashkernel=<value>"
# grubby --update-kernel=ALL --args="crashkernel=<value>"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<value>替换为您在上一步中准备的crashkernel=选项的值。
41.2.3. 配置 kdump 目标 复制链接链接已复制到粘贴板!
崩溃转储通常以一个文件形式存储在本地文件系统中,直接写入设备。另外,您可以使用 NFS 或 SSH 协议通过网络发送崩溃转储。一次只能设置其中一个选项来保留崩溃转储文件。默认行为是将其存储在本地文件系统的 /var/crash/ 目录中。
先决条件
- 您在系统上具有 root 权限。
-
满足
kdump配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
要将崩溃转储文件保存在本地文件系统的
/var/crash/目录中,请编辑/etc/kdump.conf文件并指定路径:path /var/crash
path /var/crashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 选项
path /var/crash代表kdump在其中保存崩溃转储文件的文件系统的路径。注意-
当您在
/etc/kdump.conf文件中指定转储目标时,路径是相对于指定的转储目标。 -
当您没有在
/etc/kdump.conf文件中指定转储目标时,该路径表示根目录的绝对路径。
根据当前系统中挂载的文件系统,会自动配置转储目标和调整的转储路径。
-
当您在
要保护
kdump生成的崩溃转储文件以及附带文件,您应该为目标目的地目录设置正确的属性,如用户权限和 SELinux 上下文。另外,您可以定义一个脚本,如kdump.conf文件中的kdump_post.sh,如下所示:kdump_post <path_to_kdump_post.sh>
kdump_post <path_to_kdump_post.sh>Copy to Clipboard Copied! Toggle word wrap Toggle overflow kdump_post指令指定kdump完成捕获并将崩溃转储保存到指定的目的地 后 执行的 shell 脚本或命令。您可以使用此机制扩展kdump的功能,以执行包括调整文件权限在内的操作。-
kdump目标配置
*grep -v ^# /etc/kdump.conf | grep -v ^$*
# *grep -v ^# /etc/kdump.conf | grep -v ^$*
ext4 /dev/mapper/vg00-varcrashvol
path /var/crash
core_collector makedumpfile -c --message-level 1 -d 31
转储目标已指定了(ext4 /dev/mapper/vg00-varcrashvol),因此它被挂载到 /var/crash。path 选项也被设置为 /var/crash。因此,kdump 将 vmcore 文件保存在 /var/crash/var/crash 目录中。
要更改保存崩溃转储的本地目录,以
root用户身份编辑/etc/kdump.conf配置文件:-
从
#path /var/crash行的开头删除哈希符号(#)。 使用预期的目录路径替换该值。例如:
path /usr/local/cores
path /usr/local/coresCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在 RHEL 8 中,当
kdumpsystemd服务启动时,使用path指令定义为kdump目标的目录必须存在,以避免失败。与早期版本的 RHEL 不同,如果服务启动时目录不存在,则不再自动创建该目录。
-
从
要将文件写入不同的分区,请编辑
/etc/kdump.conf配置文件:根据您的选择,从
#ext4行的开头删除哈希符号(#)。-
设备名称(
#ext4 /dev/vg/lv_kdump行) -
文件系统标签(
#ext4 LABEL=/boot行) -
UUID(
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937行)
-
设备名称(
将文件系统类型和设备名称、标签或 UUID 改为所需的值。指定 UUID 值的正确语法是
UUID="correct-uuid"和UUID=correct-uuid。例如:ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要建议使用
LABEL=或UUID=指定存储设备。无法保证/dev/sda3等磁盘设备名称在重启后保持一致。当您在 IBM Z 硬件上使用 Direct Access Storage Device (DASD)时,请确保在执行
kdump之前,转储设备已在/etc/dasd.conf中正确指定了。
要将崩溃转储直接写入设备,请编辑
/etc/kdump.conf配置文件:-
从
#raw /dev/vg/lv_kdump行的开头删除哈希符号(#)。 使用预期的设备名称替换该值。例如:
raw /dev/sdb1
raw /dev/sdb1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
从
使用
NFS协议将崩溃转储保存到远程机器上:-
从
#nfs my.server.com:/export/tmp行的开头删除哈希符号(#)。 使用有效的主机名和目录路径替换该值。例如:
nfs penguin.example.com:/export/cores
nfs penguin.example.com:/export/coresCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
kdump服务以使更改生效:sudo systemctl restart kdump.service
sudo systemctl restart kdump.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意当使用 NFS 指令指定 NFS 目标时,
kdump.service会自动尝试挂载 NFS 目标,来检查磁盘空间。不需要提前挂载 NFS 目标。要防止kdump.service挂载目标,请在kdump.conf中使用dracut_args --mount指令。这将启用kdump.service,通过--mount参数指定 NFS 目标来调用dracut工具。
-
从
使用 SSH 协议将崩溃转储保存到远程机器上:
-
从
#ssh user@my.server.com行的开头删除哈希符号(#)。 - 使用有效的用户名和密码替换该值。
在配置中包含您的 SSH 密钥。
-
从
#sshkey /root/.ssh/kdump_id_rsa行的开头删除哈希符号。 将该值改为您要转储的服务器中有效密钥的位置。例如:
ssh john@penguin.example.com sshkey /root/.ssh/mykey
ssh john@penguin.example.com sshkey /root/.ssh/mykeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
从
-
从
41.2.4. 配置 kdump 核心收集器 复制链接链接已复制到粘贴板!
kdump 服务使用 core_collector 程序捕获崩溃转储镜像。在 RHEL 中,makedumpfile 工具是默认的内核收集器。它通过以下方式帮助缩小转储文件:
- 压缩崩溃转储文件的大小,并使用各种转储级别仅复制必要的页。
- 排除不必要的崩溃转储页。
- 过滤崩溃转储中包含的页面类型。
RHEL 7 及更高版本中默认启用了崩溃转储文件压缩。
如果您需要自定义崩溃转储文件压缩,请按照以下流程操作。
语法
core_collector makedumpfile -l --message-level 1 -d 31
core_collector makedumpfile -l --message-level 1 -d 31
选项
-
-c、-l或-p:指定每个页的压缩 dump 文件的格式,使用zlib用于-c选项、使用lzo用于-l新选项,或snappy用于-p选项。 -
-d(dump_level):排除页面,它们不会复制到转储文件中。 -
--message-level:指定消息类型。您可以通过使用这个选项指定message_level来限制打印的输出。例如,把message_level设置为 7 可打印常见消息和错误消息。message_level的最大值为 31。
先决条件
- 您在系统上具有 root 权限。
-
满足
kdump配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
-
以
root用户身份编辑/etc/kdump.conf配置文件,并删除#core_collector makedumpfile -l --message-level 1 -d 31开头的哈希符号("#")。 - 输入以下命令来启用崩溃转储文件压缩:
core_collector makedumpfile -l --message-level 1 -d 31
core_collector makedumpfile -l --message-level 1 -d 31
-l 选项指定 转储 压缩的文件格式。-d 选项将转储级别指定为 31。message-level 选项将消息级别指定为 1。
另外,请考虑使用 -c 和 -p 选项的示例:
使用
-c压缩崩溃转储文件:core_collector makedumpfile -c -d 31 --message-level 1
core_collector makedumpfile -c -d 31 --message-level 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
-p压缩崩溃转储文件:core_collector makedumpfile -p -d 31 --message-level 1
core_collector makedumpfile -p -d 31 --message-level 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
41.2.5. 配置 kdump 默认失败响应 复制链接链接已复制到粘贴板!
默认情况下,当 kdump 不能在配置的目标位置创建崩溃转储文件时,系统会重启,转储在此过程中会丢失。您可以更改默认失败响应,并配置 kdump ,来在无法将内核转储保存到主目标时执行不同的操作。额外的操作是:
dump_to_rootfs-
将内核转储保存到
root文件系统。 reboot- 重启系统,在此过程中会丢失内核转储。
halt- 停止系统,在此过程中会丢失内核转储。
poweroff- 关闭系统,在此过程中会丢失内核转储。
shell-
从
initramfs中运行 shell 会话,您可以手动记录内核转储。 final_action-
在
kdump成功或在 shell 或dump_to_rootfs失败操作完成后,启用额外的操作,如reboot、halt和poweroff。默认为reboot。 failure_action-
指定在内核崩溃中转储可能失败时要执行的操作。默认为
reboot。
先决条件
- root 权限。
-
满足
kdump配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
-
以
root用户身份,删除/etc/kdump.conf配置文件中#failure_action行开头的哈希符号(#)。 将值替换为所需的操作。
failure_action poweroff
failure_action poweroffCopy to Clipboard Copied! Toggle word wrap Toggle overflow
41.2.6. kdump 的配置文件 复制链接链接已复制到粘贴板!
kdump 内核的配置文件是 /etc/sysconfig/kdump。此文件控制 kdump 内核命令行参数。对于大多数配置,请使用默认选项。然而,在某些情况下,您可能需要修改某些参数来控制 kdump 内核行为。例如:修改 KDUMP_COMMANDLINE_APPEND 选项,以附加 kdump 内核命令行来获取详细的调试输出或修改 KDUMP_COMMANDLINE_REMOVE 选项,以从 kdump 命令行中删除参数。
KDUMP_COMMANDLINE_REMOVE这个选项从当前
kdump命令行中删除参数。它删除了可能导致kdump错误或kdump内核引导失败的参数。这些参数可能已从之前的KDUMP_COMMANDLINE进程解析了,或者从/proc/cmdline文件继承了。如果未配置此变量,它将继承
/proc/cmdline文件中的所有值。配置此选项还提供了有助于调试问题的信息。要删除某些参数,请将其添加到
KDUMP_COMMANDLINE_REMOVE中,如下所示:
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb"
# KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb"
KDUMP_COMMANDLINE_APPEND此选项将参数附加到当前命令行。这些参数可能已被之前的
KDUMP_COMMANDLINE_REMOVE变量解析了。对于
kdump内核,禁用某些模块,如mce、cgroup、numa,hest_disable有助于防止内核错误。这些模块可能会消耗为kdump保留的大部分内核内存,或者导致kdump内核引导失败。要在
kdump内核命令行中禁用内存cgroups,请运行以下命令:
KDUMP_COMMANDLINE_APPEND="cgroup_disable=memory"
KDUMP_COMMANDLINE_APPEND="cgroup_disable=memory"
41.2.7. 测试 kdump 配置 复制链接链接已复制到粘贴板!
配置 kdump 后,您必须手动测试系统崩溃,并确保在定义的 kdump 目标中生成了 vmcore 文件。vmcore 文件是从新引导的内核的上下文中捕获的。因此,vmcore 有用于调试内核崩溃的重要信息。
不要对活动状态的生产环境系统测试 kdump。测试 kdump 的命令将导致内核崩溃,且数据丢失。根据您的系统架构,确保您安排了充足的维护时间,因为 kdump 测试可能需要多次重启,且启动时间很长。
如果 vmcore 文件在 kdump 测试过程中没有生成 ,请在再次运行测试前识别并修复问题,以使 kdump 测试成功。
如果进行任何手动系统修改,您必须在任何系统修改的最后测试 kdump 配置。例如,如果您进行以下任何更改,请确保为以下情形测试 kdump 配置,以获取最佳 kdump 性能:
- 软件包升级。
- 硬件级别的更改,如存储或网络更改。
- 固件升级。
- 包括第三方模块的新安装和应用程序升级。
- 如果您使用热插拔机制在支持此机制的硬件上添加更多内存。
-
在
/etc/kdump.conf或/etc/sysconfig/kdump文件中进行更改后。
先决条件
- 您在系统上具有 root 权限。
-
您已保存了所有重要数据。测试
kdump的命令导致内核崩溃及数据丢失。 - 您已根据系统架构安排了大量机器维护时间。
流程
启用
kdump服务:kdumpctl restart
# kdumpctl restartCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
kdumpctl检查kdump服务的状态:kdumpctl status
# kdumpctl status kdump:Kdump is operationalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您使用
systemctl命令,输出会打印在systemd日志中。启动内核崩溃来测试
kdump配置。sysrq-trigger组合键导致内核崩溃,并在需要时可能重启系统。echo c > /proc/sysrq-trigger
# echo c > /proc/sysrq-triggerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在内核重启时,
address-YYYY-MM-DD-HH:MM:SS/vmcore文件在您在/etc/kdump.conf文件中指定的位置创建。默认值为/var/crash/。
41.2.8. 系统崩溃后 kdump 生成的文件 复制链接链接已复制到粘贴板!
系统崩溃后,kdump 服务会将内核内存捕获在转储文件(vmcore)中,它还会生成额外的诊断文件,以帮助故障排除和事后分析。
kdump 生成的文件:
-
vmcore- 崩溃时包含系统内存的主内核内存转储文件。它包含根据kdump配置中指定的core_collector程序配置的数据。默认情况下,包含内核数据结构、进程信息、堆栈跟踪和其他诊断信息。 -
vmcore-dmesg.txt- panic 的主内核中的内核环缓冲区日志的内容(dmesg)。 -
kexec-dmesg.log- 有从收集vmcore数据的辅助kexec内核执行中得到的内核和系统日志消息。
41.2.9. 启用和禁用 kdump 服务 复制链接链接已复制到粘贴板!
您可以配置,以对特定的内核或所有安装的内核启用或禁用 kdump 功能。您必须定期测试 kdump 功能,并验证其是否正确运行。
先决条件
- 您在系统上具有 root 权限。
-
您已为配置和目标完成了
kdump要求。请参阅 支持的 kdump 配置和目标。 -
用于安装
kdump的所有配置都是根据需要设置的。
流程
为
multi-user.target启用kdump服务:systemctl enable kdump.service
# systemctl enable kdump.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在当前会话中启动服务:
systemctl start kdump.service
# systemctl start kdump.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止
kdump服务:systemctl stop kdump.service
# systemctl stop kdump.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 禁用
kdump服务:systemctl disable kdump.service
# systemctl disable kdump.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
建议将 kptr_restrict=1 设置为默认值。当将 kptr_restrict 设置为(1)作为默认值时,kdumpctl 服务会加载崩溃内核,而无论是否启用了内核地址空间布局(KASLR)。
如果 kptr_restrict 没有被设置为 1,并且 KASLR 被启用了,则生成的 /proc/kore 文件的内容全为零。kdumpctl 服务无法访问 /proc/kcore 文件,并加载崩溃内核。kexec-kdump-howto.txt 文件显示一条警告信息,建议您设置 kptr_restrict=1。验证 sysctl.conf 文件中的以下内容,以确保 kdumpctl 服务加载崩溃内核:
-
sysctl.conf文件中的内核kptr_restrict=1。
41.2.10. 防止内核驱动程序为 kdump 加载 复制链接链接已复制到粘贴板!
您可以通过在 /etc/sysconfig/kdump 配置文件中添加 KDUMP_COMMANDLINE_APPEND= 变量来从加载某些内核驱动程序中控制捕获内核。使用这个方法,您可以防止来自加载指定的内核模块中的 kdump 初始 RAM 磁盘镜像 initramfs 。这有助于防止内存不足(OOM) killer 错误或其他崩溃内核失败。
您可以使用以下配置选项之一附加 KDUMP_COMMANDLINE_APPEND= 变量:
-
rd.driver.blacklist=<modules> -
modprobe.blacklist=<modules>
先决条件
- 您在系统上具有 root 权限。
流程
显示载入到当前运行内核的模块的列表。选择您要阻止其加载的内核模块:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
/etc/sysconfig/kdump文件中的KDUMP_COMMANDLINE_APPEND=变量。例如:KDUMP_COMMANDLINE_APPEND="rd.driver.blacklist=hv_vmbus,hv_storvsc,hv_utils,hv_netvsc,hid-hyperv"
KDUMP_COMMANDLINE_APPEND="rd.driver.blacklist=hv_vmbus,hv_storvsc,hv_utils,hv_netvsc,hid-hyperv"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,考虑以下使用
modprobe.blacklist=<modules>配置选项的示例:KDUMP_COMMANDLINE_APPEND="modprobe.blacklist=emcp modprobe.blacklist=bnx2fc modprobe.blacklist=libfcoe modprobe.blacklist=fcoe"
KDUMP_COMMANDLINE_APPEND="modprobe.blacklist=emcp modprobe.blacklist=bnx2fc modprobe.blacklist=libfcoe modprobe.blacklist=fcoe"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
kdump服务:systemctl restart kdump
# systemctl restart kdumpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
41.2.11. 在使用加密磁盘的系统中运行 kdump 复制链接链接已复制到粘贴板!
当您运行 LUKS 加密的分区时,系统需要一定数量的可用内存。如果系统可用内存量小于所需的可用内存量,则 cryptsetup 实用程序无法挂载分区。因此,在第二个内核(捕获内核)中将 vmcore 文件捕获到加密的目标位置会失败。
kdumpctl estimate 命令帮助您估计 kdump 所需的内存量。kdumpctl estimate 打印推荐的 crashkernel 值,这是 kdump 所需的最合适的内存大小。
推荐的 crashkernel 值是根据当前的内核大小、内核模块、initramfs 和 LUKS 加密的目标内存要求计算的。
如果您使用自定义 crashkernel= 选项,kdumpctl estimate 会打印 LUKS required size 的值。值是 LUKS 加密目标所需的内存大小。
流程
输出估计的
crashkernel=值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
通过增加
crashkernel=值来配置所需的内存量。 - 重启系统。
如果 kdump 服务仍无法将转储文件保存到加密的目标,请根据需要增大 crashkernel= 值。