news 2026/10/21 1:19:33

Ubuntu 18.04 显卡驱动与CUDA环境配置完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 18.04 显卡驱动与CUDA环境配置完整指南

1. 为什么在 Ubuntu 18.04 上装显卡驱动这件事值得单独写一篇笔记

如果你刚装完 Ubuntu 18.04,满心欢喜地准备跑深度学习训练或者做点 GPU 加速的计算,结果发现nvidia-smi报错、torch.cuda.is_available()返回False,那你大概率卡在了显卡驱动和 CUDA 环境这一关。这件事看起来只是"装个驱动",实际上它牵扯到内核模块、显示管理器、驱动版本与 CUDA 版本的对应关系、以及系统自带开源驱动 nouveau 的冲突处理,任何一个环节没处理好,轻则进不了图形界面,重则开机黑屏只能进 recovery 模式。

我前后在好几台机器上折腾过这套流程,有工作站、有台式机、也有笔记本,踩过的坑基本能凑成一本小册子。这篇笔记就是把我个人实践下来最稳、最省事的一套流程完整记录下来,包括驱动安装的两种主流方式怎么选、CUDA 和 cuDNN 怎么配、环境变量怎么设、以及出问题之后怎么救回来。内容面向的是有一定 Linux 基础、但不想在驱动上反复折腾的开发者,小白照着做也能走通,老手可以重点看避坑那几节。

需要先说明一点:Ubuntu 18.04 是一个比较老的 LTS 版本,它的内核版本、GCC 版本、以及默认的软件源状态都会影响驱动和 CUDA 的安装。所以这篇笔记里的命令和版本选择,都是围绕 18.04 这个特定环境来的,如果你用的是更新的系统,思路可以借鉴,但具体版本号要自己调整。下面我按实际操作顺序展开,每一步都会说清楚"为什么这么做",而不只是丢一串命令给你。

2. 装驱动之前必须先搞清楚的几件事

2.1 你的显卡到底支持哪个驱动分支

NVIDIA 的驱动分好几个分支,比如长期支持分支和最新功能分支,不同架构的显卡支持的分支不一样。老卡可能只被旧分支支持,新卡则需要较新的分支。在动手之前,先用一条命令确认你的显卡型号:

lspci | grep -i nvidia

这条命令会列出你机器上的 NVIDIA 设备。拿到型号之后,去 NVIDIA 官方的驱动查询页面确认它对应的推荐驱动版本。这一步很多人会跳过,直接apt install一个默认版本,结果要么装完不识别,要么和新卡不匹配。

我个人的经验是:不要盲目追最新驱动。最新驱动往往是为最新卡优化的,对老卡反而可能引入回归问题。选一个"推荐版本"或者"长期支持版本"通常最稳。比如一些计算卡和工作站卡,用长期支持分支的驱动,稳定性明显好于追新。

2.2 nouveau 这个开源驱动必须先处理掉

Ubuntu 默认会加载一个叫 nouveau 的开源 NVIDIA 驱动。它日常显示够用,但它和官方闭源驱动是冲突的。如果你不先禁用它,装官方驱动的时候大概率会出问题,比如装完重启进不了图形界面。

禁用 nouveau 的标准做法是往 modprobe 的黑名单里加一条:

sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"

然后更新 initramfs 并重启:

sudo update-initramfs -u sudo reboot

重启之后用lsmod | grep nouveau确认没有输出,说明 nouveau 已经被禁用。这一步是后面所有操作的前提,千万别省。

注意:禁用 nouveau 之后,如果你还没装官方驱动,图形界面可能会以低分辨率运行,这是正常现象,装完驱动重启就好了。

2.3 先想清楚用哪种方式装驱动

在 Ubuntu 上装 NVIDIA 驱动主要有两条路:一是用系统软件源里的apt包,二是用 NVIDIA 官方提供的.run安装包。这两条路各有优劣,我列个表对比一下:

对比项apt 源安装官方 .run 安装
操作难度低,几条命令中,需要关图形界面
版本新旧相对旧,但经过测试最新,可选任意版本
与系统集成好,自动处理依赖一般,需手动处理
卸载难度简单需要专用卸载脚本
内核升级后自动重建模块可能需重装
适合人群大多数开发者需要特定版本的人

我的建议是:除非你有明确的版本需求(比如某个 CUDA 版本强制要求特定驱动),否则优先用 apt 源安装。它和系统的集成度更好,内核升级之后也不容易出问题。官方 .run 包更适合那些需要精确控制驱动版本、或者 apt 源里没有合适版本的场景。

3. 用 apt 源安装驱动的完整流程

3.1 添加显卡驱动的专用软件源

Ubuntu 18.04 默认源里的 NVIDIA 驱动版本比较有限,通常需要添加一个专用的 PPA 来获取更多版本选择:

sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update

添加完之后,用下面这条命令看看当前系统推荐哪个版本:

ubuntu-drivers devices

输出里会列出所有可用的驱动版本,其中标了recommended的那个就是系统推荐的。这个推荐值是根据你的显卡型号和当前内核算出来的,一般可以直接用。

3.2 安装驱动并验证

确认版本之后就可以安装了。假设推荐版本是 470,命令就是:

sudo apt install nvidia-driver-470

安装过程会编译内核模块,需要几分钟。装完之后必须重启,因为驱动是内核模块,不重启不生效:

sudo reboot

重启之后,用nvidia-smi验证。如果能看到显卡型号、驱动版本、CUDA 版本这些信息,说明驱动装好了。这里有个细节:nvidia-smi右上角显示的 CUDA 版本是这个驱动支持的最高 CUDA 版本,不是你当前安装的 CUDA 版本,很多人会搞混这一点。

如果nvidia-smi报 "command not found",说明驱动没装成功,或者路径没进环境变量。可以先试试/usr/bin/nvidia-smi全路径调用,如果全路径能用,那就是 PATH 的问题。

3.3 装完驱动后图形界面进不去怎么办

这是 apt 方式最常见的翻车场景。原因通常是驱动和当前显示管理器(gdm3 或 lightdm)配合出了问题,或者 nouveau 没禁干净。排查思路是这样的:

先按Ctrl+Alt+F2切到 tty 终端,登录后检查驱动模块有没有加载:

lsmod | grep nvidia

如果没有输出,说明模块没加载。可以尝试手动加载:

sudo modprobe nvidia

如果加载报错,多半是内核模块编译失败,这时候可以看看dkms status的输出,确认模块状态。实在不行,先卸载驱动回到开源驱动:

sudo apt remove --purge nvidia-* sudo apt install ubuntu-desktop sudo reboot

回到图形界面之后再重新排查。我踩过好几次这个坑,后来养成了一个习惯:装驱动之前先确保能通过 tty 登录,并且知道怎么卸载驱动,这样出问题不至于抓瞎。

4. CUDA 工具链的安装与版本匹配

4.1 驱动版本和 CUDA 版本的对应关系

CUDA 不是随便装哪个版本都行的,它和驱动版本之间有最低要求。简单说,驱动版本决定了你能装的 CUDA 上限。比如驱动 470 大概支持到 CUDA 11.4 左右,驱动 450 支持到 CUDA 11.0 左右。如果你装的 CUDA 版本超过了驱动支持的上限,运行时会报 "CUDA driver version is insufficient for CUDA runtime version"。

所以正确的顺序是:先确定你要用的深度学习框架需要哪个 CUDA 版本,再反推需要哪个驱动版本。比如某个框架版本要求 CUDA 11.3,那你就得确保驱动至少支持 11.3。

我整理了一个常见的对应关系供参考(具体以官方文档为准):

驱动版本支持的 CUDA 上限
450 系列CUDA 11.0
460 系列CUDA 11.2
470 系列CUDA 11.4
510 系列CUDA 11.6
515 系列CUDA 11.7

4.2 用官方 runfile 还是 apt 装 CUDA

CUDA 的安装也有两种方式:官方.run文件和 apt 源。apt 方式的好处是干净、好卸载,但版本选择少;runfile 方式版本全,但容易和驱动冲突。

