☰
Ubuntu 22.04安装NVIDIA驱动:附加驱动、排错与加固全攻略
2026/9/29 18:53:26 网站建设 项目流程

1. 别急着上官网下驱动,先搞懂Ubuntu 22.04这套驱动机制

如果你在搜索引擎里敲过"Ubuntu 安装NVIDIA驱动",大概率会看到两派意见:一派让你去NVIDIA官网手动下载.run文件,另一派让你用Ubuntu自带的"附加驱动"工具点点鼠标就完事。我个人的建议很明确:能用附加驱动工具解决的,绝不去官网折腾.run文件。不是因为官网驱动不好,而是很多新手栽跟头,恰恰就栽在手动安装这个环节上。

先说清楚Ubuntu 22.04的驱动体系是怎么回事。Ubuntu的软件仓库里维护着一批经过打包、测试的NVIDIA闭源驱动,这些驱动被打成nvidia-driver-XXX这样的软件包,同时配套了nvidia-utils、libnvidia-compute等一系列依赖组件。系统自带的"软件和更新"工具里有一个"附加驱动"选项卡,它会自动检测你机器上的显卡型号,然后把可用的驱动版本列出来供你选择。

这套机制最大的优点不是"方便",而是依赖关系由系统统一管理。你用apt安装驱动时,所有配套的库、内核模块、X.Org配置脚本都会被正确摆到该去的位置,卸载时也能干干净净。手动装.run文件看着是"官方原版",实际上容易踩到Secure Boot签名、内核模块编译失败、gcc版本不匹配这一连串坑。

咱们这篇就围绕附加驱动工具这条路走,把安装过程一步步拆开,再把最常见的报错和修法讲透。文中的命令和步骤我在Ubuntu 22.04 LTS上实测过,内核版本从5.15到6.x都适用。

有一点先说明:如果你手头是笔记本双显卡(Intel+ NVIDIA),装完驱动后还需要处理PRIME切换问题,这部分我会在第五节单独讲。

2. 装之前先查这三样:显卡型号、当前驱动状态、Secure Boot

很多人一上来就打开"附加驱动"面板,发现里面空白或者只有"继续使用手动安装的驱动"这一行字,然后就懵了。其实大概率是前置检查没做全。装驱动前,我建议你先花三分钟确认下面三件事。

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

打开终端,执行:

ubuntu-drivers devices

这个命令会扫描你的GPU硬件,并列出可用的驱动包。输出大致长这样:

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 == modalias : pci:v000010DEd00002444sv00001462sd00003F5Fbc03sc00i00 vendor : NVIDIA Corporation model : GA104 [GeForce RTX 3070 Laptop GPU] driver : nvidia-driver-535-server - third-party - proprietary driver : nvidia-driver-545 - third-party - proprietary driver : nvidia-driver-535 - third-party - proprietary driver : nvidia-driver-470 - third-party - proprietary driver : nvidia-driver-525 - third-party - proprietary driver : nvidia-driver-418-server - third-party - proprietary driver : nvidia-driver-515 - third-party - proprietary driver : nvidia-driver-390 - third-party - proprietary driver : xserver-xorg-video-nouveau - distro free builtin

这里列出了所有候选驱动,注意看每行末尾的标识:third-party - proprietary表示第三方闭源驱动,distro free builtin表示开源的nouveau驱动。列出的版本可能有一大串,但推荐版本通常是某一款被特别标记的(新版ubuntu-drivers会在推荐项后面加recommended字样)。

如果输出里只看到nouveau而没有任何NVIDIA驱动包,说明软件源里的驱动索引没更新,先跑一下:

sudo apt update

再重新执行ubuntu-drivers devices。仍然没有的话,检查你是不是用了minimal镜像,有些精简安装源里不包含ubuntu-restricted-extras这类闭源组件,稍后我会给出补充方案。

2.2 检查当前驱动是否已经残留

如果机器之前装过NVIDIA驱动,或者曾经折腾过.run文件,直接再走附加驱动流程容易出幺蛾子。先看看当前加载的是啥:

lsmod | grep nvidia

没有任何输出,说明内核里没有加载NVIDIA模块,状态干净。如果有输出,说明之前装过,再看一下具体装了哪个版本:

nvidia-smi

假如能正常显示显卡信息,说明驱动其实已经在用了,你只需要判断版本是否满足需求,不一定非要重装。假如提示NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver,说明驱动模块和内核不匹配,或者模块加载失败,这时候需要先清理再装。清理步骤我在第四节的报错修复里详细说。

