Ubuntu 升级后 NVIDIA 驱动修复指南

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-xxxreboot
Key was rejected by service BIOS 禁用 Secure Boot,或 sudo mokutil --import 签名
DKMS 编译报错 完全重装驱动(方案三)
重启后仍无效 执行 sudo modprobe nvidia 查看具体错误

参考资料

复制代码
相关推荐
|_⊙2 小时前
Linux 信号
运维·服务器·前端
xdpcxq10292 小时前
基于Blazor实现的跟踪光伏智能运维平台
运维
bush43 小时前
嵌入式linux学习记录十二,mmap
java·linux·学习
似水এ᭄往昔4 小时前
【Linux系统编程】--进程概念
linux·运维·服务器
Dxy12393102164 小时前
Linux 如何关闭关不掉的进程
linux·运维·chrome
小徐敲java4 小时前
Linux读取串口实时数据
linux·运维·服务器
辰_砂4 小时前
国产服务器操作系统编译nginx生成rpm包
运维·nginx
YOLO数据集集合5 小时前
配电站智能运维|变电一次设备识别|高压电气构件目标检测数据集|电力巡检
运维·人工智能·深度学习·yolo·目标检测·视觉检测
keyipatience5 小时前
25.Linux静态动态库全解析
linux·运维·服务器