41.2. 在命令行中配置 kdump


在系统引导过程中为 kdump 保留内存。您可以在系统的 Grand Unified Bootloader (GRUB)配置文件中配置内存大小。内存大小取决于配置文件中指定的 crashkernel= 值以及系统物理内存的大小。

41.2.1. 估算 kdump 大小

在规划和构建 kdump 环境时,务必要知道崩溃转储文件所需的空间。

makedumpfile --mem-usage 命令估计崩溃转储文件所需的空间。它生成一个内存使用率报告。这个报告可帮助您决定转储级别以及安全排除的页面。

流程

  • 输入以下命令生成内存用量报告:

    # makedumpfile --mem-usage /proc/kcore
    
    
    TYPE        PAGES    EXCLUDABLE    DESCRIPTION
    -------------------------------------------------------------
    ZERO          501635      yes        Pages filled with zero
    CACHE         51657       yes        Cache pages
    CACHE_PRIVATE 5442        yes        Cache pages + private
    USER          16301       yes        User process pages
    FREE          77738211    yes        Free pages
    KERN_DATA     1333192     no         Dumpable kernel data
重要

makedumpfile --mem-usage 命令会以页为单位报告所需的内存。这意味着您必须根据内核页面大小计算所使用的内存大小。

41.2.2. 配置 kdump 内存用量

kdump 的内存保留在系统引导过程中发生。内存大小是在系统的 Grand Unified Bootloader (GRUB)配置中设定的。内存大小取决于配置文件中指定的 crashkernel= 选项的值以及系统物理内存的大小。

您可以使用多种方式定义 crashkernel= 选项。您可以指定 crashkernel= 值或配置 auto 选项。crashkernel=auto 参数根据系统中的物理内存总量自动保留内存。配置后,内核将自动为捕获内核保留适当数量的所需内存。这有助于防止内存不足(OOM)错误。

注意

kdump 的自动内存分配因系统硬件架构和可用内存大小而异。

如果系统自动分配低于最小内存阈值,您可以手动配置保留内存量。

先决条件

流程

  1. 准备 crashkernel= 选项。

    • 例如:要保留 128 MB 内存,请使用:

      crashkernel=128M
    • 或者,您可以根据安装的内存总量将保留内存量设置为变量。变量中的内存保留语法为 crashkernel=<range1>:<size1>,<range2>:<size2>。例如:

      crashkernel=512M-2G:64M,2G-:128M

      如果系统内存总量为 512 MB 和 2 GB,则命令保留 64 MB 内存。如果内存量超过 2 GB,则内存保留为 128 MB。

    • 保留内存的偏移。

      有些系统需要保留具有特定固定偏移量的内存,因为 crashkernel 保留在早期发生,您可能需要为特殊用途保留更多内存。当您定义了一个偏移时,保留的内存将从这个偏移位置开始。要偏移保留的内存,请使用以下语法:

      crashkernel=128M@16M

      在这个示例中,kdump 从 16 MB 开始保留 128 MB 内存(物理地址 0x01000000)。如果将偏移参数设置为 0 或完全省略,kdump 会自动偏移保留内存。在设置变量内存保留时,也可以使用此语法。在这种情况下,偏移总是指定最后一个。例如:

      crashkernel=512M-2G:64M,2G-:128M@16M
  2. crashkernel= 选项应用到引导装载程序配置:

    # grubby --update-kernel=ALL --args="crashkernel=<value>"

    <value> 替换为您在上一步中准备的 crashkernel= 选项的值。

41.2.3. 配置 kdump 目标

崩溃转储通常以一个文件形式存储在本地文件系统中,直接写入设备。另外,您可以使用 NFSSSH 协议通过网络发送崩溃转储。一次只能设置其中一个选项来保留崩溃转储文件。默认行为是将其存储在本地文件系统的 /var/crash/ 目录中。

先决条件

流程

  • 要将崩溃转储文件保存在本地文件系统的 /var/crash/ 目录中,请编辑 /etc/kdump.conf 文件并指定路径:

    path /var/crash

    选项 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 指令指定 shell 脚本或在 kdump 完成捕获并将崩溃转储保存到指定的目的地 执行的命令。您可以使用此机制扩展 kdump 的功能,以执行包括文件权限中的调整的操作。

  • kdump 目标配置