我的做法是:驱动用 apt 装,CUDA 用 runfile 装,但安装时取消勾选驱动那一项。这样既能选到想要的 CUDA 版本,又不会覆盖掉已经装好的驱动。具体操作是下载 runfile 之后:

sudo sh cuda_11.3.0_465.19.01_linux.run

在安装界面里,把 Driver 那一项的勾去掉,只保留 CUDA Toolkit 相关的组件。这样就不会动你现有的驱动。

4.3 环境变量配置的细节

CUDA 装完之后,需要把它的路径加进环境变量。编辑~/.bashrc,在末尾加上:

export PATH=/usr/local/cuda-11.3/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH

这里有个小技巧:不要直接写/usr/local/cuda,而是写带版本号的路径。因为/usr/local/cuda通常是个软链接,如果你以后装了多个 CUDA 版本,切换软链接的时候环境变量会跟着变,容易乱。写死版本号更可控。

改完之后source ~/.bashrc生效,然后用nvcc -V验证。如果能看到版本信息,说明 CUDA 装好了。

注意:nvcc -V显示的是 CUDA 编译器版本,nvidia-smi显示的是驱动支持的 CUDA 上限,这两个数字不一样是正常的,不要以为装错了。

5. cuDNN 的配置和验证

5.1 cuDNN 和 CUDA 的版本必须严格对应

cuDNN 是 NVIDIA 的深度神经网络加速库,深度学习框架基本都要用它。它和 CUDA 的版本是严格绑定的,比如 cuDNN 8.2 对应 CUDA 11.3,装错了直接报错。下载的时候一定要看清楚对应关系。

cuDNN 的安装本质上是把几个头文件和库文件复制到 CUDA 的目录里。下载对应版本的压缩包之后:

tar -xzvf cudnn-11.3-linux-x64-v8.2.0.53.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64 sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*.h sudo chmod a+r /usr/local/cuda-11.3/lib64/libcudnn*

复制完之后,可以用下面这条命令验证 cuDNN 版本:

cat /usr/local/cuda-11.3/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

能看到主版本号、次版本号、补丁号就说明装好了。

5.2 验证整套环境是否真的能用

光看版本号还不够,得实际跑一下。最直接的方式是编译 CUDA 自带的样例:

cd /usr/local/cuda-11.3/samples/1_Utilities/deviceQuery sudo make ./deviceQuery

如果输出最后是Result = PASS,说明驱动和 CUDA 的配合没问题。这一步能过,基本就稳了。

对于深度学习用户,还可以用框架自带的检查命令,比如 PyTorch 里:

import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))

返回True和显卡型号,就说明整条链路都通了。

6. 那些年我踩过的坑和对应的解法

6.1 内核升级之后驱动失效

Ubuntu 18.04 会自动更新内核,内核一升级,之前编译的 NVIDIA 内核模块就对不上了,nvidia-smi直接报错。这是 apt 方式装驱动也会遇到的问题,只是 dkms 通常会自动重建模块,但偶尔会失败。

解法是手动触发 dkms 重建:

sudo dkms status sudo dkms autoinstall

如果还是不行,最省事的办法是重装驱动:

sudo apt install --reinstall nvidia-driver-470

我现在的习惯是把内核自动更新关掉,避免训练到一半环境突然变了。具体做法是修改/etc/apt/apt.conf.d/下的配置文件,把内核相关的包 hold 住。这个看个人需求,追求稳定的话值得做。

6.2 多版本 CUDA 共存时的切换

有时候你需要同时保留多个 CUDA 版本,比如一个项目要 10.2,另一个要 11.3。这时候可以用软链接切换:

sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-11.3 /usr/local/cuda

但前面说过,环境变量最好写死版本号,所以更推荐的做法是用环境变量切换,而不是改软链接。可以写两个 alias 或者两个脚本,需要哪个 source 哪个。

6.3 显存被占用但进程找不到

