ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 20.04 NVIDIA显卡驱动与CUDA安装全攻略

Ubuntu 20.04 NVIDIA显卡驱动与CUDA安装全攻略 聊Ubuntu 20.04 下装 NVIDIA 显卡驱动和 CUDA我估计绝大多数人是被深度学习、ORB-SLAM3、Blender 渲染这些活儿给逼过来的。我也不例外当年第一次在 Ubuntu 下装显卡驱动直接黑屏当场把我心态干崩了。后来在服务器、台式机、笔记本上反反复复装了几十次才总算把这里面的门道摸清楚。这篇文章我就把自己在 Ubuntu 20.04 下安装 NVIDIA 显卡驱动和 CUDA 的完整过程、踩过的坑、排查思路全部摊开讲一遍。不管是想跑 PyTorch、TensorFlow还是部署 ORB-SLAM3、ROS只要你先按这套流程把 GPU 环境整明白后面会省下非常多的时间。内容会覆盖 apt 源安装和 .run 文件安装两种驱动方式也会讲 CUDA 多版本共存切换、nvidia-smi 常见报错、内核升级后驱动失效这类高频问题照着做基本一次能过。1. 写在前面为什么这么多人“败”在这件事上先别急着敲命令我建议花两分钟把驱动和 CUDA 的关系捋明白。网上教程很多但大部分是互相抄只告诉你“按这个顺序敲”从来不解释为什么结果一报错就抓瞎。1.1 驱动和 CUDA 到底是个什么关系很多人第一次接触这俩概念会懵其实打个比方就很好理解显卡驱动是让系统能“看见”并使用 GPU 硬件负责最底层的硬件管理和资源调度CUDA Toolkit 是跑在驱动之上的并行计算开发环境里面包含编译器 nvcc、运行时库、数学库这些“工具”。没有驱动GPU 对系统来说就是个不干活的大块头没有 CUDA Toolkit你写的 CUDA 程序或者框架里的 GPU 算子就编译不出来。所以通常是先装好驱动再在驱动的基础上装 CUDA这个顺序基本不能反。还有个特别容易让人迷糊的点你执行nvidia-smi输出结果右上角会显示一个 “CUDA Version: xx.x”。很多人以为这就是 “系统里装的 CUDA 版本”然后跑去安装别的 CUDA 版本发现对不上就开始慌了。这里要说明白nvidia-smi显示的 CUDA Version 是当前驱动能够支持的最高 CUDA 运行版本并不是你实际安装的 CUDA Toolkit 版本。你可以把这个数字理解成驱动的能力上限它不需要和你nvcc -V看到的版本完全一致。比如我用的驱动版本是 535它显示 CUDA 12.2但系统里实际用的可能是 CUDA 11.8这完全正常。1.2 安装之前先确认自己的环境很多时候装驱动失败不是因为命令不对而是环境本身有坑。所以在动手前我强烈建议先花一分钟把下面几个信息查清楚# 查看系统版本 lsb_release -a # 查看内核版本 uname -r # 查看有没有 NVIDIA 显卡以及具体型号 lspci | grep -i nvidia # 查看是否已经安装过显卡驱动 nvidia-smi这几条命令用完之后你心里大概有个数了系统是 Ubuntu 20.04 还是 22.04内核是 5.4 还是 5.15显卡是 RTX 30 系还是更老的 10 系以及之前是不是已经折腾过一回驱动了。尤其是最后一条nvidia-smi如果报错nvidia-smi has failed because it couldnt communicate with the nvidia driver说明系统里要么没驱动要么驱动处于半坏状态得先处理这个问题再继续。另外我多说一句如果这台机器上之前装过旧驱动尤其是用 .run 文件装过建议先彻底卸载干净再重装不然新旧驱动打架很容易出现各种玄学问题。后面我会专门讲怎么卸载。2. 安装前的准备能少踩一半坑准备工作做完你后面会顺很多。这一节是很多人忽略但其实最关键的。2.1 禁用 nouveau 这关必须过Ubuntu 默认自带一个开源的 NVIDIA 驱动叫 nouveau功能很基础但问题是它和 NVIDIA 官方闭源驱动会冲突。官方驱动安装时如果检测到 nouveau 正在加载可能会拒绝安装或者装完没法正常用。所以安装官方驱动的第一步就是把这个开源驱动禁掉。网上一般给的都是这个方案sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nvidia-nouveau.conf然后更新内核引导信息sudo update-initramfs -u重启之后检查lsmod | grep nouveau如果这条命令没有任何输出说明 nouveau 已经被成功禁掉可以继续了。如果还有输出说明黑名单没生效常见原因包括改的不是 /etc/modprobe.d 下的配置文件或者 initramfs 没有正确更新。这种时候检查一下文件内容是不是写对了再跑一次 update-initramfs 就好。2.2 该装的构建工具和依赖别漏很多人装驱动卡在编译那一步就是因为系统里连编译器和内核头文件都没装。尤其当你选择用 .run 文件装驱动时它需要调用 gcc 和 make 来现场编译内核模块。缺了依赖驱动装上也会报错。建议先把下面这些装上sudo apt update sudo apt install build-essential dkms linux-headers-$(uname -r)解释一下每个东西的作用build-essential提供 gcc、g、make 这一套编译工具链linux-headers-$(uname -r)是当前内核的头文件编译内核模块必须要它dkms是一个动态内核模块管理工具有了它驱动模块会注册到 DKMS 里以后系统升级内核时它会自动帮你在新内核上重新编译驱动模块。对用 apt 装驱动的场景来说DKMS 几乎就是救命稻草。2.3 两种驱动安装方式的取舍NVIDIA 驱动安装主要有两条路一条是用 apt 从系统源或第三方 PPA 安装另一条是去 NVIDIA 官网下载 .run 文件手动安装。两条路我都走过各有优劣我直接用表格列出来给你看。维度apt 方式.run 文件方式安装难度低几条命令搞定中高需要退出图形界面流程长驱动版本可能不是最新但稳定官网最新版支持新卡DKMS 支持通常自动支持需要手动选择部分版本要自己配置卸载难度简单sudo apt purge nvidia-*需要用 nvidia-uninstall 脚本适合场景大多数桌面用户、新手刚买的新显卡、需要特定版本驱动我的建议是如果你不是刚买了最新款显卡、非最新驱动不能用直接用 apt 方式安装。省心稳定而且 DKMS 自动处理内核升级的坑。如果你确实需要 .run 方式那我建议务必把 2.2 里的依赖装齐而且安装时注意看屏幕上的交互选项。3. NVIDIA 显卡驱动安装实操前面铺垫了半天现在进入正题。我会把 apt 和 .run 两种方式的完整流程都写出来你按自己的情况选一种就行。3.1 通过 apt 安装驱动的完整流程apt 方式是我现在给朋友推荐的首选步骤是真的少。装 Ubuntu 20.04 时系统源里其实已经有 NVIDIA 驱动包了不过版本可能偏老所以一般先加一个官方驱动的 PPAsudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update然后可以看一下系统推荐装哪个版本ubuntu-drivers devices这条命令会列出你机器上适用的驱动版本并在最后标注driver字样告诉你推荐安装哪个。比如它推荐的是nvidia-driver-535那就直接装sudo apt install nvidia-driver-535如果不想自己看版本也可以用sudo ubuntu-drivers autoinstall这个命令会自动把推荐版本的驱动装上。安装过程中会默认处理 DKMS 的注册不用你操心。装完重启sudo reboot重启后再打开终端跑一下nvidia-smi如果能看到一个大表格里面有驱动版本、CUDA 版本、显存用量那就说明驱动装成功了。我之前在 Ubuntu 20.04 上跑 RTX 3060用 apt 装nvidia-drriver-535整个流程不到十分钟中间没有遇到任何额外的问题。3.2 用 .run 文件安装驱动的完整流程如果你因为显卡太新或者其他原因必须用官网驱动那要走的流程就稍微麻烦一些。我在某些新卡发布头几个月遇到过 apt 源里还没有对应驱动版本的情况只能去官网下载。第一步去 NVIDIA 官网的驱动下载页面选择你的显卡型号和系统Linux 64-bit下载得到类似NVIDIA-Linux-x86_64-550.54.15.run的文件。第二步一定要退出图形界面再装。我吃过亏直接在桌面环境里跑 .run 文件结果报错或者装完一堆毛病。因为运行安装脚本时 X server 还在占用 GPU。推荐做法是按住CtrlAltF3切换到纯文本终端用账号密码登录然后执行sudo systemctl isolate multi-user.target这会关掉图形界面。然后进到 .run 文件所在目录chmod x NVIDIA-Linux-x86_64-550.54.15.run sudo sh NVIDIA-Linux-x86_64-550.54.15.run安装过程中它会问几个问题我记得有这几个是否安装 32 位兼容库、是否运行 nvidia-xconfig 更新 X 配置。32 位兼容库看你自己有没有跑 32 位程序的需求一般装上没坏处nvidia-xconfig 那个选项选 yes 就行。装完后重启sudo reboot重启后同样用nvidia-smi验证。如果你之前已经通过 apt 装过驱动想改用 .run 方式建议先彻底卸载旧驱动再装不然很容易出现两个驱动打架的情况。3.3 驱动安装完成后的验证除了nvidia-smi我还会顺手检查这几个地方# 确认内核模块已经加载 lsmod | grep nvidia # 查看驱动详细信息 nvidia-settings # 查看 OpenGL 相关信息 glxinfo | grep OpenGLnvidia-settings能弹出图形配置界面说明驱动跟图形栈配合正常glxinfo能看到 OpenGL 的 vendor 是不是 NVIDIA。如果没有glxinfo可以用sudo apt install mesa-utils装上再跑。这里有个细节如果nvidia-smi正常但glxinfo显示的是 llvmpipe 软件渲染说明 X server 没有真正使用 NVIDIA 驱动后面跑带 GUI 的程序一样卡。这时候可能需要重新配置 Xorg或者检查/var/log/Xorg.0.log里有没有(EE)开头的报错。4. CUDA Toolkit 安装与多版本管理驱动装好只是第一步真正干活需要 CUDA Toolkit。这一节我会重点讲 CUDA 版本选择、安装流程和环境变量配置最后把很多人头疼的多版本共存也讲清楚。4.1 先想清楚自己要装哪个 CUDA 版本很多人的第一反应是“装最新的”但现实是最新版本未必最适合你。PyTorch、TensorFlow 这些框架往往不是新 CUDA 出来当天就支持很多项目在 README 里就写了需要 CUDA 11.x 或者 CUDA 12.x你要是装个完全对不上的版本后面大概率要折腾 conda 环境或者重新编译依赖。选择 CUDA 版本时我一般是这么判断的先看你跑的项目或框架要求什么版本比如 ORB-SLAM3 相关的编译教程里一般会写 CUDA 11.8 之类的再看当前驱动的能力上限nvidia-smi右上角的 CUDA Version 如果大于等于你想装的版本就说明驱动支持最后才是考虑新特性否则没必要追新。下面是一个简化的驱动与 CUDA 版本支持对照表帮助你做个粗略判断驱动版本最低支持最高支持470CUDA 11.0CUDA 11.4510CUDA 11.6CUDA 11.6520CUDA 11.8CUDA 11.8535CUDA 12.0CUDA 12.2具体数值以 NVIDIA 官方文档为准但我建议你记住这个原则CUDAToolkit 的版本号不能超过驱动支持的上限否则运行时会报版本不匹配的错误。4.2 CUDA Toolkit 安装流程CUDA Toolkit 的安装也有两种常见方式deb 包和 .run 文件。我把这两种都试过各自的优缺点简单说一下。deb(local) 方式把 NVIDIA 的软件源加进来然后sudo apt install cuda。好处是安装简单、自动处理依赖、后续更新也方便坏处是默认装的是一个固定版本多版本切换不如 .run 文件灵活。runfile(local) 方式到 NVIDIA 官网下载类似cuda_11.8.0_520.61.05_linux.run的文件手动安装。我比较推荐这种方式因为你可以把 CUDA 装到独立目录多版本共存非常方便。官网下载时选 Linux - x86_64 - Ubuntu - 20.04 - runfile(local)会得到一个 .run 文件。然后执行sudo sh cuda_11.8.0_520.61.05_linux.run第一次跑这个命令它会先解压到临时目录然后弹出一个文本交互界面。这时候注意看有没有问你安装驱动如果你之前已经装好了驱动一定要把 Driver 那一项取消勾选按回车或者方向键操作只留 CUDA Toolkit 和 CUDA Samples不然它可能顺手装一个旧版本驱动把你已经配好的环境覆盖掉。安装完成后CUDA 默认被装到/usr/local/cuda-11.8这样的目录。要注意的是它并不会自动帮你设置环境变量所以下一步就是配置 PATH。4.3 环境变量配置打开~/.bashrc在文件末尾追加下面几行export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH然后让配置生效source ~/.bashrc为什么是/usr/local/cuda而不是/usr/local/cuda-11.8因为安装完你会发现/usr/local/cuda是一个软链接指向当前默认的 CUDA 版本目录。以后你切换版本时只要改这个软链接指向就行环境变量里的路径不用动这样非常方便。4.4 验证 CUDA 和编译示例配置完环境变量先看版本nvcc -V能输出 CUDA 版本信息说明编译器装好了。但这只能说明 nvcc 存在还不能证明 runtime 和 GPU 能配合工作。我更推荐编译一个官方自带的示例来验证cd /usr/local/cuda/samples/1_Utilities/deviceQuery sudo make ./deviceQuery如果最后输出Result PASS说明 CUDA 环境完全可用。如果出现CUDA error: no kernel image is available之类的报错多半是驱动与 CUDA 版本不匹配重新对照一下驱动支持的上限。另外再说一次开篇那个点执行nvcc -V看到的是 CUDA Toolkit 版本执行nvidia-smi看到的是驱动支持的 CUDA 运行版本这两个数字不一样是正常的不要自己吓自己。4.5 多版本 CUDA 切换实际项目里你会发现A 项目要 CUDA 11.8B 项目要 CUDA 12.2被迫在系统里装多个版本。我之前就是在同一个系统里同时留着 11.8 和 12.2。做法并不复杂先正常把两个版本都安装好它们会分别出现在/usr/local/cuda-11.8和/usr/local/cuda-12.2。需要切换时修改软链接指向即可# 切到 CUDA 11.8 sudo rm /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda # 切到 CUDA 12.2 sudo rm /usr/local/cuda sudo ln -s /usr/local/cuda-12.2 /usr/local/cuda切换后记得打开新终端或者source ~/.bashrc让 PATH 重新指向。这里更顺手的做法是写两个切换脚本比如switch_cuda_118.sh和switch_cuda_122.sh内容就两三条命令省得每次手敲。另外要提醒的是conda 环境是另一个层次的隔离。如果你用 conda 装 PyTorch它通常会在环境内部装一份 cudatoolkit那个不会动系统里/usr/local/cuda的东西。也就是说系统 CUDA 用来编译 C 或需要 nvcc 的场景conda 里自带的是给 Python 包用的两者可以共存。5. 常见报错与排查记录这一节我把过去遇到的高频报错和对应的解决办法整理出来你可以直接对照排查。5.1 nvidia-smi has failed because it couldnt communicate with the nvidia driver这个报错算得上 Ubuntu 装机界的经典名场面了几乎每天都有人在社区里问。它表达的意思很简单nvidia-smi 这个工具没法和内核里的 NVIDIA 驱动通信通常意味着驱动模块没有正确加载。我一般按这个顺序排查# 1. 看模块有没有加载 lsmod | grep nvidia # 2. 看内核日志里 nvidia 相关报错 dmesg | grep -i nvidia # 3. 看 DKMS 状态 dkms status排查下来的结果一般就是下面几种内核升级后驱动没有重建。用 .run 安装的驱动最容易遇到这个问题解决办法是重新安装驱动或者重建 DKMS 模块Secure Boot 挡住了模块加载。后面 5.2 会细讲装了不匹配的驱动版本。比如内核太老、驱动太新编译出来的模块加载时报错。如果dmesg | grep -i nvidia里出现类似NVRM: API mismatch说明运行库和内核模块版本对不上最常见的原因是你用 apt 装了新驱动但 X server 用的还是旧的 libnvidia 库这种时候建议直接卸载全部 NVIDIA 组件再重新装。5.2 Secure Boot 挡住驱动签名UEFI 模式下 Ubuntu 如果开启了 Secure Boot安全启动系统只允许加载经过签名的内核模块。NVIDIA 官方驱动模块如果没有完成签名流程即使你看到dkms status显示 installed它还是加载不了现象同样是 nvidia-smi 通信失败。装驱动时如果系统提示要设置 MOKMachine Owner Key这个就是让你允许驱动签名。按下流程走设置临时密码重启后在蓝色界面里选 Enroll MOK输入之前设置的密码确认一下就行。如果不走 MOK 流程最简单粗暴的办法就是进 BIOS 把 Secure Boot 关掉。我自己实测下来关掉 Secure Boot 之后各种模块加载问题少了很多特别是双系统和笔记本用户建议优先考虑这个方法。5.3 下载的 CUDA run 文件提示 gzip: stdin: invalid compressed># 先校验 sha256sum cuda_11.8.0_520.61.05_linux.run把输出的哈希值和官方页面提供的 SHA256 对比不一致就重新下载。我个人的经验是最好在 Ubuntu 里用wget -c直接下载到目标机器上不要再经过 Windows、U 盘这一趟转运反而减少出错概率。5.4 内核升级后驱动失效Ubuntu 的软件源会定期更新内核版本。内核一升级之前编译好的 NVIDIA 内核模块就没法用了表现出来就是重启后nvidia-smi报错但明明驱动之前是好的。为什么会这样因为内核模块需要针对具体的内核版本编译。升级了新内核以后模块文件没有跟着一起重新编译自然加载不了。如果你是 apt 方式安装的驱动因为一般带了 DKMS只要检查一下dkms status如果显示类似nvidia/535, 5.15.0-100-generic, x86_64: installed这种状态说明已经注册了构建。但有时新内核安装后 DKMS 没有自动跑就手动重建sudo dkms autoinstall如果 dkms 报错最省事的方法是重装一次驱动sudo apt install --reinstall nvidia-driver-535如果是 .run 方式安装的驱动情况会更麻烦一些因为默认不一定注册了 DKMS。所以这也是我为什么推荐普通用户使用 apt 方式装 NVIDIA 驱动的原因它能省掉内核升级这一大坑。5.5 黑屏、循环登录的急救套路驱动安装最让人崩溃的黑屏、循环登录问题我也碰到过不止一次。先别慌记住一个原则新驱动装坏了不一定非要重装系统先回滚或卸载驱动试试。如果你开机黑屏可以在 GRUB 界面按e进入编辑模式找到以linux开头的那一行在行尾追加参数nomodeset然后按CtrlX或F10启动。加了这个参数后系统会使用基础显示模式一般能进图形界面或至少进到命令行。进入系统后把当前驱动卸载掉重启看看是否恢复正常。循环登录也类似登录进去又弹回登录界面进不了桌面。这时按CtrlAltF2进入纯文本终端先查看cat ~/.xsession-errors多半能看到 X server 加载 nvidia 模块失败的记录。处理方式还是先卸载驱动重启确认系统恢复正常后再换另一种安装方式重新装驱动。平时我还会常备一个工具叫 Timeshift专门用来做系统快照。每次折腾驱动、CUDA、ROS 这类大型环境之前我都会先做一个快照装挂了直接回滚比手动排查快十倍。6. 分享一点个人习惯与经验最后说点关于这套环境的一些个人心得希望能帮你绕开一些不必要折腾。6.1 我自己的固定套路我经历了几次惨痛的翻车之后现在安装流程固定了基本不会出大事优先用 apt 安装驱动并且一定确认是带 DKMS 的版本。这样内核升级后不用天天想着重建模块。安装 CUDA 用 runfile装到独立目录再通过软链接切换版本。因为不同项目对 CUDA 的版本要求经常不一样。任何 .run 文件下载完先校验文件大小和 sha256尤其是官网下载的包。安装大型环境前做系统快照。比如用 Timeshift 备份系统盘出问题直接回滚。这套流程看起来保守但真的能让你从“装完就黑屏”的恐惧里解放出来。6.2 如果还在折腾希望你能少走一点弯路其实回到原点装驱动和 CUDA 本身并不复杂复杂的是网上教程质量参差不齐很多人按错误教程操作越搞越乱。如果你现在正在 Ubuntu 20.04 上折腾我建议你不要一边开着图形界面一边装 .run 驱动尽量切换纯文本终端安装不要同时安装多个来源的驱动apt 的驱动和 .run 驱动二选一不要一看到 nvidia-smi 报错就卸载重装先看dmesg和dkms status很多时候只是开关 Secure Boot 的问题不要盲目安装最新版 CUDA先确认项目和框架的兼容性。我在实际使用中发现把环境管理当成“记录日志”来做比临时抱佛脚百度靠谱得多。每次装完一个版本顺手把命令、报错、解决方式记到自己的笔记里。几个月后你再装一台新机器直接翻自己的笔记二十分钟就能搞定整套环境再也不用对着网上那些互相抄的教程踩重复的坑了。
返回列表