news 2026/9/29 3:51:09

Ubuntu 24.04 NVIDIA驱动安装与排错:DKMS内核模块指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 24.04 NVIDIA驱动安装与排错:DKMS内核模块指南

不夸张地说,我在 Ubuntu 24.04 上装 NVIDIA 驱动,前前后后折腾了快一个晚上。升级完系统,第一次跑nvidia-smi就直接给我来了一句couldn't communicate with the NVIDIA driver,心里那个凉。后来又是黑屏、登录循环、Xorg 报错,一个接一个。这篇文章我把自己在 Ubuntu 24.04、23.10 这类较新版本上踩过的坑、试出来的路子,按完整流程整理出来。不管你是刚装好系统准备装驱动,还是装完已经翻车在找救命稻草,这篇应该都能给你省下不少时间。

1. 新版本 Ubuntu 装 NVIDIA 驱动,到底难在哪

1.1 内核越新,驱动模块被卡住的概率越高

Ubuntu 24.04 LTS 默认带的是 6.8 内核,23.10 是 6.5 内核。对普通人来说内核新一点是好事,硬件兼容性更好,但对 NVIDIA 闭源驱动来说,新内核往往意味着新的麻烦。NVIDIA 驱动并不是一个复制进去就能用的二进制文件,它在安装时要把nvidia.ko、nvidia_drm.ko、nvidia_modeset.ko这些内核模块针对当前内核版本重新编译一次。如果官方驱动还没适配最新内核的 API,编译就会失败,模块装不上,自然nvidia-smi就找不到驱动。

另外一个隐藏问题是编译器。Ubuntu 24.04 自带的 gcc 已经是 13.x,部分旧版 NVIDIA 驱动(比如 470、535 的某些小版本)在 6.8 内核 + gcc 13 的组合下,编译期会报一些警告升级成错误的问题。这也是为什么同样的安装命令,在 22.04 上一点事没有,换到 24.04 就各种失败。理解了这一层,你就明白为什么解决较新版本 Ubuntu 的驱动问题,不能只靠网上老教程里的“三条命令搞定”。

1.2 常见报错对号入座,先别急着重装系统

很多人一看到nvidia-smi报错或者开机黑屏,第一反应是卸载重装,或者干脆重做系统。其实大部分问题都有明确的指向性,先判断是哪一类,再对症下药,效率会高很多。我列出这段时间高频遇到的几类错误:

错误 / 现象出现场景主要嫌疑
nvidia-smi has failed because it couldn't communicate with the NVIDIA driver刚装完驱动或升级内核后内核模块未加载、Secure Boot 拦截、DKMS 编译失败
(EE) NVIDIA: Failed to load module "glxserver_nvidia"进桌面时 Xorg 日志报错驱动安装不完整、Xorg 与驱动版本不匹配
登录界面死循环,输入密码又回到登录页装完驱动重启后GDM 与 NVIDIA GLX 冲突、Xorg 崩溃
开机直接黑屏,只剩光标重启后进桌面阶段nouveau 冲突、nvidia-drm.modeset=1搭配问题
DKMS build 过程报错安装驱动或内核升级时缺内核头文件、gcc 版本不对、源码与内核 API 不兼容

需要注意,同一个现象可能由不同原因引起。比如nvidia-smi通信失败,可能是模块没加载,也可能是 Secure Boot 把模块拒了。所以后面每一步排查,我都会说清楚怎么看日志、怎么确认具体原因,而不是盲目跑命令。

2. 准备阶段:三件事不做,后面全是坑

2.1 确认显卡型号和推荐驱动版本

动手前先做点侦查。终端里执行:

lspci | grep -i nvidia

输出会告诉你显卡型号,比如GA106 [GeForce RTX 3060 Lite Hash Rate]。

然后执行:

ubuntu-drivers devices

这个命令是 Ubuntu 官方提供的驱动检测工具,会列出当前硬件可用的驱动,并标出哪个是推荐版本。正常情况下你会看到这样一段:

driver : nvidia-driver-550 - third-party non-free recommended

看到 recommended 基本就不用纠结版本,直接装它。如果你的机器是 NVIDIA 笔记本 + Intel 核显的混合架构,检测结果可能会显示多个可用驱动,此时优先选推荐的那个,通常不会错。如果你有明确的 CUDA 版本要求,再按 CUDA 官方文档核对该 CUDA 版本需要的驱动下限。

2.2 先把系统更新到位,内核头文件必须装

这是我最想强调的一步。很多人拿着刚刻盘装好的 Ubuntu 24.04 镜像就直接ubuntu-drivers install,然后莫名其妙失败,其实很可能是系统镜像里的内核已经积累了几个小版本的修复,但你没有升级。

先把基础打好:

