☰
Ubuntu Nvidia 显卡驱动安装、选型与常见问题排查
2026/9/29 1:46:18 网站建设 项目流程

1. 动手前先摸清家底:显卡型号、驱动推荐和当前状态

Ubuntu 装 Nvidia 显卡驱动这件事,说难不难,说简单也真能把人折腾到半夜。我自己第一次在 Ubuntu 上装 Nvidia 驱动,是在一台装了 GTX 750 的老机器上,照着一篇教程敲了apt install nvidia-driver-535,结果重启直接黑屏,只能按 Ctrl+Alt+F3 进 tty 把驱动卸掉重来。后来在 Ubuntu 20.04、22.04 的机器上反复装了几十次,从桌面卡到 P600 这类专业卡、从台式机到笔记本双显卡,才算把这里面的门道摸清楚。

这篇文章想解决的就是一件事:让你在 Ubuntu 上把 Nvidia 显卡驱动装对、装稳,并且装完之后遇到问题能自己排查。适合刚接触 Ubuntu 的新手,也适合那种"以前能跑,内核一升级就崩"的老用户。核心关键词就三个:Ubuntu、Nvidia、显卡驱动,外加一个大头——常见问题解决。因为说实话,装的过程只占三成时间,剩下七成全花在排错上。

1.1 为什么"apt install nvidia-driver-535"不能无脑敲

很多人看到别人一条命令搞定,就以为自己也能一条命令搞定。问题在于 Nvidia 驱动的版本号和显卡型号是强绑定的,不是版本越新越好。GTX 750 这类 Maxwell 架构的老卡,在比较新的驱动分支里已经被移出支持列表,你硬装上去,nvidia-smi大概率起不来,或者 X 服务直接挂掉。反过来,如果是 RTX 40 系这种新卡,装 470 这种老驱动又会缺特性。

还有一个坑是"混装"。你之前用官方 runfile 装过一次,后来又用 apt 装了一遍,两套文件同时在系统里,/usr/lib/xorg/modules下面挂着两拨 glx 模块,X 启动的时候自己都不知道该加载哪一个。这类问题的表现就是日志里那句著名的failed to load module "glxserver_nvidia"。

提示:装驱动之前,先把机器上现有的 Nvidia 相关包列一遍,确认是干净状态再动手。混合安装是后面 90% 玄学问题的根源。

1.2 三条命令查清显卡型号与推荐驱动

不用拆机箱,三条命令就够。第一条看硬件:

lspci | grep -i -E "vga|3d|display"

输出里会看到类似NVIDIA Corporation GA106 [GeForce RTX 3060]这样的字样,这就是你的卡。如果是笔记本,通常会看到两行,一行 Intel 核显,一行 Nvidia 独显。

第二条看系统推荐的驱动版本,这条最有用:

ubuntu-drivers devices

它会列出driver : nvidia-driver-535 - distro non-free recommended这种信息,带recommended的那个就是 Ubuntu 官方源认为最匹配你当前内核和硬件的版本。这个推荐值不是随便标的,它是根据显卡 PCI ID 和内核 ABI 匹配出来的,跟着它走翻车概率最低。

第三条看当前驱动的实际状态:

nvidia-smi cat /proc/driver/nvidia/version

如果nvidia-smi报has failed because it couldn't communicate with the nvidia driver,说明驱动没加载或者加载失败,正好印证了你需要重装。如果它能正常输出一张表格,包含驱动版本、CUDA 版本、显存占用,那说明驱动是活的,你只需要确认版本是否合适。

1.3 记录当前状态,方便出问题回滚

这一步很多人会跳过,但真出事的时候能救命。先把关键信息存下来:

uname -r # 当前内核版本 lsmod | grep -E "nvidia|nouveau" # 当前加载的显卡模块 dpkg -l | grep -i nvidia # 已安装的 nvidia 相关包 cat /etc/X11/xorg.conf 2>/dev/null # 有没有手写的 xorg 配置

把这几条的输出贴到一个文本文件里存着。原因很简单,驱动装崩之后你大概率进不了图形界面,只能在 tty 里靠记忆排查,有这份记录你能立刻知道自己之前装的是哪个版本、有没有残留配置。