# *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/crashpath 选项也设置为 /var/crash。因此,kdumpvmcore 文件保存在 /var/crash/var/crash 目录中。

  • 要更改保存崩溃转储的本地目录,以 root 用户身份编辑 /etc/kdump.conf 配置文件:

    1. #path /var/crash 行的开头删除哈希符号(#)。
    2. 使用预期的目录路径替换该值。例如:

      path /usr/local/cores
      重要

      在 Red Hat Enterprise Linux 8 中,当 kdump systemd 服务启动时,必须存在使用 path 指令定义为 kdump 目标的目录,以避免失败。与早期版本的 RHEL 不同,如果服务启动时不存在目录,则该目录将不再自动创建。

  • 要将文件写入不同的分区,请编辑 /etc/kdump.conf 配置文件:

    1. 根据您的选择,从 #ext4 行的开头删除哈希符号(#)。

      • 设备名称( #ext4 /dev/vg/lv_kdump 行)
      • 文件系统标签( #ext4 LABEL=/boot 行)
      • UUID( #ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937 行)
    2. 将文件系统类型和设备名称、标签或 UUID 改为所需的值。指定 UUID 值的正确语法是 UUID="correct-uuid"UUID=correct-uuid。例如:

      ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
      重要

      建议您使用 LABEL=UUID= 指定存储设备。无法保证 /dev/sda3 等磁盘设备名称在重启后保持一致。

      当您在 IBM Z 硬件中使用 Direct Access Storage Device (DASD)时,请确保在 /etc/dasd.conf 中正确指定转储设备,然后再使用 kdump

  • 要将崩溃转储直接写入设备,请编辑 /etc/kdump.conf 配置文件:

    1. #raw /dev/vg/lv_kdump 行的开头删除哈希符号(#)。
    2. 使用预期的设备名称替换该值。例如:

      raw /dev/sdb1
  • 使用 NFS 协议将崩溃转储保存到远程机器中:

    1. #nfs my.server.com:/export/tmp 行的开头删除哈希符号(#)。
    2. 使用有效的主机名和目录路径替换该值。例如:

      nfs penguin.example.com:/export/cores
    3. 重启 kdump 服务以使更改生效:

      sudo systemctl restart kdump.service
      注意

      当使用 NFS 指令指定 NFS 目标时,kdump.service 会自动尝试挂载 NFS 目标来检查磁盘空间。不需要提前挂载 NFS 目标。要防止 kdump.service 挂载目标,请在 kdump.conf 中使用 dracut_args --mount 指令。这将启用 kdump.service 使用- mount 参数调用 dracut 工具来指定 NFS 目标。

  • 使用 SSH 协议将崩溃转储保存到远程机器中:

    1. #ssh user@my.server.com 行的开头删除哈希符号(#)。
    2. 使用有效的用户名和密码替换该值。
    3. 在配置中包含您的 SSH 密钥。

      1. #sshkey /root/.ssh/kdump_id_rsa 行的开头删除哈希符号。
      2. 将该值改为您要转储的服务器中有效密钥的位置。例如:

        ssh john@penguin.example.com
        sshkey /root/.ssh/mykey

其它资源

系统崩溃后 kdump 生成的文件。

41.2.4. 配置 kdump 核心收集器

kdump 服务使用 core_collector 程序捕获崩溃转储镜像。在 RHEL 中,makedumpfile 工具是默认的内核收集器。它通过以下方式帮助缩小转储文件:

  • 压缩崩溃转储文件的大小,并使用各种转储级别仅复制必要的页面。
  • 排除不必要的崩溃转储页。
  • 过滤崩溃转储中包含的页面类型。
注意

RHEL 7 及更高版本中默认启用崩溃转储文件压缩。

如果您需要自定义崩溃转储文件压缩,请按照以下步骤执行。

语法

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。

先决条件

流程

  1. 作为 root 用户,编辑 /etc/kdump.conf 配置文件并从 #core_collector makedumpfile -l --message-level 1 -d 31 的开头删除 hash 符号("#")。
  2. 输入以下命令启用崩溃转储文件压缩:
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
  • 使用 -p 压缩崩溃转储文件:

    core_collector makedumpfile -p -d 31 --message-level 1

其它资源

41.2.5. 配置 kdump 默认失败响应

默认情况下,当 kdump 不能在配置的目标位置创建崩溃转储文件时,系统会重启,转储在此过程中会丢失。您可以更改默认失败响应,并将 kdump 配置为在将内核转储保存到主目标时执行不同的操作。额外的操作是:

dump_to_rootfs
将内核转储保存到 root 文件系统。
reboot
重启系统,在此过程中会丢失内核转储。
halt
停止系统,在此过程中会丢失内核转储。
poweroff
关闭系统,在此过程中会丢失内核转储。
shell
initramfs 中运行 shell 会话,您可以手动记录内核转储。
final_action
kdump 成功或在 shell 或 dump_to_rootfs 失败操作完成后,启用额外的操作,如 reboothaltpoweroff。默认为 reboot
failure_action
指定在内核崩溃中转储可能失败时要执行的操作。默认为 reboot

先决条件

流程

  1. 作为 root 用户,从 /etc/kdump.conf 配置文件中的 #failure_action 行的开头删除 hash 符号(#)。
  2. 将值替换为所需操作。

    failure_action poweroff

其它资源

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_APPEND

此选项将参数附加到当前命令行。这些参数可能已被之前的 KDUMP_COMMANDLINE_REMOVE 变量解析。

对于 kdump 内核,禁用某些模块,如 mcecgroupnumahest_disable 有助于防止内核错误。这些模块可能会消耗为 kdump 保留的内核内存的重要部分,或者 导致 kdump 内核引导失败。

要在 kdump 内核命令行中禁用内存 cgroups,请运行以下命令:

KDUMP_COMMANDLINE_APPEND="cgroup_disable=memory"

其它资源

  • Documentation/admin-guide/kernel-parameters.txt 文件
  • /etc/sysconfig/kdump 文件

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 的命令导致内核崩溃及数据丢失。
  • 您已根据系统架构安排了大量机器维护时间。

流程

  1. 启用 kdump 服务:

    # kdumpctl restart
  2. 使用 kdump ctl 检查 kdump 服务的状态:

    # kdumpctl status
      kdump:Kdump is operational

    另外,如果您使用 systemctl 命令,输出会在 systemd 日志中打印。

  3. 启动内核崩溃来测试 kdump 配置。sysrq-trigger 组合键导致内核崩溃,并在需要时可能重启系统。

    # echo c > /proc/sysrq-trigger

    在内核重启时,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 的所有配置都是根据需要设置的。

流程

  1. multi-user.target 启用 kdump 服务:

    # systemctl enable kdump.service
  2. 在当前会话中启动服务:

    # systemctl start kdump.service
  3. 停止 kdump 服务:

    # systemctl stop kdump.service
  4. 禁用 kdump 服务:

    # systemctl disable kdump.service
警告

建议将 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 权限。

流程

  1. 显示载入到当前运行内核的模块的列表。选择您要阻止加载的内核模块:

    $ lsmod
    
    Module                  Size  Used by
    fuse                  126976  3
    xt_CHECKSUM            16384  1
    ipt_MASQUERADE         16384  1
    uinput                 20480  1
    xt_conntrack           16384  1
  2. 更新 /etc/sysconfig/kdump 文件中的 KDUMP_COMMANDLINE_APPEND= 变量。例如:

    KDUMP_COMMANDLINE_APPEND="rd.driver.blacklist=hv_vmbus,hv_storvsc,hv_utils,hv_netvsc,hid-hyperv"

    另外,使用 modprobe.blacklist= <modules> 配置选项请考虑以下示例:

    KDUMP_COMMANDLINE_APPEND="modprobe.blacklist=emcp modprobe.blacklist=bnx2fc modprobe.blacklist=libfcoe modprobe.blacklist=fcoe"
  3. 重启 kdump 服务:

    # systemctl restart kdump

其它资源

  • 系统中 dracut.cmdline 手册页。

41.2.11. 在使用加密磁盘的系统中运行 kdump

当您运行 LUKS 加密的分区时,系统需要一定数量的可用内存。如果系统可用内存量小于所需的可用内存量,则 cryptsetup 实用程序无法挂载分区。因此,在第二个内核(捕获内核)中将 vmcore 文件捕获到加密的目标位置会失败。

kdumpctl estimate 命令帮助您估计 kdump 所需的内存量。kdumpctl estimate 打印推荐的 crashkernel 值,这是 kdump 所需的最合适的内存大小。

推荐的 crashkernel 值是根据当前的内核大小、内核模块、initramfs 和 LUKS 加密的目标内存要求计算的。

如果您使用自定义 crashkernel= 选项,kdumpctl estimate 会输出 LUKS 所需的大小值。值是 LUKS 加密目标所需的内存大小。

流程

  1. 输出估计的 crashkernel= 值:

    # *kdumpctl estimate*
    
    Encrypted kdump target requires extra memory, assuming using the keyslot with minimum memory requirement
       Reserved crashkernel:    256M
       Recommended crashkernel: 652M
    
       Kernel image size:   47M
       Kernel modules size: 8M
       Initramfs size:      20M
       Runtime reservation: 64M
       LUKS required size:  512M
       Large modules: <none>
       WARNING: Current crashkernel size is lower than recommended size 652M.
  2. 通过增加 crashkernel= 值来配置所需的内存量。
  3. 重启系统。
注意

如果 kdump 服务仍无法将转储文件保存到加密的目标,请根据需要增大 crashkernel= 值。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.