2.3 Secure Boot:最容易忽略的一道坎

这玩意儿是UEFI的安全启动机制。如果你的机器开启了Secure Boot,而Ubuntu安装时没有注册对应的MOK(Machine Owner Key),那么第三方驱动模块在重启后不会被加载。现象就是你装完了、重启了,然后nvidia-smi依然报错说找不到驱动。

检查方式:

mokutil --sb-state

输出SecureBoot enabled就说明开着,SecureBoot disabled说明没开。

如果你的状态是enabled,装驱动时系统会提示你设置一个MOK密码,重启后会进入蓝色的MOK管理界面,选择"Enroll MOK",输入密码确认,再重启一次才算真正生效。这一步很多人没留意,密码设完就忘了,重启时跳过了MOK确认,结果驱动怎么装都装不上。

我个人更推荐的做法:装驱动前直接在BIOS里把Secure Boot关掉(如果你日常不需要它)。关闭后少一道签名校验,驱动加载路径最顺畅。当然,如果你有安全方面的硬性要求必须开着,那就老老实实走MOK流程。

3. 图形界面安装流程:全程要点截图记忆

前置检查做完了,下面进入正题。附加驱动工具的图形界面其实没有什么高深操作,但有几个交互细节容易看漏,我逐步描述一下,你对着走就行。

3.1 打开附加驱动面板

在GNOME桌面下,按Super键(Windows键)呼出活动概览,输入"软件和更新",打开后切到"附加驱动"选项卡。这时系统会花几秒钟扫描硬件和可用驱动,界面会列出你的显卡以及所有可用驱动选项。

如果你打开后看到界面里有一个圆圈在转或者完全空白,大概率是软件源刷新异常,去"Ubuntu软件"选项卡里把下载服务器换成国内镜像源,然后在终端执行sudo apt update,再切回来。这个情况在刚装完系统的机器上很常见。

3.2 选择合适的驱动版本

在驱动列表里,你会看到多个nvidia-driver版本,外加一个开源的nouveau选项。这时候怎么选?

选型逻辑我直接给结论:

  • 新手首选:列表中标有recommended字样的版本,这是Ubuntu维护者根据显卡型号和你当前内核版本综合评估后推荐的稳定版。
  • 有CUDA开发需求:选较新的版本(如545、550系列),新驱动对CUDA 12.x支持更完整,但前提是你内核版本够新。
  • 老旧显卡(GTX 700系列及更早):选470或390这类长期维护分支,新版驱动已经砍掉了对老架构的支持。
  • 服务器场景:选带-server后缀的版本,例如nvidia-driver-535-server,它去掉了桌面端的图形增强组件,稳定性和内存占用都更优。

选好后点击"应用更改",系统会提示输入密码,然后开始下载安装。这期间终端窗口会弹出apt的执行过程,看到Setting up nvidia-dkms-535这行时,说明正在通过DKMS编译内核模块,这步会持续一两分钟,机器配置差的话可能更久,别急着关窗口。

3.3 重启并验证

安装完成后,图形界面会提示"重启计算机",点确认即可。

重启后验证驱动是否正常工作,按顺序执行三条命令:

nvidia-smi

正常能看到类似这样的输出:

+-----------------------------------------------------------------------------+ | NVIDIA-SMI 535.154.05 Driver Version: 535.154.05 CUDA Version: 12.2 | |-------------------------------+----------------------+----------------------+

接着验证内核模块是否加载:

lsmod | grep nvidia

应该能看到nvidia、nvidia_uvm、nvidia_drm、nvidia_modeset这几个模块。再验证图形加速是否启用:

glxinfo | grep "OpenGL renderer"

如果输出了你的NVIDIA显卡型号,说明图形渲染已经切换到NVIDIA了。这条命令需要先安装mesa-utils,没装的话glxinfo会提示命令不存在,执行sudo apt install mesa-utils即可。

到这一步,图形界面流程就走完了。整个过程确实简单,前提是前置状态干净、Secure Boot处理妥当。

4. 纯命令行安装:服务器和习惯终端用户的选择

有些人用的是Ubuntu Server版,或者桌面环境坏了只能进TTY,又或者你单纯觉得图形界面不够灵活,那就走命令行。命令行方式本质上和图形界面是同一套底层机制,都是通过ubuntu-drivers和apt来完成安装,好处是你能看到完整的输出日志,出问题更好定位。

4.1 自动安装推荐版本

最简单的方式:

sudo ubuntu-drivers install