注意:如果/etc/X11/xorg.conf存在并且里面有Driver "nvidia",说明这台机器以前被人手动配置过。这种情况下换驱动前最好先备份这个文件,很多黑屏问题就是它能改回来。

2. 安装方式选型:四条路子各自适合谁

Ubuntu 上装 Nvidia 驱动,主流的路径有四条:官方仓库 apt、Nvidia 官方 runfile、第三方 PPA、以及显卡厂商或整机厂商提供的预编译包。它们不是谁替代谁的关系,而是对应不同的网络条件、内核环境和维护需求。选错了不是装不上,而是后面维护起来会很痛苦。

2.1 官方仓库 apt 安装:桌面用户默认答案

ubuntu-drivers和apt这条路子最大的优势是跟内核升级联动。你装的是nvidia-driver-535这个元包,它背后依赖nvidia-dkms-535,DKMS 会在每次内核更新后自动重新编译内核模块。也就是说,下次apt upgrade把内核从 5.15.0-91 升到 5.15.0-94,重启之后驱动还是活的,不需要你手动干预。

代价是版本受限于 Ubuntu 仓库,通常比 Nvidia 官网的最新版落后几个小版本。对做深度学习、跑 CUDA 的人来说,这个落后一般不致命,因为 CUDA Toolkit 是独立安装的,驱动只要满足最低版本要求就行。

2.2 官方 runfile 安装:离线环境和特定版本需求

从 Nvidia 官网下载NVIDIA-Linux-x86_64-xxx.xx.run这种自解压安装包,好处是版本完全自由,官网出了哪个版本你就能装哪个。适合两种场景:一是内网机器完全没外网,二是你需要某个特定版本去匹配特定的 CUDA 或框架要求。

坏处也很明显:它不走 DKMS 的那套自动机制(除非你在安装时选择注册 DKMS),内核一升级,模块就没了,得手动重装一遍。所以用 runfile 的人,通常会在装完之后自己写个脚本或者加个 DKMS 注册,不然维护成本很高。

2.3 PPA 与厂商预编译包:谨慎使用

有些第三方 PPA 会提供比官方仓库更新的驱动版本。这类源的好处是安装方式和 apt 一致,坏处是源的维护质量参差不齐,内核升级后包依赖断掉的情况时有发生。如果你只是想要一个新一点的版本,优先看 Ubuntu 官方仓库里有没有-server后缀或者更新的分支,实在没有再用 PPA。

至于整机厂商的预编译包,常见于品牌工作站和服务器,这类包一般做了平台适配,稳定性不错,但版本通常很保守,而且和公开源的包容易冲突,装之前一定要确认它是不是要求你先把系统自带的 nvidia 包全部清掉。

2.4 一张表看清怎么选

安装方式版本自由度内核升级后是否自动重建适合场景主要风险
官方仓库 apt中是,走 DKMS桌面、常规服务器版本略旧
官方 runfile高否,需手动或注册 DKMS离线机、特定版本与 apt 包冲突
第三方 PPA高视包而定追新版本依赖易断
厂商预编译低视包而定品牌工作站与公开源冲突

我个人的建议很明确:能用 apt 就用 apt,除非你有非常明确的理由不用。跑深度学习的人,装的应该是nvidia-driver-535加上独立的 CUDA Toolkit,而不是为了追一个新驱动去折腾 runfile。

3. 版本号怎么定:老卡、新卡、专业卡的分界线

选版本这件事,本质是在"新特性"和"硬件兼容性"之间做权衡。Nvidia 的驱动分支是按架构划支持的,一代架构被移出支持列表之后,新分支就彻底不管它了。所以你得先知道自己的卡属于哪一代。

3.1 从 470 到 550 的支持范围差别

470 这个分支是比较特殊的一个,它是最后一批还完整支持 Kepler 架构的驱动之一,很多老卡比如 GTX 600、700 系列的用户会停在 470。535 是一个长期稳定分支,覆盖面很广,从 Maxwell 到 Ada 基本都能用,在 Ubuntu 22.04 的官方源里也是推荐常客。550 及更新的分支面向较新的架构,对老卡的支持要么没有,要么是残废状态。

