我的主力工作机是一台跑 Ubuntu 24.04 LTS 的台式工作站,内核版本属于 6.8 系列,日常主要是编译、跑虚拟机、偶尔处理点视频。就在我快把系统调教到“懒得再碰”的时候,它连着给了我两次一模一样的下马威:屏幕毫无征兆地定格,键盘鼠标完全失去响应,所有风扇像突然打了鸡血一样狂转,然后屏幕上滚出一屏传统艺能——Kernel Panic。
第一次出现时,我下意识地把它归类为“偶发事件”,毕竟 Ubuntu 24.04 刚装完那阵子各种驱动小毛病也不少。重启之后简单看了两眼日志,顺手把 BIOS 刷到最新、更新了几个固件包,就继续干活了。直到几周后同一个场景第二次原样上演,我才意识到,这根本不是运气问题。如果不去把这个根子挖出来,它大概率还会第三次、第四次找上门。
这篇文章就是我第二次排查并最终“永久性解决”这份 Kernel Panic 的完整记录。没有玄学,也没有“重装系统大法”这种权宜之计,我会把整个排查链路、中间走过的弯路、最后锁定的根因以及验证过程都摊开写清楚。如果你也正被 Ubuntu 24.04 或者其他 Linux 发行版的随机内核崩溃折磨,这篇流程应该能帮你省下大量试错时间。
1. 事故重现与第一次“假解决”复盘
先说说两次事故的具体场景和我的处理方式,这一段很关键,因为第二次能顺利定位到根因,很大程度上得益于第一次“假解决”留下的对比样本。
1.1 第一次现场:当机发生在任务切换瞬间
第一次 panic 发生在 11 月中旬,当时我开着 Firefox 看文档,虚拟机里跑着一个编译任务,宿主机桌面上还挂着 VS Code。一切都很正常,没有高负载、没有异常高温,结果我从虚拟机窗口切回宿主机桌面的那一瞬间,屏幕整个冻住了。
当时我第一反应是 NVIDIA 显卡驱动又出幺蛾子,因为 24.04 默认的 open 内核模块和闭源驱动在切换窗口、DPMS 唤醒时偶尔会有 bug。我按了几次 Caps Lock 键,键盘灯毫无反应,确认系统是彻底死锁而不是单纯的桌面卡死。等了大约一分钟,屏幕上才慢悠悠滚出几行 Kernel Panic 信息,其中最显眼的就是 Kernel panic - not syncing: Fatal exception。
由于没有配置串口控制台或者 kdump,panic 出现时现场信息其实丢了很多。所以我当时能做的只是长按电源键强制重启,然后赶紧进系统查日志。但这里我犯了一个很多新手都会犯的错:只看了当前会话的日志,却没有意识到实际上 panic 之前的信息根本没有完整落盘。我查了 journalctl -p err -b,只看到一些 GPU 相关的 minor error,并没有找到能一锤定音的证据。
1.2 处理过程的第一个失误:只做了外围升级
第一轮排查我做了什么?说来惭愧,其实都是些“看起来在解决问题、实际上只是碰运气”的动作:
- 把主板 BIOS 从 F3 版本刷到了 F6 最新版;
- 用
sudo apt update && sudo apt full-upgrade把内核从 6.8.0-38 更新到了当时的 6.8.0-45; - 顺手重装了 NVIDIA 驱动,确保 DKMS 模块和当前内核版本对齐;
- 用
sudo fsck -f /dev/nvme0n1p2检查了根分区文件系统。
做完这一套之后,系统确实安静了大约三周。这段时间里我甚至有点沾沾自喜,觉得那次 panic 就是老 BIOS 和内核之间不兼容导致的偶发事件。直到第二次 panic 在几乎完全相同的使用场景下再次出现,我才意识到一个问题:上一次的“解决方案”根本没解决任何东西,我只是在系统周边敲敲打打,从来没找到那个真正的病根。
这个教训值得先记下来:Linux 内核崩溃的排查,永远不要用“我更新了一堆东西所以它应该好了”来安慰自己。 如果第一阶段不能给出明确的根因结论,那这次“解决”百分之百是假解决。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第二次排查:从日志拉取到范围收敛
第二次 panic 发生之后,我用了一个和第一次完全不同的姿势来处理问题。这次不再是“猜哪个组件坏了”,而是先尽力保留现场、扩大证据收集范围,再一步步做减法。
2.1 panic 后的第一件事:抢救上次启动的日志
系统强制重启之后,Ubuntu 默认的 systemd-journald 实际上不会保存本次 panic 时刻的日志到磁盘,因为内核已经卡死了,用户态服务根本来不及响应写盘请求。但好消息是,panic 之前一段时间内的日志通常是完整的,尤其是一些反复出现的硬件级错误,很早之前就可能已经在疯狂刷记录了。
我做的第一件事就是查看上一次开机(即 panic 对应的那一次 boot)里有