这个命令会自动检测显卡,安装recommended版本的驱动包。装完后重启即可。

4.2 指定版本安装

想装特定版本就用:

sudo apt install nvidia-driver-535

注意这里的版本号可以替换成ubuntu-drivers devices列出的任何一个版本。安装过程同样会触发DKMS模块编译,看到类似这样的输出别慌,这是正常流程:

Building initial module for 6.2.0-36-generic Done.

4.3 安装配套组件

如果你是深度用户,装完驱动后通常还要装CUDA Toolkit和cuDNN。我这里的建议是:

sudo apt install nvidia-cuda-toolkit

这个包装的是Ubuntu仓库里的CUDA版本,通常比NVIDIA官网的CUDA发布晚一些,但胜在稳定、依赖全自动解决。如果你需要特定版本的CUDA(比如项目要求CUDA 11.8),那就得用NVIDIA的官方仓库,这个属于进阶内容,这篇先不展开。

另外,如果你要用到硬件编解码(比如FFmpeg的NVENC),需要确保驱动自带的相关库正常。NVIDIA官方驱动包从470版本开始已经包含了NVENC/NVDEC的运行时库,不需要额外装。用nvidia-smi显示的CUDA Version只是驱动支持的最高CUDA版本,并不是说已经装了CUDA工具链,这个别混淆。

4.4 命令行安装的坑:Kernel Headers缺失

命令行方式相比图形界面,更容易遇到一个经典报错——DKMS编译时说找不到内核头文件。报错长这样:

Error! Your kernel headers for kernel 6.2.0-36-generic could not be found. Please install the linux-headers-6.2.0-36-generic package.

原因很简单:DKMS要把驱动源码编译成内核模块,必须要有当前内核对应的头文件。解决方式:

sudo apt install linux-headers-$(uname -r)

uname -r会输出你当前内核版本号,这个命令会自动安装对应头文件。装完之后再重新安装驱动,或者执行:

sudo dkms autoinstall

重新触发模块编译即可。

5. 最常见的三个报错现场与完整排查链路

安装NVIDIA驱动,真正劝退大部分人的不是流程本身,而是一堆莫名其妙、搜遍全网也找不到同款的报错。这节我把出现频率最高的三个问题完整讲透,不光是给解决方案,更会带你走一遍排查逻辑。以后再遇到类似问题,你可以按同样的思路自己定位。

5.1 报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver

这是重启后跑nvidia-smi最常见的错误。看到这个提示,很多人的第一反应是"驱动没装好",然后重装一遍,结果还是不行。实际上这个报错涵盖的情况很多,核心是用户态工具(nvidia-smi)无法和内核态驱动模块通信,可能原因包括:

  • 内核模块根本没加载
  • 模块加载了但版本和nvidia-smi工具版本不匹配
  • 模块加载时依赖的firmware或辅助模块(如nvidia_uvm、nvidia_modeset)没加载成功
  • 内核模块编译时使用的内核版本和当前运行内核不一致(常见于内核升级后)

完整排查链路:

第一步,确认模块状态:

lsmod | grep nvidia
场景A:没有任何输出,说明模块没加载

手动尝试加载:

sudo modprobe nvidia

如果modprobe报错,比如modprobe: ERROR: could not insert 'nvidia': No such device,说明驱动模块没匹配上当前内核。这时候执行:

dkms status

看输出里有没有nvidia/535.xxx, 6.2.0-36-generic, x86_64: installed这样的记录。如果没有,或者状态是built而不是installed,说明模块编译了但没注册到当前内核。执行:

sudo dkms install -m nvidia -v 535.154.05

版本号换成你自己的。如果dkms status里压根没有nvidia记录,说明DKMS注册失败,需要重新安装驱动包:

sudo apt install --reinstall nvidia-driver-535
场景B:lsmod有输出,但nvidia-smi仍然报错

这通常是版本不匹配。看下加载的模块版本:

modinfo nvidia | grep version

再看下nvidia-smi的版本:

nvidia-smi --version

两者对不上,就说明apt装驱动时遗留下了旧版用户态工具。处理方式:

sudo apt purge nvidia-* -y sudo apt autoremove -y sudo apt install nvidia-driver-535
场景C:模块加载了,但报错NVIDIA-SMI has failed同时dmesg里有NVRM: failed to initialize字样
dmesg | grep NVRM

如果看到类似NVRM: The NVIDIA GPU 0000:01:00.0 is used by another driver的日志,说明nouveau驱动还在占用GPU。这是老生常谈的问题,新版Ubuntu 22.04的驱动装包一般会自动禁用nouveau,但如果是手动装.run文件残留的,就需要手动处理。