所以你的决策顺序应该是:先用ubuntu-drivers devices看官方推荐,如果推荐值在你的卡的支持列表里,直接用;如果官方推荐偏新而你的卡偏老,就去查这个卡最后支持的驱动分支是哪个,装那个分支的最后一个版本。

3.2 常见型号与驱动版本对照

下面这张表是我根据几次装机经验整理的,供参考,实际以ubuntu-drivers devices和 Nvidia 官方支持列表为准。

显卡型号/架构建议驱动分支说明
GTX 750 / 750 Ti (Maxwell)470 / 535新分支可能已停止支持,470 最稳
GTX 1050 / 1060 (Pascal)535覆盖面好
P600 / P1000 (Pascal 专业卡)535专业卡跟随主流分支
RTX 2060 / 3060 (Turing/Ampere)535 / 550可用较新分支
RTX 4090 (Ada)550 及以上需要新分支才有完整特性

这张表的意义在于,当你手里的卡是 GTX 750 这种老家伙时,不要看到别人装 550 就跟着装 550。强行装上去,最常见的结果就是模块能编译但加载不了,lsmod | grep nvidia是空的,然后你陷入"我明明装了为什么没生效"的困惑。

3.3 版本太新会出什么问题

驱动版本和内核版本之间也有匹配关系。新驱动通常会要求一定版本以上的内核头文件才能编译。如果你在 Ubuntu 20.04 这种默认内核较老的系统上装非常新的驱动,DKMS 编译阶段就可能报错,日志在/var/lib/dkms/nvidia/<version>/build/make.log。这个日志非常值得看,编译失败的具体原因都在里面,比盲目搜索有用得多。

提示:DKMS 编译失败时,第一件事是确认linux-headers-$(uname -r)已经安装。缺了内核头文件,任何依赖 DKMS 的驱动都编译不出来,报错还挺隐晦。

4. 实战一:apt 方式装驱动全流程

这部分是桌面用户的主路径,我按 Ubuntu 20.04 和 22.04 上的实际操作写,26.04 这类新版本流程基本一致,命令里的包名按ubuntu-drivers devices的输出替换即可。

4.1 前置准备:依赖、Secure Boot、nouveau

先把基础工具装好:

sudo apt update sudo apt install -y build-essential gcc make linux-headers-$(uname -r)

build-essential和linux-headers是 DKMS 编译的前提,别省。

接着处理 Secure Boot。用这条命令看状态:

mokutil --sb-state

如果输出Secure Boot enabled,apt 装驱动的时候会弹一个界面让你设置一个 MOK 密码,重启时会进入蓝底的 MOK 管理界面,选 Enroll MOK,输入那个密码,才能让签名的内核模块被加载。很多人装完重启没进这个界面,结果驱动一直不生效,就是卡在这一步。如果这台机器不需要 Secure Boot,进 BIOS 关掉最省事。

然后确认 nouveau 是否被占用:

lsmod | grep nouveau

如果 apt 安装过程中你没手动禁用,通常安装脚本会自动处理。但如果是手动 runfile 安装,必须先自己禁用。创建/etc/modprobe.d/blacklist-nouveau.conf:

blacklist nouveau options nouveau modeset=0

再执行sudo update-initramfs -u,重启后lsmod | grep nouveau应该没有任何输出。

4.2 执行安装与重启验证

推荐用自动方式,它会挑出推荐版本:

sudo ubuntu-drivers autoinstall

或者指定版本,更可控:

sudo apt install -y nvidia-driver-535

安装过程会编译 DKMS 模块,输出里能看到Building for ...之类的行。装完重启:

sudo reboot

重启是必须的,因为要重新加载内核模块并让 X 用新驱动启动。

4.3 验证清单:这几条全过才算成功

重启之后不要急着开应用,按顺序验证:

nvidia-smi lsmod | grep nvidia glxinfo | grep -i "opengl renderer" cat /proc/driver/nvidia/version

