Ubuntu 升级后 NVIDIA 驱动修复指南
问题背景
从 Ubuntu 20.04 升级到 24.04 后,内核更新导致 NVIDIA 驱动失效,执行 nvidia-smi 报错:
text
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
Make sure that the latest NVIDIA driver is installed and running.
错误原因分析
执行 sudo modprobe nvidia 后可能看到:
text
modprobe: FATAL: Module nvidia not found in directory /lib/modules/6.8.0-124-generic
这说明:当前内核已更新(如 6.8.0-124-generic),但 NVIDIA 内核模块没有为新内核编译安装。
NVIDIA 驱动通过 DKMS 机制为每个内核版本单独编译内核模块,升级系统时内核更新了,但 DKMS 自动重建模块的过程可能失败,导致驱动与新内核不兼容。
常见失败原因
| 原因 | 说明 |
|---|---|
| DKMS 编译失败 | 编译器版本或内核头文件缺失 |
| Secure Boot 阻止 | 启用安全启动时,未签名的内核模块被拒绝加载 |
| 驱动与内核版本不兼容 | 老旧驱动无法在新内核上编译(如 390 驱动 + 6.5+ 内核) |
诊断步骤
依次执行以下命令,定位问题:
bash
# 1. 查看当前内核版本
uname -r
# 2. 检查 DKMS 状态------看 nvidia 模块是否已为当前内核安装
dkms status | grep nvidia
# 3. 尝试手动加载模块,看具体错误
sudo modprobe nvidia
# 4. 查看驱动安装日志
cat /var/log/nvidia-installer.log | tail -50
解决方案
方案一:通过 DKMS 重新编译驱动(最常用)
bash
# 安装当前内核对应的头文件(编译模块必需)
sudo apt install linux-headers-$(uname -r)
# 查看已安装的 NVIDIA 驱动版本
dpkg -l | grep nvidia-driver
# 重新配置 DKMS,强制重新编译模块
# 将 <version> 替换为查到的版本号,如 550 或 560
sudo dpkg-reconfigure nvidia-dkms-<version>
# 如果上一步无效,手动通过 dkms 重新安装
sudo dkms remove -m nvidia --all
sudo dkms install -m nvidia -v <version>
# 重启
sudo reboot
方案二:指定内核版本安装驱动模块
bash
# 1. 先彻底清理旧的 NVIDIA 驱动
sudo apt-get purge '^nvidia-.*' '^libnvidia-.*'
sudo apt autoremove --purge
# 2. 安装与当前内核匹配的驱动及内核模块
sudo apt update
sudo apt install nvidia-driver-550 linux-modules-nvidia-550-$(uname -r)
# 3. 重启
sudo reboot
方案三:完全重装驱动(最彻底)
bash
# 1. 彻底清理所有 NVIDIA 相关包
sudo apt purge 'nvidia-*' 'libnvidia-*' 'cuda-*'
sudo apt autoremove --purge
sudo apt autoclean
# 2. 清理 DKMS 中残留的 NVIDIA 记录
sudo dkms remove -m nvidia --all
# 3. 添加官方 PPA 并安装推荐驱动
sudo add-apt-repository ppa:graphics-drivers/ppa -y
sudo apt update
sudo ubuntu-drivers autoinstall
# 4. 重启
sudo reboot
处理 Secure Boot 问题
如果重启后 sudo modprobe nvidia 提示 Key was rejected by service,说明是 Secure Boot 阻止了模块加载:
方法 A:禁用 Secure Boot(最简单)
重启进入 BIOS → Security → Secure Boot → Disabled
方法 B:为驱动签名(保留 Secure Boot)
bash
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
然后重启,按提示完成 MOK 注册(需要设置一次密码)。
成功案例:560 驱动编译成功
以下日志显示 DKMS 成功为内核 6.8.0-124-generic 编译并安装了 NVIDIA 560 驱动:
text
sudo dpkg-reconfigure nvidia-dkms-560
Removing all DKMS Modules
Error! The module/version combo: nvidia-560.28.03 is not located in the DKMS tree.
Done.
INFO:Enable nvidia
Loading new nvidia-560.28.03 DKMS files...
Building for 6.8.0-124-generic
Building for architecture x86_64
Building initial module for 6.8.0-124-generic
Done.
nvidia.ko.zst: Installing to /lib/modules/6.8.0-124-generic/updates/dkms/
nvidia-modeset.ko.zst: Installing to /lib/modules/6.8.0-124-generic/updates/dkms/
nvidia-drm.ko.zst: Installing to /lib/modules/6.8.0-124-generic/updates/dkms/
nvidia-uvm.ko.zst: Installing to /lib/modules/6.8.0-124-generic/updates/dkms/
nvidia-peermem.ko.zst: Installing to /lib/modules/6.8.0-124-generic/updates/dkms/
depmod.....
Processing triggers for initramfs-tools (0.142ubuntu25.8) ...
update-initramfs: Generating /boot/initrd.img-6.8.0-124-generic
编译成功后,只需重启即可:
bash
sudo reboot
重启后运行 nvidia-smi 验证。
验证修复
bash
# 检查内核版本
uname -r
# 检查 NVIDIA 模块是否存在
ls /lib/modules/$(uname -r)/kernel/drivers/video/ | grep nvidia
# 检查驱动状态
nvidia-smi
正常输出应显示 GPU 信息、驱动版本和 CUDA 版本。
预防措施(锁定版本)
为避免下次内核升级后驱动再次失效,可以锁定内核和驱动版本:
bash
# 锁定当前驱动版本(如 560)
sudo apt-mark hold nvidia-driver-560
# 锁定当前内核(以 6.8.0-124 为例)
sudo apt-mark hold linux-image-6.8.0-124-generic
sudo apt-mark hold linux-headers-6.8.0-124-generic
常见问题速查表
| 问题 | 解决方法 |
|---|---|
Module nvidia not found |
sudo apt install linux-headers-$(uname -r) → sudo dpkg-reconfigure nvidia-dkms-xxx → reboot |
Key was rejected by service |
BIOS 禁用 Secure Boot,或 sudo mokutil --import 签名 |
| DKMS 编译报错 | 完全重装驱动(方案三) |
| 重启后仍无效 | 执行 sudo modprobe nvidia 查看具体错误 |
参考资料