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 查看具体错误

参考资料

复制代码
相关推荐
orion571 天前
Missing Semester Class1:course overview and introduction of shell
linux
SkyWalking中文站1 天前
认识 Horizon UI · 6/17:Trace 探索器
运维·监控·自动化运维
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
火车叼位1 天前
写给初级开发者:SSL、SSH、HTTPS 与证书体系全解析
运维
用户805533698032 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698032 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
小猿姐2 天前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
七歌杜金房2 天前
我终于又有了自己的 Linux 电脑
linux·debian·mac
SkyWalking中文站2 天前
认识 Horizon UI · 5/17:3D 基础设施地图
运维·监控·自动化运维
tntxia3 天前
linux curl命令详解_curl详解
linux