ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 安装 Nvidia 显卡驱动全流程:版本选型、安装与排错

Ubuntu 安装 Nvidia 显卡驱动全流程:版本选型、安装与排错 Ubuntu 上折腾 Nvidia 显卡驱动几乎是每个用 Linux 做深度学习、视频渲染或者单纯想跑个 3D 游戏的人都绕不开的一道坎。这件事在有些机器上顺得像喝水apt一条命令重启就完事但在另一些机器上它能让你对着黑屏和满屏报错卡上大半天。我自己在十几台不同配置的机器上装过这套驱动——从笔记本的双显卡切换到机房里没有外网的计算节点踩过的坑够写一本小册子。这篇文章就把整个流程拆开讲清楚驱动版本怎么选、装之前要做哪些地基工作、三条主流安装路线各自适合什么场景、装完之后怎么验证以及那几个最要命的报错到底怎么排查。不管你是第一次在 Ubuntu 装 Nvidia 显卡驱动的新手还是被nvidia-smi has failed because it couldnt communicate with the nvidia driver折磨过的老手应该都能从里面找到点有用的东西。1. 先把概念理顺Ubuntu 装 Nvidia 驱动到底在装什么很多人对装显卡驱动这件事的认知是模糊的觉得就是一个软件包的事。结果一旦出问题就完全不知道该往哪个方向查。所以我觉得有必要先把这块讲透后面排查问题的时候你会感谢这段铺垫。1.1 内核模块、用户态库和管理工具三件套Nvidia 驱动在 Linux 上不是一个单独的文件它至少由三部分组成而且是各管各的。第一部分是内核模块也就是nvidia.ko、nvidia-modeset.ko、nvidia-uvm.ko、nvidia-drm.ko这几个.ko文件它们跑在内核空间负责和显卡硬件直接对话。第二部分是用户态库比如libnvidia-gl-xxx、libcuda.so、libnvidia-encode.so这些是给应用程序调用的接口OpenGL、CUDA、视频编码都靠它们。第三部分是管理工具最典型的就是nvidia-smi和nvidia-settings用来查看状态和配置参数。这三件套里最容易出问题的永远是内核模块。原因很简单内核模块必须针对你当前运行的内核版本重新编译一旦内核升级而模块没跟着重编整个驱动就哑火了。你会发现nvidia-smi还能运行但报连不上驱动或者干脆命令都找不到。所以记住一个判断口诀用户态库装没装决定命令在不在内核模块编没编决定命令能不能通。后面排查 6.1 节那个经典报错时这个区分就是第一刀。1.2 nouveau 和官方闭源驱动的取舍Ubuntu 默认给你装的是nouveau这是社区逆向出来的开源驱动。它的好处是开箱即用、随内核走、不需要额外配置装系统的时候就能点亮屏幕。但它的性能和功能跟官方闭源驱动差得不是一星半点CUDA 用不了、视频硬编码基本废、3D 性能大概只有官方驱动的几分之一新卡的支持还经常滞后。所以只要你打算用 CUDA、跑深度学习、做视频转码或者玩对性能有要求的游戏就必须换官方闭源驱动。这里有个关键点nouveau 和官方驱动是互斥的两者会抢同一块硬件。如果你没把 nouveau 屏蔽干净就直接装官方驱动轻则驱动加载失败重则开机黑屏。这也是为什么下面第 3 节要专门讲地基工作——很多人跳过这一步直接装然后卡在黑屏上怀疑人生。1.3 哪些场景必须上官方驱动不是所有场景都值得折腾官方驱动。如果你只是拿 Ubuntu 写代码、看网页、跑个轻量服务核显或者 nouveau 完全够用装驱动反而是给自己找麻烦。但下面这几类场景官方驱动是刚需跑CUDA / cuDNN / PyTorch / TensorFlow没有官方驱动连 GPU 都识别不到用ffmpeg 的 NVENC/NVDEC 硬编码做视频转码这个对性能提升非常明显做3D 渲染、Blender、达芬奇调色这类吃显卡的创作工作需要多显示器、高刷新率、G-Sync/FreeSync等高级显示特性玩游戏尤其是 3A 大作nouveau 基本没法玩。反过来说如果你的机器是 Intel HD Graphics 630 这类核显在输出画面那核显驱动是内核自带的i915根本不需要单独安装——这一点经常有人搞混跑去搜Intel 630 显卡驱动怎么装其实系统里早就有了你只需要关心独显那部分。2. 版本选型先看显卡代号再看分支选错驱动版本是新手最容易犯的错。有人拿着十年前的 Kepler 老卡去装最新的 5xx 驱动装完发现根本加载不了也有人新卡去装 470结果新特性全用不上。选型的核心逻辑其实就一句话先确定你的显卡属于哪一代架构再在支持该架构的分支里挑一个够新的稳定版。2.1 从 lspci 的输出倒推架构第一步永远是先知道自己的卡是什么。最直接的方式是lspci -nn | grep -i vga lspci -nn | grep -i 3d你会看到类似NVIDIA Corporation GA106 [GeForce RTX 3060]这样的输出。方括号里那个前缀就是芯片代号GA是 Ampere30 系AD是 Ada40 系GB是 Blackwell50 系TU是 Turing20 系、GTX 16 系GP是 Pascal10 系、Quadro P 系列GM是 MaxwellGTX 750 到 9 系GK是 KeplerGTX 6/7 系。知道代号就知道自己卡在哪个支持区间里了。如果lspci看不到独显可以换lshw -c display或者用nvidia-detect这个小工具Ubuntu 上在nvidia-detect包里它会直接告诉你当前机器适合哪个驱动版本非常省心。2.2 三个分支的区别到底在哪Nvidia 在 Linux 上的驱动分支可以粗略分成三类理解它们的定位对你选版本很有帮助。第一类是长期维护分支LTSB比如 470 系列、535 系列。这类分支的特点是生命周期长、bug 修复稳、几乎所有发行版都会长期打包适合生产环境和装完就不想再动的机器。第二类是新特性分支比如 550、570、580 这些跟新卡、新 CUDA 版本、新游戏特性的节奏走功能新但相对更容易遇到小毛病。第三类是老架构维护分支比如给 Kepler 用的 470.xx 的特定版本以及官方明确表示这是最后支持某代架构的那些分支。这里有个必须知道的业界动态Nvidia 已经明确 580 系列是最后一个继续支持 Maxwell、Pascal、Volta 架构的功能分支之后这些老卡转入长期安全维护只能拿到 580 分支内的修补版本。所以如果你手上是 GTX 10 系、Quadro P 系列比如 P600这类 Pascal 卡最稳妥的选择是535 或 550 这类仍在广泛打包的 LTS 分支而不是盲目追最新的 5xx 大版本号。2.3 型号与驱动版本对照表下面这张表是我按实际装机经验整理的覆盖了大部分常见卡可以直接照着选。显卡架构 / 典型型号建议驱动分支说明KeplerGTX 6xx/7xx 早期470.xx最后支持 Kepler 的分支别无选择MaxwellGTX 750/750Ti/9xx470 或 535GTX 750 是 GM107535 仍可用470 更保守PascalGTX 10 系、Quadro P600535 / 550广泛打包CUDA 支持完善VoltaTesla V100535 / 550数据中心卡跟 LTS 走TuringGTX 16 系、RTX 20 系535 / 550新特性与稳定兼顾AmpereRTX 30 系、A100535 / 550 / 新分支CUDA 场景优先 LTSAdaRTX 40 系550 / 570 / 580建议较新分支BlackwellRTX 50 系570 及以上老分支不支持新架构注意这张表给的是经验区间不是死规定。最终还是要以ubuntu-drivers devices或者 Nvidia 官方驱动下载页的型号查询结果为准因为同一代架构内部也可能有细微差别。关于热词里提到的gtx750显卡驱动用什么版本的好——GTX 750 和 750Ti 用的是 GM107 核心属于 Maxwell 第一代不是 Kepler。所以 470 和 535 都能用。但我个人更推荐470 分支它更轻、更省资源对这块卡来说性能完全够稳定性也经过时间检验。而 fP600是 Pascal535 装上去一点问题没有做 CAD 和小规模推理都很稳。3. 装驱动之前必须做的地基工作这一节是全文最容易被跳过、但跳过之后代价最大的部分。我见过太多人直接apt install nvidia-driver-535然后重启黑屏回头来论坛发帖。把下面的准备工作做齐能帮你避开至少八成的装驱动事故。3.1 内核头文件和编译链路要提前备好官方驱动的内核模块是要现场编译的。Ubuntu 的 apt 包会自动帮你拉依赖但如果你走.run安装或者手动 DKMS就必须确保当前内核对应的头文件已经装上sudo apt update sudo apt install build-essential linux-headers-$(uname -r) dkms这里的$(uname -r)会展开成你当前运行的内核版本比如6.8.0-45-generic。装完之后可以用ls /usr/src/linux-headers-$(uname -r)确认目录存在。为什么要强调这一步因为内核模块编译失败最常见的两个原因一是缺头文件二是缺编译器。前面装好了后面才省事。另外要提醒一句如果你用的是定制的实时内核或者自己编的内核头文件路径可能不一样得手动处理。3.2 Secure Boot 与 MOK 签名这是近些年越来越高频的一个坑。如果你的主板开启了Secure Boot那么它只允许加载经过签名的内核模块。Ubuntu 官方仓库里的 nvidia 驱动包是签好名的正常情况下能直接加载但你一旦用.run文件自己编译模块就没签名Secure Boot 会直接拒绝加载表现就是装完驱动重启后nvidia-smi报连不上驱动。处理办法有两种。第一种是简单粗暴进 BIOS关掉 Secure Boot。第二种是规范做法注册一个 MOKMachine Owner Key给自己的模块签名。Ubuntu 上大致流程是sudo mokutil --import /var/lib/shim-signed/mok/MOK.der # 会提示你设置一个一次性密码 sudo reboot # 重启时进入蓝色 MOK 管理界面选 Enroll MOK输入刚才的密码重启后mokutil --sb-state能看到 Secure Boot 状态。我个人的建议是服务器和开发机直接关 Secure Boot 最省心生产环境或者公司有安全要求就老老实实签名。3.3 提前屏蔽 nouveau前面说了 nouveau 和官方驱动互斥所以装之前要把它挡在外面。新建一个配置文件sudo tee /etc/modprobe.d/blacklist-nouveau.conf EOF blacklist nouveau options nouveau modeset0 EOF sudo update-initramfs -u两行内容的含义分别是禁止加载 nouveau 模块以及关掉 nouveau 的 KMS 模式设置否则它还是会抢先接管显示。写完update-initramfs把配置打进 initramfs重启后才能真正生效。验证方式是重启后执行lsmod | grep nouveau如果没有任何输出就说明屏蔽成功了。这一步没做干净是后面黑屏问题的一大元凶。3.4 做一次系统快照给自己留条后路这部分是我用血泪换来的建议。装显卡驱动是有一定概率把图形界面搞崩的轻则进不去桌面重则开机进不了系统。所以动手之前务必做一次回滚准备。最省事的方案是Timeshift装好之后建一个系统快照出问题一条命令回滚。次一点的方案是手动记下当前驱动状态dpkg -l | grep nvidia、lsmod | grep nvidia和 Xorg 配置至少知道原来的样子。如果你是在虚拟机里折腾比如 VMware 里装 Ubuntu 测试那就随便造快照点一下就能回退。对于物理机、尤其是工作用的机器不做快照就开始装驱动是一种很危险的行为。4. 三条主流安装路线按场景挑准备工作做完就可以正式装了。Ubuntu 上装 Nvidia 驱动有三条主流路线各有各的适用场景不能一概而论说哪条最好。4.1 路线一ubuntu-drivers 自动推荐这是我最推荐新手走的路也是绝大多数场景下的最优解。Ubuntu 维护了一个显卡和驱动的匹配数据库能自动推荐适合你硬件的版本sudo apt update ubuntu-drivers devices输出里会列出可用的驱动其中带recommended标记的就是官方推荐版本。确定了版本之后可以两条命令二选一sudo ubuntu-drivers autoinstall # 或者指定版本 sudo apt install nvidia-driver-535autoinstall会自动帮你装推荐版本并处理依赖比较省心。apt install nvidia-driver-535则更可控适合你想锁定具体版本的场景。装完之后sudo reboot重启后用nvidia-smi验证。这条路线的优势是全程走 apt 包管理升级、卸载、依赖处理都由系统负责最不容易留下烂摊子。热词里那个ubuntu20.04 安装显卡驱动 apt install nvidia-driver-535说的就是这条路。顺带提一句拼写要注意是nvidia-driver-535不是nvidia-dirver输错了 apt 会直接告诉你找不到包。4.2 路线二apt 指定版本安装这条路和路线一其实是同一套机制区别在于你跳过推荐、直接锁定版本。什么情况下需要这么做比如你的 CUDA 版本对驱动有明确要求或者团队统一用某个版本方便复现环境又或者推荐版本在你的机器上有已知问题需要降级。做法很直接sudo apt install nvidia-driver-535 # 降级到某个具体小版本 sudo apt install nvidia-driver-535535.183.01-0ubuntu1小版本号可以从apt-cache policy nvidia-driver-535里查到。什么时候该锁小版本我的经验是CUDA 和驱动存在版本对应关系后面 5.3 节细讲如果你要把环境固化下来锁小版本比只锁大版本更保险。另外apt-mark hold nvidia-driver-535可以防止系统升级时自动把它升到新分支这在生产机器上很有用。4.3 路线三官方 .run 文件离线安装这条路线适合两种极端场景一是机器完全没外网二是你需要一个 apt 仓库里没有的特殊版本。做法是从 Nvidia 官网下载对应的.run文件然后在纯文本模式下安装# 先切到文本模式停掉图形界面 sudo systemctl stop gdm3 # 或者 lightdm看你的显示管理器 # 切到 ttyCtrlAltF3 sudo telinit 3 # 给 .run 文件加执行权限并安装 chmod x NVIDIA-Linux-x86_64-535.183.01.run sudo ./NVIDIA-Linux-x86_64-535.183.01.run安装过程中会问你几个问题是否编译 DKMS 模块推荐选是这样内核升级后能自动重编、是否注册内核模块签名Secure Boot 开着的话选是、是否让安装器修改 Xorg 配置一般选是。装完sudo reboot。这条路线最大的特点就是干净但不隔离——它不经过包管理器卸载得用它自带的nvidia-uninstall。如果你之后又用 apt 装了别的 nvidia 包两套东西混在一起麻烦就来了。所以除非有明确需求我个人更倾向 apt 路线。4.4 离线环境怎么装机房里的计算节点经常没外网这时候有几种办法。第一种是在有网的同版本机器上把 deb 包全部下下来apt-get download或者apt-get -d install拷过去用dpkg -i批量装。第二种是搭一个内网 apt 镜像源。第三种就是直接用.run文件。我一般推荐第二种虽然前期麻烦点但后续所有节点升级维护都省事。不管走哪条路装完之后的第一件事都是重启然后进第 5 节验证。5. 装完之后必做的验证与配置重启回来不代表就成功了必须逐项验证才能确保驱动真的在工作。5.1 nvidia-smi 怎么读nvidia-smi是最常用的验证命令但很多人只会看它有没有报错不会读它输出的信息。实际上它右上角有个很关键的东西——CUDA Version。新手经常误会这是你安装的 CUDA 版本其实它是当前驱动支持的最高 CUDA 运行时版本不代表你系统里装了 CUDA。搞不清这个区别后面配 PyTorch 环境时会一头雾水。另外几个验证点nvidia-smi # 能看到显卡列表和驱动版本 lsmod | grep nvidia # 能看到 nvidia、nvidia_modeset 等模块 cat /proc/driver/nvidia/version # 内核模块版本 glxinfo | grep OpenGL renderer # 确认当前渲染用的是独显还是核显glxinfo需要mesa-utils包。如果它显示的是NVIDIA GeForce ...说明独显在负责渲染如果显示Intel ...那就还是核显在干活需要做下面的 PRIME 配置。5.2 双显卡笔记本的 PRIME 切换笔记本尤其是带 Intel 核显 Nvidia 独显的机器会遇到一个问题到底谁在输出画面。Ubuntu 用 PRIME 来做双显卡切换命令是prime-selectprime-select query # 查看当前模式 sudo prime-select nvidia # 全部走独显性能强费电 sudo prime-select on-demand # 默认用核显需要时切独显省电 sudo prime-select intel # 强制核显Ubuntu 22.04 之后默认是on-demand模式日常办公省电跑深度学习时再切 nvidia。切换完要注销重新登录才能生效。这是我实测下来最省心的方案比手动改 Xorg 配置靠谱得多。如果你不确定自己是不是双显卡机器用lspci | grep -E VGA|3D看看是不是同时出现了 Intel 和 Nvidia。5.3 CUDA 版本和驱动的对应关系这块和显卡驱动强相关简单说清楚驱动版本决定了它能支持的最高 CUDA 运行时版本。比如nvidia-smi右上角显示CUDA Version: 12.2意思是你最多能跑 CUDA 12.2 及以下的程序装了更高的 CUDA Toolkit 也不会生效。所以配环境时的顺序是先定驱动版本再根据驱动支持的 CUDA 上限选 CUDA Toolkit最后选匹配的 PyTorch/TensorFlow。而不是反过来先装框架再去凑驱动。如果你在 CUDA 13 相关的新环境里热词里提到ubuntu26.04 nvidia cuda13那就必须用较新的驱动分支老驱动是撑不起来的。这个顺序搞反了就会出现框架装了但用不了 GPU的经典问题。5.4 给 ffmpeg 配上 NVENC 硬编码很多人装 Nvidia 驱动就是为了用 ffmpeg 的硬件编解码。驱动装好后还需要 ffmpeg 在编译时启用了 NVENC 支持。验证方式是ffmpeg -hwaccels | grep cuda ffmpeg -encoders | grep nvenc如果能看到h264_nvenc、hevc_nvenc这些编码器说明可以用。发行版自带的 ffmpeg 有时不带 NVENC那你就得自己编译一个带--enable-nvenc --enable-cuda-nvcc的版本。用起来也很简单转码时加-c:v h264_nvenc就行速度能比纯 CPU 快好几倍尤其适合批量转码场景。6. 常见问题排查实录下面这些报错我基本每个都亲自遇到过。按现象—原因—解决的结构给你捋一遍。6.1 nvidia-smi 报连不上驱动完整报错通常是NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver。这是最高频的一个问题根因从高到低排下来有这么几个第一个原因是内核模块没编译成功。可能是内核升级了但 DKMS 没触发重编也可能是头文件缺失。先查dkms status看 nvidia 模块的状态。如果是built或者干脆没记录就手动重装一次sudo apt install --reinstall nvidia-dkms-535。第二个原因是 Secure Boot 拦住了未签名的模块用dmesg | grep -i module verification或mokutil --sb-state确认。第三个原因是 nouveau 没屏蔽干净lsmod | grep nouveau有输出就说明问题在这。排查的固定套路是lsmod | grep nvidia看模块在不在 →dmesg | grep -i nvidia看内核怎么说 →dkms status看编译情况。三刀下去基本能定位。6.2 failed to load module glxserver_nvidia这个报错常见于 Xorg 日志全称类似[ 7.125] (EE) NVIDIA: Failed to load module glxserver_nvidia。它通常指向用户态库和内核模块版本不匹配或者 32 位/64 位库缺了一部分。最常见的原因是用.run装过一次、又用 apt 装了一次两套库混在一起。解决办法是先彻底清干净看 6.5再重新用单一方式装一遍。如果只是想补库可以试试sudo apt install --reinstall libnvidia-gl-535。另外确认一下 Xorg 配置文件ls /usr/lib/xorg/modules/drivers/ | grep nvidia里是不是有nvidia_drv.so缺了就说明对应包没装到位。6.3 黑屏、循环登录、只停在光标这三种现象经常一起出现本质都是图形界面起不来。常见诱因有几个nouveau 没屏蔽干净被官方驱动抢了硬件Xorg 配置文件冲突比如残留的nvidia-xconfig生成的老配置显示管理器版本和驱动不兼容还有少数情况是驱动版本和卡不匹配。应急处理是进恢复模式或者用CtrlAltF3切到 tty先卸载驱动回到 nouveau保证能进系统sudo apt purge ^nvidia-.*然后sudo update-initramfs -u重启。能进桌面之后再仔细排查。预防上装之前做快照3.4 节是最有效的。6.4 内核升级后驱动突然失效这是个经典场景某天apt upgrade升了内核重启后nvidia-smi就报错了之前一直好好的。原因是新内核的头文件和你原来的驱动模块对不上DKMS 没有自动重编或者重编失败了。排查dkms status会显示哪个内核版本 build 失败。解决先装新内核的头文件sudo apt install linux-headers-$(uname -r)再sudo dpkg-reconfigure nvidia-dkms-535触发重编。如果还是失败检查/var/lib/dkms/nvidia/.../build/make.log看具体编译错误一般是编译器版本或者内核补丁导致。长期方案是用apt-mark hold锁住内核和驱动或者确保 DKMS 一直处于工作状态。6.5 卸载不干净导致重装反复失败这是最让人抓狂的一类问题。表现是重装了无数次问题依旧。根因是残留文件和新安装冲突。彻底清理的步骤sudo apt purge ^nvidia-.* sudo apt purge ^libnvidia-.* sudo apt autoremove sudo apt autoclean # 清掉可能的残留配置 sudo rm -f /etc/modprobe.d/nvidia*.conf sudo rm -f /etc/X11/xorg.conf sudo rm -rf /etc/X11/xorg.conf.d/20-nvidia.conf如果你之前用过.run安装还得先跑一遍sudo nvidia-uninstall。图形界面里还有一个思路可以参考 Windows 上用 DDU 彻底卸载驱动的做法——先卸干净再装不要指望覆盖安装能解决问题。清理完重启一次确认lsmod | grep nvidia为空、nvidia-smi报 command not found再开始装新的这样才叫干净。6.6 常见问题速查表把上面这些整理成一张表方便你对着现象直接定位。现象最可能的原因优先排查动作nvidia-smi 报连不上驱动内核模块没编 / 没签名dkms status、mokutil --sb-state命令不存在command not found用户态库没装dpkg -lglxserver_nvidia 加载失败库版本混乱 / 缺库彻底清理后单一方式重装黑屏、循环登录nouveau 未屏蔽 / Xorg 配置冲突进 tty 卸载驱动恢复内核升级后驱动失效DKMS 没重编装头文件后dpkg-reconfigure重装反复失败残留文件冲突按 6.5 彻底清理独显不参与渲染PRIME 模式不对prime-select query并切换Secure Boot 下 .run 装不上模块未签名注册 MOK 或关闭 Secure Boot这张表建议收藏出问题的时候按现象那一列找就行能省下大量到处搜帖子的时间。7. 一些掏心窝的实操体会关于版本我的态度一直很明确能用 LTS 分支就别追新分支。新分支带来的性能提升在大多数场景下你根本感知不到但它带来的兼容性问题却可能让你损失一整天。我见过有人为了用最新驱动从稳定的 535 升到最新分支结果 CUDA 环境直接崩了回退还要重装一堆东西。除非你的卡强制要求新分支比如 50 系否则 535、550 这类分支就是最舒服的选择。另外关于双系统的问题也值得提一句。如果你机器上装了双系统Windows 那边的驱动更新有时候会影响 Nvidia 显卡的固件状态导致 Linux 这边出现奇怪的问题。我遇到过几次这种情况排查了半天才发现是固件层面的问题。所以如果 Linux 这边突然不对了回想一下最近有没有动过 Windows 那边的驱动更新。最后一个习惯每次装完驱动我都会把nvidia-smi的输出、驱动版本、内核版本记到一个文本文件里。看着麻烦但当环境出问题时你能一眼看出原来是内核从 A 升到了 B排查效率完全不一样。装显卡驱动这件事说到底是和版本管理打交道你说的每一句话、改的每一个配置都应该留下痕迹这样下次出问题才不会两眼一抹黑。
返回列表