crashkernel参数必须写入GRUB_CMDLINE_LINUX而非_GRUB_CMDLINE_LINUX_DEFAULT,否则内核不解析;需通过cat /sys/kernel/kexec_crash_size非零、dmesg含“Reserving...for crashkernel”及/proc/iomem有“Crash kernel”条目三重验证是否生效。

crashkernel= 参数必须写在 GRUB_CMDLINE_LINUX 中
Linux 中为 kdump 预留内存,crashkernel= 必须出现在 GRUB_CMDLINE_LINUX(而非 GRUB_CMDLINE_LINUX_DEFAULT)里,否则内核根本不会解析它。很多用户改错位置后发现 dmesg | grep -i crash 没输出、/sys/kernel/kexec_crash_size 为 0,就是这个原因。
实操建议:
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX=行(不是_DEFAULT),在其引号内添加crashkernel=128M或更复杂的表达式 - 若该行为空或不存在,直接添加:
GRUB_CMDLINE_LINUX="crashkernel=128M" - 运行
sudo update-grub再sudo reboot,否则修改不生效
crashkernel=128M 和 crashkernel=auto 的行为差异
crashkernel=auto 不是“自动选最优”,而是按硬编码规则查表:在 x86_64 上,仅当物理内存 ≥ 1GB 才触发;ARM64/Power 需 ≥ 2GB。低于阈值时,它什么也不保留 —— /proc/meminfo 里看不到 CmaTotal,kdump 服务启动失败报 “No memory reserved for crash kernel”。
手动指定更可靠:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
crashkernel=128M:固定预留 128MB,适用于内存 ≥ 2GB 的常见服务器 -
crashkernel=512M-2G:64M,2G-:128M:按物理内存分段预留,避免小内存机器浪费过多 - 注意单位大小写:
M(兆字节)合法,m或MB在多数内核版本中会被忽略或报错
mem= 参数会覆盖物理内存总量,不是“预留”而是“截断”
mem= 是限制内核可管理的内存上限,比如 mem=32G 在 64G 机器上,会导致后 32G 物理内存完全不可见 —— /proc/meminfo 的 MemTotal 就是 32G,dmesg 里 e820 显示那段区域标记为 reserved,但这段内存连 DMA、PCIe 设备都用不了,和 kdump 的 crashkernel 机制完全无关。
典型误用场景:
- 想“给硬件留点内存”,却用了
mem=,结果网卡驱动报dma_alloc_coherent failed - 和
crashkernel=同时使用,导致实际可用内存远低于预期(两者叠加裁剪) -
mem=值设得过大(如mem=128G在 64G 机器上)会被内核静默忽略,但日志里会有 warning
验证是否生效不能只看 /proc/meminfo
/proc/meminfo 的 MemTotal 是扣除 crashkernel 后的可用内存,但它不体现预留区本身。真正确认方式是:
-
cat /sys/kernel/kexec_crash_size—— 输出非 0 即已分配(单位字节) -
dmesg | grep -i "crash kernel"—— 应出现类似Reserving <code>131072Kof memory at0x37b00000for crashkernel -
cat /proc/iomem | grep "Crash kernel"—— 显示该段物理地址范围,且状态为reserved
如果 kexec_crash_size 为 0,但 iomem 里有 Crash kernel 条目,说明 kdump 服务没起来或未加载模块;如果两者都无,则 GRUB 配置或内核参数根本没生效。

















