生产环境应启用 pstore+ramoops 捕获 panic 控制台日志,并配置 kdump 保存 vmcore 内存镜像,同时设置 kernel.panic=60 等参数确保 dump 完成后再重启,所有配置需满足可落地、低开销、重启后可读三大刚性需求。

生产环境要让系统在内核 Panic 时自动 dump 服务日志,核心不是“服务日志”,而是捕获崩溃瞬间的内核上下文与控制台输出——因为 Panic 发生时,用户态服务(如 systemd、nginx、数据库)早已失去调度能力,常规日志收集机制(rsyslog、journalctl)基本失效。真正能可靠保存的,是内核原生支持的轻量级持久化机制。
以下配置围绕“可落地、低开销、重启后可读”三个生产刚性需求展开:
启用 pstore + ramoops 捕获 panic 控制台日志
这是最轻量、最可靠的首道防线,无需额外存储,不依赖网络或磁盘 I/O,专为嵌入式和服务器生产环境设计。
确保内核已编译支持:
CONFIG_PSTORE=yCONFIG_PSTORE_CONSOLE=yCONFIG_PSTORE_RAM=y
(ARM64 推荐直接编入,避免模块加载失败)-
预留 RAM 区域(推荐设备树方式):
在 DTS 中添加节点(示例为 1MB 起始地址0x8000000):reserved-memory { #address-cells = ; #size-cells = ; ranges; ramoops@8000000 { reg = ; // 1MB compatible = "ramoops"; record-size = ; // 16KB console-size = ; // 128KB }; }; -
启动后挂载并验证:
mkdir -p /sys/fs/pstore mount -t pstore pstore /sys/fs/pstore
触发测试(
echo c > /proc/sysrq-trigger),重启后执行:ls /sys/fs/pstore/→ 应见console-xxx或dmesg-xxx文件cat /sys/fs/pstore/console-*→ 可读取 panic 前完整控制台输出
配置 kdump 保存完整内存镜像(vmcore)
pstore 只存日志片段,vmcore 才是根因分析的“黑匣子”。它必须与自动重启协同,不能互相干扰。
预留 crashkernel 内存:
编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中追加:crashkernel=512M(16–64GB 内存服务器推荐值)
运行sudo update-grub(Debian/Ubuntu)或sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS)安装并启用 kdump 服务:
Ubuntu/Debian:sudo apt install linux-crashdump(安装即启用)
RHEL/CentOS:sudo yum install kexec-tools && sudo systemctl enable --now kdump-
设置转储路径与压缩策略(编辑
/etc/kdump.conf):path /var/crash core_collector makedumpfile -l --message-level 1 -d 31
-l启用 LZO 压缩,-d 31过滤零页、缓存页、用户页,大幅缩短转储时间
强化 panic 响应逻辑,确保流程闭环
避免“重启了但没 dump 成”或“dump 了但覆盖了”。
-
设置内核 panic 自动响应:
写入/etc/sysctl.conf:kernel.panic = 60 # 等待 60 秒再重启,留给 kdump 充足时间 kernel.panic_on_oops = 1 # oops 也触发完整 dump 流程 kernel.softlockup_panic = 1 kernel.hung_task_panic = 1
执行
sudo sysctl -p生效 确保
/var/crash分区独立且空间充足:
建议使用单独 LVM 逻辑卷或挂载远程 NFS,容量 ≥ 2× 物理内存
目录权限设为1777(sticky bit 必须),否则 kdump 拒绝写入日志归档与防覆盖(可选增强):
在/etc/cron.daily/kdump-rotate中添加脚本,将/var/crash/*/vmcore*自动打包并移出,避免重复 panic 导致旧现场被覆盖
不复杂但容易忽略