在/etc/modprobe.d/blacklist-nouveau.conf里写入:

blacklist nouveau options nouveau modeset=0

然后更新initramfs并重启:

sudo update-initramfs -u sudo reboot

5.2 报错:Failed to load module "glxserver_nvidia"

这个报错常见于启动图形界面时,日志里或者启动屏幕上提示(EE) NVIDIA: Failed to load module "glxserver_nvidia" (module does not exist, 0)。看到module does not exist就顺着这个线索查:为什么NVIDIA的GLX模块不存在?

大多数情况是驱动安装后X服务还在使用old的模块路径。排查方式:

ls /usr/lib/xorg/modules/extensions/

正常应该能看到libglxserver_nvidia.so这个文件。如果没有,说明Xorg的扩展模块没装上。

原因通常是:安装新驱动前没有彻底卸载旧的NVIDIA runfile安装版本,导致Xorg配置残留。这时候先把NVIDIA相关包全部清掉:

sudo apt purge nvidia-* -y sudo apt autoremove -y

然后删掉Xorg配置文件残留:

sudo rm -f /etc/X11/xorg.conf sudo rm -rf /etc/X11/xorg.conf.d/

重新安装驱动:

sudo apt update sudo ubuntu-drivers install

装完重启。如果问题依旧,再检查一下Xorg的日志:

cat /var/log/Xorg.0.log | grep EE

重点看有没有别的模块冲突。

5.3 报错:unable to load the kernel module 'nvidia.ko'

这个报错常见于内核升级之后,你之前装的驱动还在,但新内核找不到对应的nvidia.ko模块文件。频繁升级内核的Ubuntu用户最容易遭遇。

为什么升级内核会导致驱动失效?因为NVIDIA驱动是作为内核模块运行的,每个内核版本都需要单独编译对应的模块。APT升级内核时,DKMS理论上会自动为所有已注册的模块重建、重装,但这个流程有时会因为头文件缺失、DKMS配置损坏而中断。

排查链路:

dkms status

如果看到类似nvidia/535.xxx, 6.5.0-15-generic, x86_64: installed这样的记录但当前内核不是6.5.0-15,而是6.8.0-xx,说明DKMS没有成功为新内核编译模块。

手动触发:

sudo dkms autoinstall

如果报错提示找不到当前内核头文件,继续装头文件:

sudo apt install linux-headers-$(uname -r)

再执行sudo dkms autoinstall。

如果DKMS自动重建搞不定,干脆把驱动卸了重装一遍:

sudo apt purge nvidia-* -y sudo apt autoremove -y sudo apt install nvidia-driver-535

这套操作下来能解决90%的"内核升级后驱动失效"问题。另外提醒一句:升级完内核后如果驱动坏了,别急着回滚内核,先按上面几步操作,比回滚省事得多。

6. 双显卡笔记本与Wayland会话的额外功课

笔记本用户装完NVIDIA驱动后,通常会遇到两个新问题:一个是怎么切到独显运行,一个是Wayland登录黑屏或闪烁。这里单独讲一下。

6.1 PRIME切换

先看当前GPU使用状态:

prime-select query

输出on-demand说明处于混合模式(默认集成显卡渲染,按需调用独显),输出nvidia说明全局独显,输出intel说明全局核显。

需要切换时:

sudo prime-select nvidia

然后退出重新登录(或重启)。注意,老一点的NVIDIA驱动版本里prime-select可能叫nvidia-prime,用法一样。

想确认某个应用程序是否跑在独显上,可以用:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep "OpenGL renderer"

如果输出是NVIDIA型号,说明该程序已通过PRIME offload方式调用独显。在Steam或游戏里设置启动项时,前缀加上这两条环境变量即可。

6.2 GNOME Wayland下的NVIDIA驱动

Ubuntu 22.04默认登录界面可以选GNOME或GNOME on Wayland,NVIDIA驱动从535版本开始对Wayland的支持已经好了很多,但仍然存在一些兼容问题,表现最多的是浏览器滚动卡顿、视频播放闪烁。

如果你遇到这类问题,我的建议先用Xorg会话,稳定性优先。在登录界面点击用户名后,右下角的齿轮图标里切换到"GNOME on Xorg"。

如果你需要确认当前会话类型:

echo $XDG_SESSION_TYPE

输出wayland或x11,一目了然。

