内核Panic是系统最严重崩溃,需直奔dmesg环形缓冲区抓原始日志;journalctl常失效,应优先执行dmesg -T | grep -A 20 -B 5 -E "(Kernel panic|Oops|BUG:|Call Trace:)",并从Call Trace底部向上定位首个非通用函数(如[nvidia]、mm_*等),结合vmcore、硬件日志及panic前WARNING综合分析。

内核 Panic 会导致系统直接崩溃重启,不是服务挂了、进程退出那种级别——它意味着内核已无法维持最基本运行,systemctl、kill、甚至 SSH 都没机会响应。排查必须绕过“系统还在”的假象,直奔崩溃瞬间留下的痕迹。
崩溃后第一件事:别信 journalctl,先抓 dmesg 环缓冲区原始日志
很多运维习惯用 journalctl -b -1 | grep panic,但这是错的:Panic 发生时 journal 可能根本来不及刷盘,尤其没启用 kdump 或 rsyslog 未配置 imkmsg 模块时,journalctl 常是空的或只有重启后的日志。
- 立刻执行
dmesg -T | grep -A 20 -B 5 -E "(Kernel panic|Oops|BUG:|Call Trace:)":-T 加时间戳,-A 20 向下取调用栈(关键!),-B 5 向上取前兆(比如连续ext4_writepages报错) - 如果系统已重启且
dmesg输出为空或只有启动日志,说明 ring buffer 被清空,转去查/var/log/kern.log.1.gz:zcat /var/log/kern.log.1.gz | grep -A 20 -B 5 "Kernel panic" - 注意:/var/log/kern.log 可能被 logrotate 轮转,优先找带 .1.gz 后缀的最新归档,而不是只盯 .log
看 Call Trace 时,重点不是第一行,而是最底下那个非通用函数
调用栈不是从上往下读,而是从最底端(panic 触发点)往上推。真正该盯的是第一个脱离内核通用路径、进入具体模块的位置。
- 看到
[nvidia]、[zfs]、[wireguard]这类方括号包着的名字?90% 是它干的——第三方模块没随内核升级重编译,或用了非主线补丁 - 全是
mm_*开头(如mm_page_alloc、try_to_unmap)?内存子系统异常,立刻查硬件:dmesg -T | grep -i "ecc\|correctable\|uncorrectable",再跑memtest86+ - 出现
unknown symbol或invalid opcode?模块符号版本不匹配,或 CPU 微码太旧(cpupower frequency-info查当前微码,比对主板 BIOS 更新日志)
没日志?检查 kdump 是否真在工作,别只看服务状态
systemctl is-active kdump 显示 active ≠ kdump 在捕获 panic。很多环境 kdump 服务虽 running,但因内存预留不足、initrd 未更新、或 /var/crash/ 分区满,导致 vmcore 根本没生成。
- 确认
/var/crash/下有以时间戳命名的目录,且里面包含vmcore和vmcore-dmesg.txt;若只有kernel-*文件而无vmcore,说明捕获失败 - 检查
/proc/cmdline是否含crashkernel=参数(如crashkernel=512M),并确认该内存大小在系统总内存中实际可预留(低内存机器常预留失败) - 用
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/*/vmcore打开 vmcore,输入bt看完整调用栈——比 dmesg 更全,尤其当 ring buffer 被覆盖时
硬件问题常藏在 panic 前的 WARNING 里,不是 panic 行本身
内核 Panic 往往是压垮骆驼的最后一根稻草。真正线索常在 panic 前几秒的 WARNING,比如磁盘 I/O 超时、DMA 错误、PCIe 链路降速等,这些不会单独触发 panic,但会让后续操作踩到空指针或死锁。
- 用
dmesg -T | grep -B 10 -A 5 "WARNING\|Hardware Error\|I/O error\|timeout"扫一遍,特别注意 panic 时间点前 30 秒内的条目 - 结合
smartctl -a /dev/sda查磁盘健康,sensors查温度是否超阈值,turbostat看 CPU 是否因过热降频锁死 - 如果是虚拟机,检查宿主机
dmesg和virsh domstats,Guest Panic 常由 Host 内存耗尽或 KVM bug 引起
真正难的不是看懂 Call Trace,而是区分哪些是症状、哪些是病因——比如 regulator_is_enabled+0x10/0x84 看似是驱动问题,但根源可能是 PMIC 供电不稳导致 regulator 初始化失败,这种软硬件交界处的故障,日志不会明说,得靠上下文交叉验证。


