有时候nvidia-smi显示显存被占用,但nvidia-smi的进程列表里又看不到对应进程。这通常是僵尸进程或者之前的训练异常退出留下的。可以用:

sudo fuser -v /dev/nvidia*

找到占用显存的进程号,然后 kill 掉。如果还不行,只能重启。这个坑在做多卡训练的时候特别常见,建议养成训练脚本里加异常清理的习惯。

6.4 装完驱动分辨率不对或者多屏异常

这个多半是显示管理器的问题。可以试试切换显示管理器,比如从 gdm3 换到 lightdm:

sudo apt install lightdm sudo dpkg-reconfigure lightdm

切换之后重启,分辨率问题往往能解决。不过这个操作有风险,切之前最好确认能通过 tty 操作。

7. 一套可以照着抄的完整命令清单

把上面的流程浓缩成一份可执行的清单,方便你对照操作。假设目标是驱动 470 + CUDA 11.3 + cuDNN 8.2:

# 1. 禁用 nouveau sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo update-initramfs -u sudo reboot # 2. 确认 nouveau 已禁用 lsmod | grep nouveau # 3. 添加驱动源并安装 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ubuntu-drivers devices sudo apt install nvidia-driver-470 sudo reboot # 4. 验证驱动 nvidia-smi # 5. 安装 CUDA(runfile 方式,取消勾选驱动) sudo sh cuda_11.3.0_465.19.01_linux.run # 6. 配置环境变量 echo 'export PATH=/usr/local/cuda-11.3/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc nvcc -V # 7. 安装 cuDNN tar -xzvf cudnn-11.3-linux-x64-v8.2.0.53.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64 sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*.h sudo chmod a+r /usr/local/cuda-11.3/lib64/libcudnn* # 8. 验证 cd /usr/local/cuda-11.3/samples/1_Utilities/deviceQuery sudo make && ./deviceQuery

这份清单我用了很多次,基本没出过问题。唯一需要注意的是版本号要根据你的实际情况替换,别照抄版本号。

8. 关于环境稳定性的一点个人体会

折腾驱动和 CUDA 这件事,最大的教训就是能不动就不动。一旦环境跑通了,就别手贱去升级驱动或者 CUDA,除非有明确的需求。我见过太多人因为升级了一个小版本,结果整个训练环境崩掉,重装花了大半天。

另外,如果你有多台机器或者经常重装系统,强烈建议把整套流程脚本化,甚至用容器把环境固化下来。容器方案能把驱动之外的所有依赖都打包好,换机器的时候省心很多。驱动本身还是得在宿主机装,但 CUDA 和 cuDNN 可以放进镜像里,这样环境一致性有保障。

最后分享一个小习惯:每次装完环境,把nvidia-smi、nvcc -V、deviceQuery的输出截图或者存成文本,记录下当时的驱动版本、CUDA 版本、内核版本。以后出问题的时候,这份记录能帮你快速定位是哪个环节变了。这个习惯帮我省下了不少排查时间,推荐你也试试。

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

JavaScript专项算法题(3):闭包

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 1:18:21

VS项目调试正常,部署到IIS后报错500

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 1:18:20

FactoryBluePrints|戴森球蓝图库的满产路径

FactoryBluePrints|戴森球蓝图库的满产路径 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 传送带调了三小时还是堵,制造台前的队伍排出去半屏&…

作者头像 李华
网站建设 2026/10/21 1:18:03

D-PHY高速信号完整性调试:从CTS合规到眼图优化实战

1. 项目概述:这不是一次简单的“调通”,而是一场信号边界的极限测绘“MIPI D‑PHY 高速接口信号完整性调试”——光看这个标题,很多刚接触硬件接口的工程师第一反应是:不就是接上线、跑个眼图、调调终端电阻吗?但当你真…

作者头像 李华
网站建设 2026/10/21 1:15:40

3 分钟解锁 Unity 专业版:UniHacker 跨平台破解工具完整指南

3 分钟解锁 Unity 专业版:UniHacker 跨平台破解工具完整指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 打开 Unity 就被许可证弹窗拦住&…

作者头像 李华