有个细节很容易踩坑:crashkernel 参数必须写进 GRUB_CMDLINE_LINUX,不能放到 _GRUB_CMDLINE_LINUX_DEFAULT 里,不然内核根本不会解析。配置完之后,别只看“像是生效了”,最好做三步确认:先用 cat /sys/kernel/kexec_crash_size 看返回值是否非零;再检查 dmesg 里有没有 “Reserving...for crashkernel”;最后确认 /proc/iomem 中是否出现 “Crash kernel” 条目。这三项都对上,才算真正生效。

如何在Linux中配置具体的系统物理内存保留区大小

crashkernel= 参数必须写在 GRUB_CMDLINE_LINUX 中

Linux 中为 kdump 预留内存,crashkernel= 必须出现在 GRUB_CMDLINE_LINUX(而非 GRUB_CMDLINE_LINUX_DEFAULT)里,否则内核根本不会解析它。很多用户改错位置后发现 dmesg | grep -i crash 没输出、/sys/kernel/kexec_crash_size 为 0,就是这个原因。

实操建议:

crashkernel=128M 和 crashkernel=auto 的行为差异

crashkernel=auto 这项配置,别把它理解成“系统会自动挑一个最优值”。它本质上还是按硬编码规则去查表执行:在 x86_64 平台上,只有物理内存 ≥ 1GB 时才会生效;而 ARM64 和 Power 平台,则要求物理内存 ≥ 2GB。达不到这个门槛,系统就不会预留任何内存——这时在 /proc/meminfo 里也看不到 CmaTotal,同时 kdump 服务启动会直接失败,并报出 “No memory reserved for crash kernel”。

手动指定更可靠:

mem= 参数会覆盖物理内存总量,不是“预留”而是“截断”

mem= 是限制内核可管理的内存上限,比如 mem=32G 在 64G 机器上,会导致后 32G 物理内存完全不可见 —— /proc/meminfoMemTotal 就是 32G,dmesge820 显示那段区域标记为 reserved,但这段内存连 DMA、PCIe 设备都用不了,和 kdump 的 crashkernel 机制完全无关。

典型误用场景:

验证是否生效不能只看 /proc/meminfo

/proc/meminfoMemTotal 是扣除 crashkernel 后的可用内存,但它不体现预留区本身。真正确认方式是:

如果 kexec_crash_size 为 0,但 iomem 里有 Crash kernel 条目,说明 kdump 服务没起来或未加载模块;如果两者都无,则 GRUB 配置或内核参数根本没生效。

本文转载于:https://www.php.cn/faq/2977533.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。