nvidia-smi应该输出表格,右上角显示Driver Version: 535.xx。lsmod应该看到nvidia、nvidia_uvm、nvidia_modeset、nvidia_drm这几个模块。glxinfo的 OpenGL renderer 应该是你的 Nvidia 卡型号,而不是llvmpipe或者 Intel 核显。

如果glxinfo没装,用sudo apt install mesa-utils补上。笔记本双显卡的机器,glxinfo显示 Intel 不一定是坏事,看你是不是在用 PRIME 的核显模式,这个后面细说。

注意:nvidia-smi能出表格但glxinfo显示 llvmpipe,说明内核模块加载了但 X 没接上,通常是 X 配置或者 glx 模块的问题,属于下一节的排查范围。

5. 实战二:runfile 离线安装

内网机器、完全断网的机器,只能走这条路。核心思路是把安装包和各路依赖提前准备好,然后在关掉图形界面的情况下静默安装。

5.1 依赖与内核头文件不能少

runfile 安装需要编译器、内核头文件、以及 DKMS(如果你要注册的话):

sudo apt install -y gcc make dkms linux-headers-$(uname -r)

如果机器完全离线,这些 deb 包也得从别的同版本系统上下载好带过去。做法是在有网的机器上,用相同 Ubuntu 版本:

apt-get install --download-only -o Dir::Cache::archives=/tmp/nvpkgs build-essential dkms linux-headers-$(uname -r)

把/tmp/nvpkgs整个拷到目标机器,然后sudo dpkg -i /tmp/nvpkgs/*.deb。

5.2 关掉图形界面再执行安装

runfile 安装时如果 X 在跑,它会报错退出。切到文本模式:

sudo systemctl isolate multi-user.target

或者用sudo telinit 3。然后给安装包加执行权限并运行:

chmod +x NVIDIA-Linux-x86_64-535.xx.xx.run sudo ./NVIDIA-Linux-x86_64-535.xx.xx.run

安装向导里有两个选项值得注意:一个是询问是否注册 DKMS,强烈建议选是,这样以后内核升级能自动重建;另一个是 32 位兼容库,除非你明确要跑 32 位程序,一般可以不装。

如果你的内核开了 Secure Boot 且不想关,安装时还要给模块签名,参数里加--module-signing-secret-key之类,配置起来比较麻烦,实务上大多数人会选择关掉 Secure Boot。

5.3 离线环境用本地源代替单包安装

如果内网机器不止一台,与其一台台拷 deb,不如搭个本地 apt 源。把下载好的 deb 放在一个目录里,执行:

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

然后在目标机器上把deb [trusted=yes] file:/path/to/repo ./写进/etc/apt/sources.list.d/local.list,apt update之后就能像在线一样apt install nvidia-driver-535。这个办法在多机部署场景下省的时间非常多,而且以后加新包也方便。

6. 高频报错逐个击破

装完之后出问题,其实集中在几个固定的报错上。把这几类搞清楚,基本能覆盖九成情况。

6.1 nvidia-smi has failed because it couldn't communicate with the nvidia driver

这句话的意思是用户态工具找不到内核里的驱动。排查顺序从下往上:

  1. 先看模块加载没加载:lsmod | grep nvidia。空的话sudo modprobe nvidia试一下,看报什么错。
  2. 看内核日志:dmesg | grep -i nvidia。常见的是NVRM: API mismatch,说明用户态库和内核模块版本不一致,属于混装后遗症。
  3. 看 DKMS 状态:dkms status。如果显示nvidia, 535.xx, 5.15.0-xx, x86_64: installed是正常的,如果内核那一栏对不上你当前uname -r,说明没为当前内核编译。
  4. 如果内核升级过,手动重建:sudo dkms autoinstall,或者直接重装模块包sudo apt install --reinstall nvidia-dkms-535。

还有一种情况是/dev/nvidia0这些设备节点没生成,通常是模块加载失败的结果而不是原因,跟着上面几步走就行。

6.2 failed to load module "glxserver_nvidia"

这个报错出现在 X 的日志里,路径通常是/var/log/Xorg.0.log。它的直接含义是 X 在找 Nvidia 的 GLX 扩展模块时失败。根本原因有两个方向。

一个是残留的/etc/X11/xorg.conf里写死了Driver "nvidia",但驱动实际没装好或者装的是别的版本。处理办法是把 xorg.conf 删掉或改名,让 X 走自动探测:

sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak

另一个是混装导致的 glx 模块冲突。/usr/lib/xorg/modules/extensions/下面可能同时有libglxserver_nvidia.so和其他来源的 glx 文件。这种情况最干净的办法是把所有 nvidia 相关包彻底清一遍,再重新装一种方式的驱动,不要在 apt 和 runfile 之间反复横跳。

6.3 黑屏、循环登录、分辨率异常

黑屏分两种。一种是完全不显示,只能靠 Ctrl+Alt+F3 进 tty,这通常是驱动和显卡不匹配,或者 X 配置写错。另一种是能进登录界面,输密码之后又弹回来,也就是循环登录,常见原因是 greeter 和显卡驱动不兼容,或者 Home 目录下的某些配置文件权限出问题。

进 tty 之后的急救步骤:

sudo apt purge -y '^nvidia-.*' '^libnvidia-.*' sudo apt autoremove -y sudo reboot

清干净之后系统会回落到 nouveau,图形界面能正常起来,然后再按第 4 节的流程重装。这一步虽然粗暴,但是能把状态拉回已知可用的起点。

分辨率异常比如只能 1024x768、无法识别外接显示器,多数是驱动没真正生效或者内核模块版本不匹配。先lsmod确认,再看xrandr的输出里有没有你的显示器接口。

6.4 内核升级之后驱动突然失效

这是最典型的无声故障:昨天还好好的,今天apt upgrade之后重启,屏保一出分辨率就掉,nvidia-smi报错。原因就是新内核装上了,但 DKMS 没为新内核重建模块。

先看dkms status确认,然后:

sudo apt install --reinstall linux-headers-$(uname -r) sudo dkms autoinstall

如果编译报错,去看/var/lib/dkms/nvidia/*/build/make.log,里面会明确告诉你缺什么头文件或者哪个符号找不到。