sudo apt update sudo apt upgrade -y sudo reboot

重启后确认内核版本:

uname -r

比如输出6.8.0-47-generic。接下来必须安装当前内核对应的头文件,这是 DKMS 编译 NVIDIA 内核模块的硬性依赖:

sudo apt install -y build-essential linux-headers-$(uname -r)

我见过太多人卡在 DKMS build 失败,打开 make.log 一看,第一行就是找不到linux/version.h这类文件。这就是典型的没装内核头文件。还有一点,如果你手动换过内核或者用过主线内核 PPA,要确保/usr/src/下的头文件目录和你uname -r的内核版本完全一致,不一致就继续sudo apt install linux-headers-$(uname -r)补上。

2.3 Secure Boot 要么关掉,要么签好名

这个话题在较新版本 Ubuntu 上极其重要。Secure Boot 开启时,内核只加载有合法签名的模块。NVIDIA 闭源驱动默认没有 UEFI 签名,所以即使模块编译成功,系统也会拒绝加载。

检查状态:

mokutil --sb-state

如果输出SecureBoot enabled,那你面临两个选择。

一种是直接进 BIOS 关闭 Secure Boot。这个方法最干脆,适合大多数个人电脑。不同厂商主板入口位置不一样,一般在 Boot 或 Security 分类下,找到 Secure Boot 设为 Disabled 保存重启即可。

另一种是保持开启,使用 MOK(Machine Owner Key)签名。在 apt 安装 NVIDIA 驱动的过程中,终端会提示你设置一个 MOK 密码,重启后会自动进入蓝色 MOK 管理界面,选择Enroll MOK,输入刚才设置的密码,再重启,系统才会信任这个驱动模块的签名。但很多人在这一步没看到终端提示就直接重启,进去后发现驱动根本没生效,然后又绕一大圈。

如果你已经装完驱动才发现 Secure Boot 是开启的,也可以主动导入签名:

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der

但我个人的实际建议是:除非工作环境或安全策略强制要求,否则装 NVIDIA 驱动的机器直接关掉 Secure Boot 省心得多。

3. 三种安装方式怎么选,以及各自的细节

3.1 方法一:ubuntu-drivers 自动安装,最推荐

这是 Ubuntu 官方推荐的路径,也是我试下来最省心的方式。它会根据你的硬件自动匹配驱动版本,同时把nvidia-settings、libnvidia-compute等配套包一起装好,还自动处理 nouveau 冲突。

sudo ubuntu-drivers install

想指定版本也可以:

sudo ubuntu-drivers install nvidia:550

装完重启:

sudo reboot

重启后验证:

nvidia-smi

正常会看到驱动版本、CUDA 版本、显存占用等信息。这种方式对新手最友好,因为它走的是 Ubuntu 源,和系统集成度高,以后内核升级时 DKMS 也会自动重新编译模块,不需要你手动介入。

3.2 方法二:直接用 apt 装指定版本

有时候ubuntu-drivers devices没有正确显示推荐项,或者你因为某个项目需要装特定版本,那就直接用 apt:

apt search nvidia-driver | grep '^nvidia-driver'

先看看源里有哪些版本,然后:

sudo apt install -y nvidia-driver-550

这里注意一个细节:Ubuntu 的 NVIDIA 驱动包命名是nvidia-driver-xxx,其中 xxx 是驱动版本号。选版本时不要盲目选最新,要看你显卡的架构和项目需求。老一点显卡(比如 Maxwell、Pascal)可以去源里找 legacy 分支,比如nvidia-driver-470。新显卡则尽量选 535 或 550 这些较新的分支。

另外,不管哪种安装方式,都建议主动确认 nouveau 被禁用。虽然 Ubuntu 装 NVIDIA 驱动时会自动处理,但自己动手更保险:

sudo bash -c 'echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nvidia-nouveau.conf' sudo update-initramfs -u

执行后可以用lsmod | grep nouveau检查是否还存在加载。确认没有 nouveau 了再重启,否则装完还是可能被开源驱动干扰。

3.3 方法三:官方 .run 文件安装,为什么我不太推荐

NVIDIA 官网下载的NVIDIA-Linux-x86_64-550.xx.run不是不能用,而是在 Ubuntu 上它和系统包管理集成度太差。用 .run 装完,以后每次升级内核,驱动模块不一定能自动重新编译;同时如果 apt 里后来又装了其他 NVIDIA 相关包,两个来源容易互相打架,出现各种莫名其妙的问题。所以我一般把它作为备选方案,只有当源里的驱动版本太老,或者显卡太新需要发布会最新驱动时才考虑。

如果你确实要用 .run,这里有一套相对安全的流程:

  1. 按 Ctrl+Alt+F3 切换到文本终端。
  2. 停止桌面管理器。GDM 是默认的,执行:
sudo systemctl stop gdm

如果你用的是 lightdm,就停sudo systemctl stop lightdm。

  1. 给 .run 文件加权限并安装:
chmod +x NVIDIA-Linux-x86_64-550.xx.run sudo ./NVIDIA-Linux-x86_64-550.xx.run --no-opengl-files

--no-opengl-files是我强烈建议加的参数。Ubuntu 桌面的 OpenGL 相关库和系统深耦合,直接用官方安装包覆盖,很容易引发登录循环或花屏。不加这个参数翻车概率很高。

  1. 安装完后重建 initramfs:
sudo update-initramfs -u
  1. 重启:
sudo reboot

还是那句话,标准 Ubuntu 24.04/23.10 环境,能用 apt 尽量 apt。.run 是最后选择。

4. 装完翻车现场:怎么定位,怎么救

4.1 nvidia-smi 报 couldn't communicate,按这个顺序排查

这个错误几乎人人都会遇到,关键是不要一看报错就卸载重装。按下面的顺序查。

先看模块有没有加载:

lsmod | grep nvidia

如果为空,说明内核里根本没有 NVIDIA 模块。再试着手动加载:

sudo modprobe nvidia

如果报错是:

modprobe: ERROR: could not insert 'nvidia': Key was rejected by the service

那基本就是 Secure Boot 在拦截,回到第 2.3 节处理。如果报Unknown symbol或Invalid module format,说明模块和当前内核不匹配,大概率是内核升级后旧模块还在。

再看内核日志:

dmesg | grep -i nvidia | tail -20 journalctl -k -b | grep -i nvidia

如果出现nvidia: disagrees about version of symbol module_layout这一类信息,说明模块是用其他内核版本编译的,需要用 DKMS 针对当前内核重新编译。

查看 DKMS 状态:

dkms status

如果显示某个 NVIDIA 内核模块状态是failed,去查看编译日志:

cat /var/lib/dkms/nvidia/550.xx/build/make.log | tail -50

定位到错误后,常见补救是补装内核头文件、调整 gcc 版本,然后重新构建:

sudo dkms install nvidia/550.xx -k $(uname -r) sudo update-initramfs -u sudo reboot

模块能加载但nvidia-smi还是失败的,检查一下设备节点:

ls -l /dev/nvidia*

如果设备节点不存在,重新 modprobe 后一般会自动生成。另外,如果你是在虚拟机里,或者机器上根本没有 NVIDIA 物理显卡,那当然报这个错,排除硬件环境再看。

4.2 登录循环、黑屏,多半是 Xorg 和 GDM 的问题

装完驱动重启,卡在登录界面输密码又弹回来,或者直接黑屏,这是最让人崩溃的场景。别慌,先切到文本终端,按 Ctrl+Alt+F3 登录进去,看这几类日志:

cat ~/.xsession-errors 2>/dev/null | tail -50 journalctl -xe -u gdm | tail -50 grep -i EE /var/log/Xorg.0.log

如果 Xorg 日志里能看到:

(EE) Failed to load module "nvidia" (module does not exist, 0)

说明驱动模块压根没被 Xorg 加载。此时要回到第 4.1 节把内核模块层面解决掉,再重启 Xorg。

如果日志里没有明确的模块报错,可以尝试重装驱动并更新 initramfs:

sudo apt install --reinstall nvidia-driver-550 sudo update-initramfs -u

还有一种常见情况是nvidia-drm.modeset=1这个内核参数和桌面环境不兼容。如果你在 GRUB 里加了这个参数,或者系统自动生成时带上了,尝试去掉它再启动。编辑/etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

然后:

sudo update-grub sudo reboot

这个参数主要影响 Wayland 和硬件加速,在 X11 下不是必需的。如果去掉后能正常进桌面,说明问题出在这里。

如果驱动层面查不出问题,可以切换桌面管理器。把 GDM 换成 lightdm 试试:

sudo apt install -y lightdm sudo dpkg-reconfigure lightdm

选择 lightdm 确认后重启。这个操作能解决部分 NVIDIA 驱动下的登录循环问题,特别是老显卡。

4.3 glxserver_nvidia 报错,Xorg 扩展模块路径不对

日志里看到:

(EE) NVIDIA: Failed to load module "glxserver_nvidia" (module does not exist, 0)

这种情况通常发生在驱动安装不完整,或者 Xorg 在启动时找不到 NVIDIA 提供的 GLX server 模块。先检查模块文件是否存在:

ls -l /usr/lib/xorg/modules/extensions/ | grep nvidia

正常情况会看到类似libglxserver_nvidia.so.550.xx的文件。如果没有,重装一次驱动。如果你之前用的是 .run 安装且参数不对,很可能这个文件没被正确放置。可以从驱动包安装目录拷贝:

sudo cp -r /usr/lib/xorg/modules/extensions/nvidia /usr/lib/xorg/modules/extensions/

之后重建 initramfs 并重启 Xorg。另外,Xorg 版本太旧而驱动太新,或者驱动太旧而 Xorg 太新,也会引起这个报错。Ubuntu 24.04 的 Xorg 是 21.1.x,如果你在强行使用 NVIDIA 470 这种 legacy 分支,就要做好它对新 Xorg 支持不完善的心理准备。老显卡建议直接apt install nvidia-driver-470,让源里自动匹配 legacy 包。

4.4 内核升级后驱动失效,DKMS 自动重建失效怎么办

这是长期使用中最常见的问题。某次 apt upgrade 自动升级了内核,重启后nvidia-smi又废了。原因很简单:新内核启动后,NVIDIA 内核模块需要为新内核重新编译一次。

正常情况下 DKMS 会接管这个过程,但如果你之前用 .run 装过,或者 DKMS 数据库状态混乱,就会失败。

检查:

dkms status

看到状态是installed就没事;看到failed或者新内核版本没有对应记录,手动执行:

sudo dkms autoinstall

或者指定内核版本:

sudo dkms install nvidia/550.xx -k 6.8.0-47-generic

完成后确认模块路径存在:

ls /lib/modules/6.8.0-47-generic/updates/dkms/ | grep nvidia

然后重建 initramfs 再重启:

sudo update-initramfs -u sudo reboot

这里提醒一句:不要手贱执行apt autoremove --purge,它有时候会把linux-headers-generic甚至dkms一起清理掉,之后驱动一坏就彻底没法自动重建了。

5. 收尾与长期维护经验

5.1 X11 还是 Wayland,别硬上

Ubuntu 24.04 默认已经在向 Wayland 靠拢,但 NVIDIA 驱动下的 Wayland 体验,尤其是多显示器和混流场景,还是有历史遗留问题。我的建议是:如果你是开发者、搞深度学习的,或者只是日常办公娱乐,直接选 X11 会话。登录界面齿轮图标里选 "Ubuntu on Xorg",稳定省心。

如果你确实需要 Wayland 的某些特性(比如 HiDPI 混合缩放),确保内核参数里有nvidia-drm.modeset=1,驱动版本 535 以上。实测下来,部分组合下还是会有小毛病,非刚需别折腾。

5.2 卸载驱动要干净,避免二次安装出问题

来回折腾驱动的时候,最忌讳卸载不干净。apt 方式安装的,执行:

sudo apt purge '^nvidia' -y sudo apt autoremove -y

然后清理残留配置:

sudo rm -f /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u

如果你之前试过 .run 安装,还要手动清理/usr/lib/xorg/modules/extensions/下的 NVIDIA 残留,以及/usr/src/nvidia-550.xx这类构建目录,确认 /opt 下没有遗留 NVIDIA 相关文件夹。混装是最容易出鬼问题的,宁可多花十分钟,重新重启一次确认干净了再装新的。

5.3 配合 CUDA 和 Docker 的验证思路

NVIDIA 驱动装好之后,下一步大概率是 CUDA 或者容器环境。

CUDA Toolkit 可以直接用官方 run 文件装,它不需要重装驱动。验证时注意两个命令的区别:nvidia-smi看驱动和显存,nvcc -V看 CUDA 编译器版本。两者没有必然的版本绑定关系,只要驱动不低于 CUDA 要求的下限就行。

Docker 调用 GPU,先确认宿主机驱动正常,然后安装 runtime:

sudo apt install -y nvidia-container-toolkit sudo systemctl restart docker

跑一个测试容器:

docker run --gpus all --rm nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

如果容器里能正常输出 GPU 信息,说明驱动、runtime、container toolkit 全链路已经通了。混合显卡笔记本还可以装nvidia-prime,支持按需切换:

sudo prime-select on-demand

日常用核显省电,需要跑任务时再切 NVIDIA。


折腾了几年 Ubuntu 上的 NVIDIA 驱动,我最大的体会是:新版本系统报驱动错误,十有八九是内核模块没加载成功,而加载失败的原因,要么出在 Secure Boot 拦截,要么是内核头文件没装导致 DKMS 编译失败。安装前把准备工作做扎实,安装后不乱动系统,翻车概率能降八成。

最后分享一个笨办法但很管用的习惯:每次升级内核后,先跑一次dkms status,确认所有内核模块状态是 installed 而不是 failed,再去重启。这样能避免很多“睡一觉起来驱动又没了”的情况。真遇到问题了,别急着重装系统,按照本文第4节的排查顺序走一遍,大多数情况都能救回来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!