背景
之前我已经遇到过一次 RTX 5090 在 Ubuntu 24.04 下的 NVIDIA 驱动稳定性问题。
当时的结论是:
595.84-open下出现过 PCIe AER Fatal、Xid 79、GPU fallen off the bus- 回退到
595.71.05-open后恢复稳定 - 原计划对 NVIDIA 相关包执行
apt-mark hold - 但后来发现,当时实际上并没有真正执行 HOLD
这次系统再次出现异常迹象后,最终确认:Ubuntu 的 unattended-upgrades 在后台把 NVIDIA 595.71.05 自动升级到了 595.84。
更有意思的是,由于机器一直没有重启,因此出现了一个非常典型的状态:
RAM 中正在运行的 NVIDIA 驱动:595.71.05 磁盘上下一次准备加载的驱动:595.84这篇记录完整整理一下排查和恢复过程。
一、发现 unattended-upgrades 自动升级了 NVIDIA 驱动
首先检查:
/var/log/unattended-upgrades/unattended-upgrades.log发现 2026-08-12 的日志:
2026-08-12 06:15:34,945 INFO Starting unattended upgrades script 2026-08-12 06:15:34,960 INFO Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security 2026-08-12 06:15:40,568 INFO Packages that will be upgraded: libnss-systemd libnvidia-cfg1-595 libnvidia-common-595 libnvidia-compute-595 libnvidia-decode-595 libnvidia-encode-595 libnvidia-extra-595 libnvidia-fbc1-595 libnvidia-gl-595 libpam-systemd libsystemd-shared libsystemd0 libudev1 nvidia-compute-utils-595 nvidia-dkms-595-open nvidia-driver-595-open nvidia-kernel-common-595 nvidia-kernel-source-595-open nvidia-utils-595 systemd systemd-dev systemd-resolved systemd-sysv systemd-timesyncd udev xserver-xorg-video-nvidia-595 2026-08-12 06:18:21,652 INFO All upgrades installed这已经可以直接确认:
不是手工执行
apt upgrade导致,而是 unattended-upgrades 自动升级了整套 NVIDIA 595 驱动。
其中最关键的包包括:
nvidia-driver-595-open nvidia-dkms-595-open nvidia-kernel-source-595-open nvidia-kernel-common-595 nvidia-utils-595 libnvidia-compute-595 libnvidia-gl-595二、最关键的现象:RAM 是 595.71.05,磁盘已经变成 595.84
执行:
cat/proc/driver/nvidia/version modinfo-Fversion nvidia得到:
NVRM version: NVIDIA UNIX Open Kernel Module for x86_64 595.71.05 ... 595.84这两个结果看似矛盾,其实非常关键。
/proc/driver/nvidia/version
表示:
当前已经加载进内核、正在运行的 NVIDIA 模块版本。
当前结果:
595.71.05modinfo -F version nvidia
表示:
磁盘上当前
modinfo能找到的 NVIDIA 内核模块版本。
当前结果:
595.84于是当时机器的真实状态其实是:
当前 RAM: 595.71.05 磁盘: 595.84原因很简单:
- 系统原本启动时加载的是 595.71.05
- unattended-upgrades 在机器运行期间升级了 NVIDIA 软件包
- 磁盘文件已经被替换成 595.84
- 但 Linux 不会自动把正在运行的内核模块替换掉
- 所以 RAM 中仍然保留 595.71.05
这个时候最重要的一件事情就是:
不要急着 reboot。
如果直接重启,当前 RAM 中最后还在工作的 595.71.05 会消失,系统下一次就会加载磁盘上的 595.84。
三、确认 Ubuntu 仓库已经只提供 595.84
执行:
apt-cachemadison\nvidia-driver-595-open\nvidia-dkms-595-open\nvidia-kernel-source-595-open\nvidia-kernel-common-595\nvidia-compute-utils-595\nvidia-utils-595\libnvidia-compute-595\libnvidia-gl-595得到的版本全部已经是:
595.84-0ubuntu0.24.04.1来源包括:
noble-updates noble-security说明旧的:
595.71.05-0ubuntu0.24.04.1已经不能直接从当前 APT 仓库重新安装。
四、幸运的是:APT 缓存里还保留完整的 595.71.05
执行:
find/var/cache/apt/archives-maxdepth1\-typef-name'*595.71.05*.deb'\-printf'%f\n'|sort发现旧版本.deb全部还在:
libnvidia-cfg1-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-common-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-compute-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-decode-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-encode-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-extra-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-fbc1-595_595.71.05-0ubuntu0.24.04.1_amd64.deb libnvidia-gl-595_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-compute-utils-595_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-dkms-595-open_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-driver-595-open_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-firmware-595-595.71.05_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-kernel-common-595_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-kernel-source-595-open_595.71.05-0ubuntu0.24.04.1_amd64.deb nvidia-utils-595_595.71.05-0ubuntu0.24.04.1_amd64.deb xserver-xorg-video-nvidia-595_595.71.05-0ubuntu0.24.04.1_amd64.deb一共 16 个。
这就给了一个非常好的恢复窗口:
RAM 中还跑着稳定的 595.71.05,同时本地缓存又完整保留了旧版本安装包。
五、先把旧版驱动包单独备份
为了避免以后执行:
aptclean导致这些旧包被删除,先永久备份:
mkdir-p/root/nvidia-595.71.05-debscp-av/var/cache/apt/archives/*595.71.05*.deb\/root/nvidia-595.71.05-debs/确认:
find/root/nvidia-595.71.05-debs\-maxdepth1-name'*.deb'|wc-l结果:
16以后即使 Ubuntu 仓库完全不再提供 595.71.05,也可以直接使用本地包恢复。
六、先模拟降级
不要直接安装,先执行模拟:
apt-sinstall--allow-downgrades\/root/nvidia-595.71.05-debs/*.deb主要检查两件事:
1. NVIDIA 包是否全部从 595.84 降级到 595.71.05
预期:
595.84-0ubuntu0.24.04.1 ↓ 595.71.05-0ubuntu0.24.04.12. 有没有误删除大量无关软件包
如果只是 NVIDIA 595 软件栈的正常 downgrade,就可以继续。
七、真正执行 595.84 → 595.71.05 降级
执行:
aptinstall--allow-downgrades\/root/nvidia-595.71.05-debs/*.deb这里使用 APT 安装本地.deb,而不是简单执行:
dpkg-i*.deb主要是为了让 APT 正确处理各包之间的依赖关系。
整个过程中:
不要 reboot 不要 rmmod nvidia 不要 modprobe nvidia 不要 apt upgrade 不要 apt full-upgrade因为当前内存里还运行着正常的 595.71.05,没有必要主动破坏这个状态。
八、降级后确认 RAM 和磁盘重新一致
再次检查:
cat/proc/driver/nvidia/version modinfo-Fversion nvidia目标状态:
/proc/driver/nvidia/version 595.71.05 modinfo -F version nvidia 595.71.05也就是:
RAM = 595.71.05 Disk = 595.71.05再检查:
dkms status|grep-invidia以及:
dpkg-query-W-f='${binary:Package}\t${Version}\n'|grep-E'nvidia|libnvidia'|grep595|sort主要驱动组件应该全部恢复到:
595.71.05-0ubuntu0.24.04.1九、这次一定执行 HOLD
上一次最大的问题不是没有解决,而是:
解决之后忘了锁版本。
因此这次确认降级完成后立即执行:
apt-mark hold\nvidia-driver-595-open\nvidia-dkms-595-open\nvidia-kernel-source-595-open\nvidia-kernel-common-595\nvidia-compute-utils-595\nvidia-utils-595\libnvidia-cfg1-595\libnvidia-common-595\libnvidia-compute-595\libnvidia-decode-595\libnvidia-encode-595\libnvidia-extra-595\libnvidia-fbc1-595\libnvidia-gl-595\xserver-xorg-video-nvidia-595验证:
apt-mark showhold|grep595|sort这一步非常重要。
因为 APT 现在仍然会认为:
Installed: 595.71.05 Candidate: 595.84但只要处于 HOLD 状态,正常的 unattended-upgrades 就不会再把这些软件包自动更新回 595.84。
十、最终重启验证
所有检查完成后,进行了正常 reboot。
重启之后执行:
cat/proc/driver/nvidia/version modinfo-Fversion nvidia nvidia-smi dkms status|grep-invidia最终全部正常。
也就是说,系统已经真正完成:
595.84 落盘 ↓ 本地 .deb 降回 595.71.05 ↓ DKMS 恢复 595.71.05 ↓ HOLD NVIDIA 软件包 ↓ reboot ↓ 重新加载 595.71.05 ↓ GPU 正常至此恢复完成。
十一、一个额外现象:PCIe replay error 累计到 3009,但模型仍稳定
这两天运行大模型时还注意到一个现象:
# gpu rxpci txpci sbecc dbecc pci # Idx MB/s MB/s errs errs errs 0 0 2 - - 3009 0 0 0 - - 3009这里最后一列:
pci errs可以理解为 PCIe replay 相关的累计计数。
比较重要的是:
3009 3009 3009数值虽然不为 0,但已经不继续增长。
这和之前的:
AER: Uncorrectable (Fatal) Xid 79 GPU has fallen off the bus不是同一个严重程度。
PCIe 本身有链路层重传机制,所以可能出现:
PCIe 传输出现错误 ↓ 链路自动 replay ↓ 重传成功 ↓ CUDA / 大模型任务继续正常因此,单纯看到一个比较大的累计值,并不等于当前仍然存在持续故障。
相比绝对值,我更关注的是:
这个值是否继续增长。
例如:
3009 3009 3009 3009比:
3009 3200 3800 5000健康得多。
后续可以持续观察:
nvidia-smi dmon-i0-set-d10-oT同时监控内核:
journalctl-k-f|grep--line-buffered-Ei'AER|NVRM|Xid|PCIe|fallen off'目前实际情况是:
大模型持续稳定运行 PCIe replay 计数没有继续明显上涨 没有新的 Xid 79 没有 GPU fallen off bus所以目前继续使用 595.71.05。
十二、这次问题的完整时间线
整个过程可以总结为:
最初使用 595.84 ↓ PCIe AER Fatal / Xid 79 GPU fallen off the bus ↓ 回退 595.71.05 ↓ 系统恢复稳定 ↓ 当时忘记执行 apt-mark hold ↓ 2026-08-12 06:15 unattended-upgrades 自动启动 ↓ 整套 NVIDIA 595 被自动升级到 595.84 ↓ 由于机器没有重启 RAM 中仍然是 595.71.05 磁盘已经是 595.84 ↓ 发现: /proc = 595.71.05 modinfo = 595.84 ↓ 幸好 /var/cache/apt/archives 仍保留完整 595.71.05 deb ↓ 本地整套 downgrade ↓ RAM = 595.71.05 Disk = 595.71.05 ↓ apt-mark hold ↓ reboot ↓ 595.71.05 正常加载 ↓ 目前系统和大模型运行稳定十三、这次最大的经验
1. 驱动回退成功后,一定记得 HOLD
解决问题不代表事情结束。
如果仓库中的 Candidate 仍然是问题版本,而 unattended-upgrades 又正常开启,那么迟早可能再次自动升级。
检查:
apt-mark showhold应该成为回退驱动之后的固定步骤。
2./proc和modinfo同时检查非常有用
只看:
nvidia-smi可能无法及时发现磁盘上的驱动已经被后台升级。
以后遇到类似情况可以直接:
cat/proc/driver/nvidia/version modinfo-Fversion nvidia如果两个版本不同:
/proc = old modinfo = new基本就说明:
驱动软件包已经在运行期间发生变化,但当前内核仍然加载旧模块。
这个状态下尤其要慎重 reboot。
3. 不要随便清理/var/cache/apt/archives
这次能够快速恢复,最大的幸运就是:
595.71.05 的全部 .deb 还在对于生产环境里已经验证稳定、但仓库可能随时淘汰的 NVIDIA 驱动版本,建议直接另外存一份:
/root/nvidia-595.71.05-debs/以后恢复会简单很多。
4. 不建议为了锁 NVIDIA 而关闭全部 unattended-upgrades
unattended-upgrades本身仍然负责 Ubuntu 的很多正常安全更新。
更合理的方式是:
系统安全更新继续 + 已知不稳定的 NVIDIA 驱动单独 HOLD而不是一刀切关闭全部自动安全更新。
最终状态
目前系统:
OS : Ubuntu 24.04 GPU : NVIDIA GeForce RTX 5090 Driver : 595.71.05 Open Kernel Module RAM : 595.71.05 Disk : 595.71.05 DKMS : 595.71.05 APT HOLD : 已配置 Reboot : 已完成 CUDA/LLM : 正常稳定运行这次问题最终不是一个新的 GPU 硬件故障,而是之前修复之后漏掉了最后一个非常重要的步骤:
HOLD。
导致 unattended-upgrades 在 2026-08-12 又把 595.84 自动装了回来。
好在发现时机器还没有重启,旧的 595.71.05 内核模块仍然存活在 RAM 中,同时 APT cache 里也保留了完整旧包,因此最终顺利恢复。