6.5 常见问题速查表

现象最可能原因首选处理
nvidia-smi 通信失败模块未加载/版本不匹配lsmod → modprobe → dkms autoinstall
glxserver_nvidia 加载失败xorg.conf 残留或混装移除 xorg.conf,清理重装
循环登录greeter 与驱动不兼容进 tty 清驱动回 nouveau
内核升级后失效DKMS 未为新内核重建装新内核头文件后 dkms autoinstall
分辨率异常驱动未生效确认 lsmod 与 xrandr
DKMS 编译失败缺内核头文件装 linux-headers-$(uname -r)

7. 卸干净、换版本:驱动维护的正确姿势

换版本之前必须先卸干净,这是所有经验里最重要的一条。别在一个已经装着 535 的系统上直接apt install nvidia-driver-550然后祈祷它能自动处理,依赖解析确实会做替换,但残留的配置文件、xorg.conf、以及手工放进去的 runfile 文件不会自动消失。

7.1 apt 包和 runfile 的卸载方式不同

apt 装的用:

sudo apt purge -y '^nvidia-.*' '^libnvidia-.*' '^cuda-drivers.*' sudo apt autoremove -y

用通配符清是为了把nvidia-driver-535、nvidia-dkms-535、nvidia-utils-535这些衍生包一起带走。

runfile 装的,要用它自己的卸载参数:

sudo ./NVIDIA-Linux-x86_64-535.xx.xx.run --uninstall

如果安装包已经删了,可以试sudo nvidia-uninstall,这个脚本通常在/usr/bin/下。卸载完检查一下/usr/lib/xorg/modules/extensions/里还有没有libglxserver_nvidia.so,有的话确认没被引用再删。

7.2 换版本的正确顺序

顺序不能乱,我一般这样走:

  1. 卸载现有驱动,重启回 nouveau。
  2. ubuntu-drivers devices重新确认目标版本。
  3. 安装新版本。
  4. 重启,跑第 4.3 节的验证清单。