另外,Wayland下外接显示器分辨率异常、HDR不生效这些问题,也都是NVIDIA驱动在Wayland协议栈下尚未完全收敛的表现。如果工作流依赖多显示器且对刷新率敏感,现阶段老老实实用Xorg是务实选择。

7. 驱动卸载与换版本的正确姿势

驱动更新或换版本,最怕的就是卸载不干净导致新驱动装上后出各种怪问题。这里给出一套我认为最稳妥的卸载流程。

首先,切换到纯命令行模式(如果图形界面还能用,也可以直接在终端里操作,但卸载图形驱动的过程中可能黑屏):

sudo telinit 3

然后卸载所有NVIDIA软件包:

sudo apt purge nvidia-* -y

这一步会把驱动、DKMS模块、用户态工具、Xorg扩展全清掉。接着清除自动安装的孤儿依赖:

sudo apt autoremove -y

然后更新模块依赖索引:

sudo update-initramfs -u

确认没残留:

dpkg -l | grep nvidia lsmod | grep nvidia

第一条应该没有输出,第二条应该为空。有残余就继续清,没有就重启,重启后系统会加载nouveau开源驱动。

换新版本时,直接按第三节或第四节的方法安装新驱动即可。

顺带说下.run文件卸载的事:如果你之前是用NVIDIA官网的.run文件装的驱动,这时候用apt purge nvidia-*是清不干净的。需要重新运行那个.run文件并加--uninstall参数:

sudo nvidia-installer --uninstall

或者用nvidia-uninstall命令,在哪装的去哪卸,不然新旧配置容易打架。

8. 驱动装完后的稳定性加固与日常验证

驱动装上只是第一步,让它长期稳定运行才是正事。这里分享几个我实践下来很有用的加固措施和日常检查习惯。

8.1 锁定内核版本,防止升级后驱动失效

如果你工作流里对CUDA和NVIDIA驱动版本有强依赖,建议锁定内核版本,不让系统随便升级内核。方式有以下几种。

方式一:通过apt-mark锁定内核包

sudo apt-mark hold linux-image-generic linux-headers-generic

这会阻止内核相关的元包更新,也就阻止了新内核的引入。缺点是安全补丁也不会跟着更新了,适合短期锁定或特殊场景。

方式二:只保留一个内核版本

经常遇到的情况是系统里积攒了三四个旧内核,重启时grub默认加载最新的,而导致NVIDIA驱动编译失败。清理多余内核:

sudo apt autoremove --purge

这个命令能自动清掉不再需要的旧内核。

8.2 定一个"驱动体检日"

这个习惯是我自己摸索出来的。每隔两三周跑一次:

ubuntu-drivers devices dkms status nvidia-smi

三行命令,一分钟,就能看出驱动版本、DKMS模块状态、GPU运行情况是否有异常。特别是dkms status这一条,能提前发现新内核和模块之间的潜在冲突。

我遇到过最典型的案例:某次系统自动更新拉了一个新内核,dkms status里显示模块状态从installed变成了built——不是完全不可用,但说明下次重启后驱动很可能加载失败。提前发现后手动执行sudo dkms autoinstall,问题在发生前就解决了。

8.3 温度与功耗监控

NVIDIA驱动自带nvidia-smi监控工具,可以实时看温度、功耗、显存占用:

nvidia-smi -l 5

每秒刷新一次(这里的-l 5表示每5秒刷新一次)。

想看更直观的历史图表,可以装nvtop,它是GPU版的htop:

sudo apt install nvtop

运行后能实时看到每个进程的显存占用、GPU利用率和温度曲线。跑深度学习训练时,我习惯开着nvtop观察显存占用情况,防止OOM。

8.4 日志排查管道

最后给一条诊断命令管道,驱动出问题时先跑这个,基本能定位80%的问题:

sudo dmesg | grep -i nvidia | tail -50

这条命令会输出内核日志里所有NVIDIA相关信息,无论是模块加载失败、GPU掉驱动、还是PCIe错误,都能从这里找到线索。

我个人在实际操作中的体会是,Ubuntu 22.04的附加驱动工具已经非常成熟,绝大多数情况下你不需要和终端、DKMS、MOK这些底层机制打交道。但了解这套机制的工作原理,能让你在遇到问题时少走很多弯路。上面这些排查思路和命令,我几乎在每次装完新机器后都会用一遍,算是长期实践沉淀下来的经验。如果有哪一步没讲透,或者你遇到的是这篇没覆盖到的报错,把你的dmesg日志和dkms status输出贴出来,通常很快就能锁定问题方向。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询