调整 crashkernel 参数的值需要考虑系统的内存大小、系统的工作负载和捕获内核所需的资源。一般情况下,合理配置 crashkernel 的值能够确保在系统崩溃时,捕获内核能够顺利启动并成功转储内存信息。

1. 内存预留策略

在配置 crashkernel 参数时,主要有以下几种预留策略:

  • 固定预留:直接指定固定的内存量。
  • 可变预留:根据系统总内存大小动态分配。
  • 偏移预留:从特定内存地址开始预留。
  • 可变预留 + 偏移预留:结合可变预留和偏移预留策略。

2. 配置示例

2.1 固定预留
crashkernel=128M

此配置直接预留 128MB 内存给捕获内核。这种方式简单,但在大内存系统中可能不足,在小内存系统中可能浪费。

2.2 可变预留
crashkernel=512M-2G:64M,2G-:128M

根据系统总内存大小动态预留内存:

  • 系统内存小于 512MB 时,不预留内存。
  • 系统内存在 512MB 到 2GB 之间时,预留 64MB 内存。
  • 系统内存大于 2GB 时,预留 128MB 内存。
2.3 偏移预留
crashkernel=128M@16M

从 16MB 内存地址开始预留 128MB 内存。偏移预留方式不常用,因为用户很难确定预留内存的起始位置。

2.4 可变预留 + 偏移预留
crashkernel=512M-2G:64M,2G-:128M@16M

从 16MB 内存地址开始,结合可变预留和偏移预留策略。

3. 如何选择合适的 crashkernel

选择合适的 crashkernel 值需要综合考虑系统的具体情况。以下是一些建议:

  1. 小内存系统(< 2GB)

    • 可以使用固定预留方式,例如 crashkernel=128M
  2. 中等内存系统(2GB - 8GB)

    • 可以使用可变预留方式,例如 crashkernel=512M-2G:64M,2G-:128M
  3. 大内存系统(> 8GB)

    • 使用较大值的可变预留方式,例如 crashkernel=2G-:256M

4. 示例:调试 crashkernel 配置

假设有一台系统,总内存为 16GB,配置 crashkernel 如下:

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

在配置文件 /etc/default/grub 中添加或修改 GRUB_CMDLINE_LINUX 选项:

GRUB_CMDLINE_LINUX="crashkernel=512M-2G:64M,2G-:128M rhgb quiet"

然后更新 GRUB 配置:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

重新启动系统以使配置生效。

5. 验证配置

重新启动系统后,可以通过以下命令验证 crashkernel 配置是否生效:

dmesg | grep -i crashkernel

输出示例:

[    0.000000] Reserving 128MB of memory at 3145728k for crashkernel (System RAM: 16777216k)

此输出表明系统已预留 128MB 内存用于 crashkernel。

6. 使用 kdumpctl 工具管理 kdump

kdumpctl 是一个管理 kdump 服务的工具,允许管理员启动、停止、检查 kdump 的状态,并重新加载配置。

启动 kdump 服务:

sudo kdumpctl start

检查 kdump 状态:

sudo kdumpctl status

7. 调整 kdump 配置

如果需要修改 kdump 的 cmdline 参数,可以编辑相关配置文件。以下是示例:

/etc/kdump.conf 文件中添加或修改 extra_cmdline 选项:

extra_cmdline="crashkernel=512M-2G:64M,2G-:128M rhgb quiet"

然后重新加载 kdump 配置:

sudo kdumpctl restart

8. 触发和测试 kdump

为了测试 kdump,可以手动触发系统崩溃。请谨慎操作,因为这会导致系统立即重启并生成崩溃转储文件。

启用 sysrq:

echo 1 | sudo tee /proc/sys/kernel/sysrq

触发崩溃:

echo c | sudo tee /proc/sysrq-trigger

系统会重启,并生成崩溃转储文件。可以在 /var/crash 目录下找到转储文件。

9. 使用 crash 工具分析 vmcore 文件

加载并分析生成的 vmcore 文件:

crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/<日期和时间>/vmcore

使用 crash 命令进行分析,例如查看崩溃时的内核堆栈:

crash> bt

通过上述步骤,可以配置和验证 crashkernel 参数,确保在系统崩溃时能够成功生成和分析内存转储文件。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