中途不要跳步骤。特别是不要卸载完不重启就装新版本,因为旧模块可能还挂在内存里,新模块加载会失败。

提示:如果你用过 DDU 这类工具的思路,核心逻辑是一样的——先让系统回到没有 Nvidia 驱动的干净状态,再装新的。Linux 上对应的就是 purge 加重启。

8. 驱动装完之后:CUDA、ffmpeg 硬解、容器和笔记本双显卡

驱动只是地基,上面还有几层常见的关联需求,这里一并说说。

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

CUDA Toolkit 对驱动有最低版本要求,但驱动是向下兼容的。大致对应关系是这样:

驱动分支支持的最高 CUDA
47011.4
52512.0
53512.2
55012.4

也就是说,如果你装的是 535,跑需要 CUDA 12.2 的工具没问题,想跑要求 12.4 的可能就有麻烦。判断方法很简单,nvidia-smi右上角那个CUDA Version就是当前驱动支持的最高版本。装 CUDA Toolkit 之后,nvcc -V显示的是 Toolkit 自己的版本,两者不一致是正常的。

8.2 ffmpeg 调用 Nvidia 硬编解码

想让 ffmpeg 用显卡而不是 CPU 转码,先确认它有没有编进 nvenc 支持:

ffmpeg -hwaccels ffmpeg -encoders | grep nvenc

如果有h264_nvenc、hevc_nvenc,就能这么用:

ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset p4 -b:v 6M output.mp4

解码侧可以用-c:v h264_cuvid。转码速度提升非常明显,尤其是批量处理视频的时候,CPU 占用能从满核降到个位数。要注意的是 nvenc 的画质在同码率下一般略逊于 x264 的 slow 预设,追求体积的话需要自己调-cq参数。

8.3 Docker 里把显卡透进去

容器里用显卡需要 nvidia-container-toolkit。装好之后,运行容器时加--gpus all就行。如果报错说找不到 runtime,检查/etc/docker/daemon.json里有没有配置nvidiaruntime,配好之后sudo systemctl restart docker。容器里nvidia-smi能用,说明设备节点挂载正常。

8.4 笔记本双显卡的 PRIME 切换

笔记本通常有 Intel 核显和 Nvidia 独显两块。Ubuntu 上可以用prime-select切模式:

prime-select query sudo prime-select nvidia # 全程用独显 sudo prime-select on-demand # 按需切换,省电

prime-select切完要重启或重新登录。on-demand 模式下,想让某个程序用独显,可以用__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia 程序名。这个组合是我试过最省心的方式,平时核显待机,跑重活的时候手动调独显。

9. 我踩过的坑与几条不讲道理的经验

有几次经历印象特别深。一次是在一台 P600 的机器上,官方源推荐的是 535,但装完之后glxinfo一直显示 llvmpipe,折腾了半天发现是之前有人在/etc/X11/xorg.conf里写死了BusID,换驱动之后那个 BusID 变了,X 找不到设备就退回了软件渲染。删掉 xorg.conf 立刻正常。

还有一次是帮人处理一台骁龙笔记本上的显卡问题(Intel HD Graphics 630 核显加 Nvidia 独显的组合),循环登录。最后定位到是 greeter 的问题,切了个显示管理器就好了。这种问题很难从驱动本身找原因,因为nvidia-smi明明是好的。

几条我总结下来的经验:第一,装驱动前一定要备份 xorg.conf 并记录当前状态;第二,优先用 apt,不要贪新版本;第三,内网机器提前把内核头文件、dkms、build-essential 的 deb 包准备好,不然你会在离线环境里卡很久;第四,内核升级之后第一件事就是跑一遍nvidia-smi,别等出问题了才发现;第五,任何"混装"的诱惑都要抵制住,一种方式装到底。

如果你现在正卡在某一步,把dmesg | grep -i nvidia和/var/log/Xorg.0.log里报错的那几行翻出来,对照第 6 节的表格找,基本都能定位到方向。

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

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

立即咨询