简介:这份PDF指南聚焦Ubuntu系统下NVIDIA显卡驱动的安装全流程,面向Linux初学者以及需要配置深度学习、图形渲染等环境的开发者。内容以GTX970M为例,从确认显卡型号、在NVIDIA官网检索兼容驱动版本,到通过终端更新软件源并安装指定版本(如384),完整覆盖驱动安装的每个关键操作;同时说明卸载旧驱动、禁用nouveau等常见问题的处理方法,并给出nvidia-smi等验证方式,方便读者自行核对是否成功。资源为单个PDF文档,约489KB,篇幅精简、步骤清晰,适合边看边操作。文档覆盖Ubuntu 16.04与17.10,也提醒不同Ubuntu版本需匹配对应驱动,能帮助用户规避循环登录、依赖冲突等典型故障。该资源已有18858人学习浏览,是一份经过大量用户验证的实用入门参考。
1. Ubuntu 装 NVIDIA 驱动翻车之后,我为什么反而推荐“最土”的装法
在 Ubuntu 下安装 nvidia 显卡驱动,网上教程一大半会让你先禁掉 nouveau,再去官网下 .run 安装包手动编译,我早年也这么干过,结果内核版本差一点,重启后直接卡在登录界面进不去桌面。返工之后才发现,Ubuntu 自带的驱动管理器才是那个最省心的入口:它负责匹配仓库里可用的驱动分支,自动处理依赖和 blacklist,重启之后驱动就能正常接管显卡。这篇文章就把这套“简单安装方式”的完整路径拆开:装前 5 分钟检查硬件和系统状态,装时用图形界面或一条 ubuntu-drivers 命令搞定,装后确认 nouveau 与 PRIME 状态,再把登录循环、Secure Boot、内核升级这几个经典坑一次讲清。新手能照着走,熟手也能从里面找到以后少重装系统的那几个习惯。
2. 装前摸底:显卡型号、驱动版本、nouveau 与 Secure Boot 都不能省
很多人驱动装失败,不是安装命令不对,而是装之前的摸底工作没做够。先花三分钟弄清楚驱动在系统里的工作方式,后面排障心里才有底。NVIDIA 闭源驱动由两部分组成:内核模块(nvidia.ko、nvidia-modeset.ko 等)负责跟显卡硬件通信;用户态库(libcuda.so、libnvidia-gl.so 等)负责给 OpenGL、Vulkan、CUDA 提供接口。Ubuntu 开机时先加载内核模块,之后登录管理器才会调用用户态库去渲染桌面。只要内核模块和当前内核版本对不上,或者模块压根没被加载,桌面就会起不来,表现就是黑屏、登录循环,或者 nvidia-smi 弹一长串英文报错。这些问题里,超过一半能在动手前用几分钟检查排除掉。
2.1 先查硬件型号,别把驱动版本选错
打开终端,第一步先确认显卡型号。命令非常直接:
lspci | grep -i nvidia正常会输出一行类似01:00.0 VGA compatible controller: NVIDIA Corporation GA107 [GeForce RTX 3050 ...]的内容。前面的01:00.0是 PCI 总线地址,中括号里是具体型号。如果没搜到任何输出,换更宽泛的条件再看一下:
lspci | grep -i vga这步的重点是判断显卡架构代次。NVIDIA 驱动分支的版本号(常见类似 535、550 这种数字)会随时间更新,Ubuntu 软件源里也会跟随节奏同步对应分支。新版本驱动通常支持更新的 GPU 架构,也会保留对老 GPU 的兼容,但太老的卡(比如 2015 年前后的 Kepler、Maxwell 架构)在新分支里可能被移出支持名单,这时系统里往往只剩旧版本分支或开源驱动可选。所以选驱动版本时,与其死记型号对应表,不如直接看 Ubuntu 的“附加驱动”界面给你列出什么,系统已经把不匹配项过滤掉了。
实际选择上,我的习惯是:桌面日常使用,选中那个标记为推荐(recommended)的版本;计划跑 CUDA 或深度学习,再往前看一版,同时记下它的 CUDA 版本上限,这个数字在 nvidia-smi 顶部能看到。不要为了“新”去装比系统仓库推荐版本新很多的分支,那种分支往往需要额外配置源文件,反而脱离了“简单安装方式”的初衷。下表是装前检查的四个关键项,照着过一遍再动手。
| 检查项 | 命令 | 预期结果 | 异常时风险 |
|---|---|---|---|
| 显卡型号 | lspci | grep -i nvidia | 能看到 NVIDIA 设备行 | 显卡没被识别,先插好或检查 PCIE 槽位 |
| 残留驱动 | dpkg -l | grep -i nvidia | 无输出或少量输出 | 新旧驱动打架,登录循环 |
| nouveau 状态 | lsmod | grep nouveau | 无输出或安装前允许有 | 和闭源驱动抢显卡,黑屏 |
| Secure Boot | mokutil --sb-state | SecureBoot disabled | 驱动模块无法通过签名验证 |
2.2 检查残留驱动、nouveau 和 Secure Boot
动手之前依次确认三件事。第一,系统里是否装过别的 nvidia 包:
dpkg -l | grep -i nvidia输出里如果出现大量nvidia-driver-xxx、libnvidia-xxx,说明这台机器之前已经装过驱动,直接再装另一个版本容易留下两套模块互相干扰。处理方式是把这些包整体清掉:
sudo apt purge '^nvidia-.*' '^libnvidia-.*' '^libcuda.*' sudo apt autoremove这里注意写法,^nvidia-.*表示匹配所有以 nvidia- 开头的包名,libnvidia 和 libcuda 同理。purge 只删软件包和配置文件,不会动家目录数据;显卡驱动配置丢失无所谓,重装后会自动生成。如果这台机器之前从没装过驱动,这一步直接跳过。
第二,确认开源驱动 nouveau 的加载状态:
lsmod | grep nouveau只要输出非空,说明 nouveau 模块已经加载进内核。这里补充说明一下,Ubuntu 默认的内核里自带 nouveau 开源驱动,新装机时桌面能显示、能看视频,靠的就是它。装闭源驱动前,标准流程是把它加入黑名单并重新生成 initramfs,这个动作由驱动管理器自动完成。但自动生成过程中偶尔会有疏漏,所以我建议装完后再手动确认一次,方法放在第 4.1 节。
第三,检查 Secure Boot 状态:
mokutil --sb-state显示SecureBoot enabled时,闭源驱动装完后极大概率要过 MOK 签名流程才能在重启时加载。对新手来说,最省事的方案是进 BIOS 临时关闭 Secure Boot,装好驱动验证正常后再决定要不要重新打开。如果这台机器是企业统一下发的工作站,BIOS 加过密码没法动,那就直接走第 5.4 节的 MOK 流程。建议把这三个检查项结果记一下再继续,后面排障时能少绕很多弯路。
3. 最简单的安装方式:系统自带的驱动管理器一条龙
检查做完了,下面开始实际安装。既然标题强调的是“安装方式简单”,那就一定要记住一个原则:优先用 Ubuntu 自己的工具,别去网上下各种第三方脚本。这套路径在桌面版和服务端都有入口,分别对应图形界面和命令行。
3.1 图形界面:在“软件和更新”里点两下
Ubuntu 桌面系统里按下 Super 键(Windows 键),输入“软件和更新”,打开后切到“附加驱动”选项卡。界面会先扫描一下当前硬件,然后列出可用的显卡驱动方案。典型列表是这样的:
- NVIDIA 驱动分支的 metapackage(例如 nvidia-driver-550)
- 该分支的 server 版本(少数场景才会用)
- 开源驱动 xserver-xorg-video-nouveau
每条选项前面有单选按钮,选中推荐的 NVIDIA 分支后,窗口下方会出现“应用更改”按钮。点击并输入密码,系统就开始在后台下载安装。这期间不需要打开终端,也不需要盯进度,系统会自己完成三件事:
- 从软件源下载对应驱动包;
- 安装并配置 NVIDIA 相关依赖库(libnvidia-gl、nvidia-prime 等);
- 注册 DKMS,让驱动模块在内核升级后能自动重建。
整体耗时取决于网速和显卡型号,一般五到十五分钟。安装完系统会提示重启,重启后闭源驱动就会接管 GPU。这套图形界面路径表面上“土”,但它其实是最稳妥的:驱动来自官方仓库,依赖关系成套匹配,不会出现手动装 .run 文件时那种版本错位问题。唯一的缺点是你没法精确控制安装哪个分支号,仓库提供什么你就用什么,这对大多数场景完全够用。
3.2 命令行:ubuntu-drivers 让一切自动化
服务端、远程 SSH 或无桌面环境,用命令行完成同样的工作。先更新软件源,再扫描可用驱动:
sudo apt update ubuntu-drivers devices命令输出会详细列出显卡信息和可选驱动,类似下面这种结构:
== /sys/devices/pci.../ == modalias : pci:v000010DEd... vendor : NVIDIA Corporation model : GA107 [GeForce RTX 3050 Mobile] driver : nvidia-driver-550 - third-party - distro non-free driver : nvidia-driver-535 - third-party - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin字段含义简单解释一下:vendor和model是显卡身份信息,driver列出可选方案。名字后面带third-party的是闭源驱动,最后一项 nouveau 是开源驱动。列表里没有 nvidia-driver-* 项时,多半是软件源配置有问题,参考第 5.3 节处理。命令行直接装推荐版本:
sudo ubuntu-drivers autoinstall这个命令会自动选择标记为 recommended 的分支,并完成第 3.1 节里那三件事。它最大的好处是不要你手工指定版本号,适合第一次安装。如果想自己指定分支,用 apt 装也可以,建议把 dkms 一起写上:
sudo apt install nvidia-driver-550 dkms这里显式装 dkms 是为了防止某些精简镜像没有默认开启这个能力。dkms 的作用是,在内核升级时自动把 nvidia 内核模块针对新内核重新编译。没有它,每次内核升级后驱动都可能悄悄失效。参数方面,nvidia-driver-550 里的 550 只是分支代号,具体用哪个以ubuntu-drivers devices输出为准;列表里显示 535 就装 535,别拿旧教程里的编号硬套。
3.3 重启后验证:驱动是否真的装上了
重启后先别急着跑大应用,打开终端执行验证命令:
nvidia-smi驱动正常时,会输出一屏显卡状态表,开头几行类似:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 | +-----------------------------------------------------------------------------+ | 0 NVIDIA GeForce RTX 3050 ... On N/A | +-----------------------------------------------------------------------------+重点看三处:Driver Version对应你安装的分支号;CUDA Version只是驱动支持的最高 CUDA 版本,并不代表系统里装了 CUDA 工具包;GPU 名称行出现,代表内核已经正确识别显卡。如果命令报错,直接进第 5 章排障。
再补一个更底层的验证,确认内核模块真正接管了设备:
lspci -k | grep -A 2 -i nvidia期望看到Kernel driver in use: nvidia。如果显示nouveau或没有这行,说明驱动没能接管 GPU,需要回到第 4.1 节确认 nouveau 禁用状态。这两个命令都通过,安装环节就正式完成。
4. 装完的调整:nouveau 禁用确认、PRIME 切换与 CUDA 配合
到这步驱动已经能跑,但还有几个状态值值得手动确认一遍。驱动管理器虽然会自动完成大部分配置,但“自动”不等于“每台机器都成功”,特别是涉及 nouveau 黑名单和多显卡切换时,手动检查能省下后面排障的时间。
4.1 确认 nouveau 已禁用,别忽略 initramfs
驱动管理器安装闭源驱动时,通常会创建 blacklist 文件,路径在/etc/modprobe.d/blacklist-nvidia-nouveau.conf,内容就是禁止加载 nouveau 模块。先验证当前内核里到底还有没有 nouveau:
lsmod | grep nouveau输出为空,说明模块已经不在内核里运行了。如果还有输出,先看看 blacklist 文件是否存在:
cat /etc/modprobe.d/blacklist-nvidia-nouveau.conf 2>/dev/null文件不存在或内容为空时,手动创建:
sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf <<EOF blacklist nouveau options nouveau modeset=0 EOF改完 blacklist 之后,强烈建议重建 initramfs,否则模块可能仍然被带进启动镜像,重启后照样加载:
sudo update-initramfs -u这条命令的作用是重新生成系统启动时加载的临时文件系统,把 nouveau 相关模块剔除出去。很多人装驱动时会在这一步翻车:blacklist 文件写了,但没重建 initramfs,重启后 nouveau 照常加载,跟闭源驱动抢显卡,表现就是黑屏或登录循环。这种问题排查起来非常耗时间,成败往往就差这一条命令,别偷懒。
4.2 双显卡笔记本的 PRIME 切换
Intel/NVIDIA 或 AMD/NVIDIA 双显卡笔记本,驱动管理器装完闭源驱动后会自动带上 PRIME 支持。查询当前显示模式:
prime-select query典型输出是nvidia、intel、on-demand三者之一。切换模式用下面的命令:
sudo prime-select on-demand三种模式的适用场景,我整理成了表格:
| 模式 | 工作方式 | 适用场景 | 注意事项 |
|---|---|---|---|
| nvidia | 所有显示输出都走独显 | 外接显示器、高负载图形应用 | 功耗高,风扇噪声明显 |
| on-demand | 默认用核显,特定程序可调独显 | 日常办公兼顾性能 | 播放视频或开网页时默认核显够用 |
| intel | 完全关闭独显 | 排障、纯办公 | 外接独显口显示器无信号 |
切换后需要注销并重新登录一次,之后用prime-select query确认状态。这里有一个经典小坑:外接显示器接在独显的 DP/HDMI 口上,如果系统处于 on-demand 或 intel 模式,外接屏可能完全没有信号。遇到这种现象,把模式切到 nvidia 再试,大概率恢复。这不是驱动坏掉,是 PRIME 显示逻辑下的正常表现。
4.3 CUDA 环境配合:装驱动不等于装 CUDA
冲着驱动来的人里,有一大半是为了跑 CUDA 或深度学习。这里把驱动和 CUDA 的关系一次性说清。驱动是地基,CUDA 是上层工具链;nvidia-smi顶部显示的 CUDA Version,只是驱动支持的最高 CUDA 版本,与你系统里是否装过nvcc编译器并没关系。
我一般会这么规划:装完驱动后,如果只是要跑 PyTorch 或 TensorFlow,优先用官方发布的容器镜像或框架官方镜像,它们自带匹配好的 CUDA 依赖,省去本机环境的各种版本纠缠;只有项目明确要求在本机直接暴露nvcc编译器时,才手动安装 CUDA 工具链。手动安装时注意版本对齐:选的 CUDA 主版本不能高于驱动的支持版本。比如驱动显示 CUDA Version 12.4,你却装 CUDA 12.6 工具包,部分组件运行起来就会报不兼容。驱动装好这一步,再把这一层的版本规划清楚,后续环境再怎么折腾都有一块稳的地基。
5. 常见问题与避坑:5 个驱动安装翻车现场
这一节集中记录安装 NVIDIA 驱动时最常踩的五个坑,全部按“现象 → 原因 → 解决”的顺序写。这些内容来自我自己和身边同事的实操经历,适用性很强。
5.1 重启后卡在登录界面,密码输入后闪回
现象:系统重启后,输入正确密码,屏幕短暂变黑,然后跳回登录界面。看起来像密码错误,但没有错误提示;部分机型直接黑屏,只剩一个鼠标指针可以移动。
原因:登录管理器在启动时调用显卡渲染失败,导致桌面会话起不来。常见诱因有三个:旧驱动没卸载干净,内核升级后模块没重建,或者 nouveau 和闭源驱动同时存在,两个模块抢着加载。
解决:先按 Ctrl+Alt+F2 切换到纯文本控制台,用账号密码登录,然后清理驱动环境再重装:
sudo apt purge '^nvidia-.*' '^libnvidia-.*' '^libcuda.*' sudo apt autoremove sudo ubuntu-drivers autoinstall sudo reboot特别注意一点:如果这台机器当初是用官网 .run 文件装的驱动,apt purge 清不掉它。需要先用原安装包卸载,命令是:
sudo /path/to/NVIDIA-Linux-x86_64-xxx.run --uninstall不记得安装包存放位置,就在 home 目录下按时间排序找。旧驱动清干净,再走一遍标准安装流程,登录循环大概率解决。
5.2 nvidia-smi 报“无法与 NVIDIA 驱动通信”
现象:执行 nvidia-smi,终端弹出NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver,后面跟一长串提示,GPU 也不出现在设备列表里。
原因:内核模块 nvidia.ko 没有被加载,或者加载时发生符号冲突。最常见的是内核刚升级、驱动从 .run 换到 apt 版本但没重装、以及 Secure Boot 拦住了模块加载。
解决:先看模块状态:
lsmod | grep nvidia如果没有输出,尝试手动加载模块并查看内核日志:
sudo modprobe nvidia dmesg | grep -i nvidiadmesg 输出中出现unknown symbol、module verification failed等关键词时,按顺序处理:先装当前内核的头文件,再触发 DKMS 重建:
sudo apt install linux-headers-$(uname -r) sudo dkms autoinstall sudo reboot这里说明一下,linux-headers-$(uname -r)中的$(uname -r)会自动替换为当前内核版本号,确保安装的头文件与内核一致。如果 dmesg 提示的是签名问题,则跳到第 5.4 节的 Secure Boot 流程处理。不要一看到 modprobe 失败就去下载 .run 包强行编译,先把仓库方案重建成功再考虑其他途径。
5.3 安装时报“无法定位软件包 nvidia-driver-xxx”
现象:按照网络教程执行sudo apt install nvidia-driver-550,终端直接报E: 无法定位软件包 nvidia-driver-550,安装根本没有开始。
原因:当前 Ubuntu 版本的软件源里没有这个分支,或者软件源列表没有正确更新。很多网络教程里的版本号是针对写教程当时的状态,对你这套系统不一定适用。
解决:先确认当前系统可用驱动列表:
sudo apt update ubuntu-drivers devices按输出里的 driver 列表精确匹配。比如输出里只有nvidia-driver-535,就装 535,不要拿着旧教程里的命令硬套。如果ubuntu-drivers devices输出里完全没有 nvidia 条目,多半是源配置有问题,检查/etc/apt/sources.list和/etc/apt/sources.list.d/目录下有没有指向错误或失效仓库的配置。对于刚发布的新显卡,仓库确实还没收录时,才建议临时添加第三方 PPA 来补足,但 PPA 方案容易引入版本错位,装完如果出问题,优先怀疑它。
5.4 Secure Boot 导致装好的驱动不加载
现象:驱动安装过程全程顺利,但重启后出现蓝底白字的Performing MOK management提示,或系统直接跳过签名校验。进入系统后 nvidia-smi 报通信失败,模块完全没加载。
原因:Secure Boot 开启时,内核只接受签名链完整的模块。Ubuntu 内核自带的模块由官方签名,NVIDIA 闭源驱动模块没有这层签名,需要用户通过 MOK(Machine Owner Key,机器所有者密钥)流程让系统的 shim 引导程序信任该模块。
解决:重启后在蓝色界面选择Enroll MOK,按提示输入之前设置的管理密码,系统会自动完成密钥注册并重启。如果对这套流程不熟悉,最直白的方式是先用mokutil --sb-state确认状态,然后进 BIOS 临时关闭 Secure Boot,装好驱动并验证nvidia-smi正常后,再重新打开 Secure Boot。重新打开后第一次重启会再次要求注册 MOK,按同一流程走一遍即可。整体操作比在 Secure Boot 开启状态下硬装要直观得多,也更容易排查出问题。
5.5 内核升级后驱动失效
现象:系统执行完sudo apt upgrade后重启,nvidia-smi 开始报错,或者桌面进入低分辨率模式,查看日志时发现 NVIDIA 模块不存在。
原因:内核模块与内核版本强绑定。内核从旧版本升级到新版本后,旧模块不会自动复制到新内核目录。如果驱动安装时通过 dkms 管理,系统会在安装新内核的钩子里自动重新编译模块;一旦缺少头文件或 dkms 状态异常,编译失败后模块就缺失了。
解决:先确认 dkms 状态:
dkms status输出中如果有nvidia/xxx: failed,或者显示built但没installed,说明编译链断了。补装头文件并触发重建:
sudo apt install linux-headers-$(uname -r) sudo dkms autoinstall sudo reboot把“升级前检查”变成日常习惯更省事:每次执行sudo apt upgrade时,留意更新列表里有没有linux-image-*内核相关包。一旦确认内核要更新,升级完成后先跑一遍dkms status再重启,基本就不会翻车。内核升级导致的驱动失效,不是显卡坏了,也不是驱动坏了,就是模块没跟上内核,重建一次就恢复。
6. 保持长期稳定:版本固定、回滚与升级节奏
驱动装好只算第一步,怎么让它长期稳定不复发才是重点。我给自己定的一条规矩是:驱动这种底层组件,不追新,只在确实需要新特性时才手动升级。Ubuntu 的 apt 每次升级版本时,会连带更新驱动包,把驱动分支固定在当前验证过的版本,能有效避免“某次系统更新后驱动行为异常”的事件。
固定版本的做法是利用 apt 的 preferences 机制,在/etc/apt/preferences.d/下新建一个文件,例如 nvidia-pin,写入类似内容:
Package: nvidia-driver-550 Pin: version 550.* Pin-Priority: 1001设置Pin-Priority: 1001时,apt 会把该版本当作强制目标,不会在你做系统升级时自动替换成其他分支。注意这个文件要按实际安装的分支号写,装 535 就固定 535,别套用 550。等你确实想升级,把固定文件删掉,重新跑sudo apt update && sudo apt upgrade,再按第 3 章的方式安装新分支即可。
回滚同样是值得留一手的能力。如果升级后出现问题时,重新装回之前的版本:
sudo apt install nvidia-driver-535 sudo reboot装回之后立刻执行nvidia-smi验证。如果你在系统里同时装过多个 NVIDIA 相关包,回滚前最好先 purge 一遍再装目标版本,避免两套包互相干扰。这个操作相当于给驱动环境留了一条退路,升级前不用再提心吊胆。
我自己的固定流程是:升级前把当前驱动分支、CUDA 环境和验证命令记在一处,升级后用nvidia-smi和lspci -k | grep -A 2 -i nvidia两条命令确认;内核升级则严格按照第 5.5 节那条原则,先保证 dkms 状态正常再重启。这套习惯已经帮我避开了无数次驱动黑屏的麻烦,也希望帮到你。
本文还有配套的精品资源,点击获取