☰
Ubuntu NVIDIA显卡驱动安装与nvidia-smi排错实战
2026/9/30 3:50:03 网站建设 项目流程

1. 装驱动之前,先把这三件事弄明白

在 Ubuntu 上折腾 NVIDIA 显卡驱动,说难不难,说简单也真不简单。我见过太多人上来就敲一句apt install nvidia-driver-535,结果重启之后黑屏、循环登录,或者终端里冒出那句经典报错nvidia-smi has failed because it couldn't communicate with the nvidia driver,然后就开始满世界找教程。这篇内容就是写给这类朋友的——不管你是刚装完 Ubuntu 22.04 想跑深度学习的新手,还是给老机器换块显卡想点亮图形界面的老玩家,我都尽量把每一步的理由讲清楚,让你不是照着命令抄,而是知道自己为什么这么做。核心关键词就三个:Ubuntu、NVIDIA、显卡驱动,后面所有内容都围着它们转。

1.1 nouveau、nvidia 官方驱动到底差在哪

Ubuntu 装好之后,如果你什么驱动都不装,系统其实也能亮屏,用的是内核自带的nouveau驱动。这是一个社区反向工程出来的开源驱动,优点是开箱即用、跟着内核走、不容易把系统搞崩;缺点也很明确——它没有 NVIDIA 官方的专利固件,没有办法做频率动态调节,性能通常只有官方驱动的三分之一到一半,跑 CUDA、跑大模型推理、跑视频硬编解码基本免谈。

官方驱动(也就是我们常说的闭源驱动、proprietary driver)是另一回事。它包含内核模块nvidia.ko、用户态库libnvidia-*、Xorg 的显示驱动nvidia_drv.so,还有一套管理工具。它能让显卡跑满频率、支持 CUDA 和 NVENC/NVDEC、支持多屏和 G-SYNC。代价就是它跟内核版本强绑定,内核一升级,模块得重新编译一次,否则就加载失败。

理解这个差异很重要,因为它决定了后面一个高频问题:为什么我升级完内核,第二天开机就进不去图形界面了。答案几乎都是 nouveau 被禁用了、官方模块又没编译成功,两边都没接上。

1.2 你的卡和你的系统版本决定了能装哪个版本

这一步是新手最容易忽略的。不是所有驱动版本都支持所有显卡,也不是所有 Ubuntu 版本都能直接从仓库里装到最新驱动。

大致规律是这样的:

  • 10 系(Pascal)及更早的老卡,比如 GTX 750、GTX 960,最后一个比较稳的支持分支是 470 系列,再往上的新版本会陆续砍掉支持。
  • 20 系(Turing)到 30 系(Ampere),470 到 550 之间都能用,535 是长期分支(LTSB),比较稳,我一般推荐这个。
  • 40 系(Ada),需要 525 以上,推荐 535 或更高。
  • 50 系(Blackwell)这种新架构,Ubuntu 22.04 自带的仓库里往往没有足够新的版本,需要 Ubuntu 24.04 或者手动加官方的软件源。

系统版本这块,Ubuntu 20.04、22.04、24.04 的软件仓库里预置的驱动版本差别很大。20.04 仓库里常见的是 470/510,22.04 是 515/525/535,24.04 会新一些。所以经常有朋友问「我的 22.04 怎么 apt 里搜不到 550」,不是你的操作有问题,是仓库里确实没有,得换思路。

1.3 装驱动会动到系统的哪些地方

我习惯在动手前先想清楚「这一刀切下去会改什么」,心里有数就不慌。装官方驱动大概会动这几处:

位置作用改动方式
/lib/modules/$(uname -r)/kernel/drivers/video/内核模块nvidia.koDKMS 编译生成
/etc/modprobe.d/nouveau 黑名单、模块参数手动或安装脚本写入
/usr/lib/x86_64-linux-gnu/用户态库包管理安装
/etc/X11/xorg.confXorg 显示配置一般不需要,多屏才用
initramfs早期启动阶段的模块update-initramfs -u更新
GRUB 参数内核启动选项必要时加nomodeset

看到这个表你就明白为什么卸载驱动不能只删一个包——它是分布在好几个位置的,残留的xorg.conf或者没清干净的黑名单配置,都可能导致新驱动装上了却跑不起来。

2. 三条安装路线的选型对比与决策逻辑

装 NVIDIA 驱动在 Ubuntu 上至少有三种主流做法,我这些年三种都用过,各有各的适用场景,没有哪一种是「绝对正确」的。下面把三条路线的原理、优缺点和适用范围讲清楚,你对号入座就行。

2.1 路线一:ubuntu-drivers 自动推荐安装

Ubuntu 提供了一个叫ubuntu-drivers的工具,它会读取你的 PCI 设备 ID,然后跟仓库里的驱动包做匹配,给出一个推荐列表。命令很简单:

# 查看推荐 ubuntu-drivers devices # 自动安装推荐版本 sudo ubuntu-drivers autoinstall

这条路线最大的价值是「不烧脑」。它输出的列表里会标注recommended,通常是经过 Ubuntu 团队验证过、跟当前内核兼容性最好的那个版本。对于绝大多数用户,尤其是第一次装驱动的新手,我强烈建议先走这条。

它的局限也得说清楚:一是只能装仓库里有的版本,你想装个刚发布的 570 就别指望了;二是自动推荐有时候会偏保守,可能给你一个比硬件能力更旧的版本;三是在服务器版 Ubuntu 上默认没装这个工具,得先apt install ubuntu-drivers-common。

2.2 路线二:apt 指定版本安装

如果你明确知道自己要哪个版本,比如团队统一要求 535,或者要跟某个 CUDA 版本对齐,那就用 apt 直接指定:

sudo apt update sudo apt install nvidia-driver-535

这条路线的优势是可控、可复现,写进自动化脚本、Dockerfile 或者 Ansible playbook 都很干净。而且它用的是包管理,卸载也干净,sudo apt purge nvidia-*基本能清利索。

注意一个细节:apt 安装驱动时会自动处理 nouveau 的黑名单和 initramfs 更新,不用你手动去改/etc/modprobe.d/。很多人不知道这点,装完 apt 版本又手动加了一遍黑名单,虽然不冲突,但容易把自己绕晕。

2.3 路线三:官方 runfile 手动安装

从 NVIDIA 官网下载.run文件,给执行权限,然后进文本模式运行安装程序。这条路最「硬核」,也最容易被推荐给新手——我个人其实不太建议新手一上来就干这个。

它的核心命令大概是这样:

# 赋予执行权限 chmod +x NVIDIA-Linux-x86_64-535.183.01.run # 停掉图形界面 sudo systemctl isolate multi-user.target # 安装 sudo ./NVIDIA-Linux-x86_64-535.183.01.run

这条路线的优点是版本不受仓库限制,最新的、最老的都能装。缺点是一堆:得手动禁 nouveau、手动装build-essential和linux-headers-$(uname -r)、DKMS 是要你自己勾选的、内核升级后如果不装 DKMS 就得重装一遍、卸载要用nvidia-uninstall、还得处理 Secure Boot 签名。

有个经典参数是--no-opengl-files,它的作用是只装内核模块和 CUDA 相关,不覆盖系统的 OpenGL 库。这在某些服务器场景下有用,能避免跟系统自带的 Mesa 库打架导致桌面崩掉。但反过来说,如果你是桌面用户要玩游戏、要用图形加速,那就不能加这个参数,否则跑不起来硬件加速。

2.4 三种路线怎么选

给个直接的决策表:

场景推荐路线理由
桌面用户,第一次装路线一 autoinstall省事,兼容性最好
需要固定版本、团队统一路线二 apt 指定可复现,好维护
仓库里没有你需要的版本路线三 runfile唯一选择
服务器无桌面环境路线二或路线三路线一也行,但不必要
50 系新卡 + 老系统路线三或升级系统仓库确实没有
需要和特定 CUDA 版本严格对齐路线二(配官方源)apt 更好管依赖

我自己的习惯是:能不手动就别手动。runfile 看着简单,出问题的时候排查成本比 apt 高一个量级。

3. 实操:从干净系统到 nvidia-smi 正常输出

这一节是重头戏,我把三条路线从准备到验证的完整流程都写一遍。你可以按顺序读,也可以直接跳到你要走的那条。

3.1 准备阶段:备份、快照与依赖确认

动手之前,先做三件事。

第一,确认显卡型号和系统版本。

# 查显卡型号 lspci | grep -i vga lspci | grep -i nvidia # 查系统版本和内核 lsb_release -a uname -r

输出里你会看到类似01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060]这种信息,记住这个型号。uname -r是当前内核版本,比如5.15.0-91-generic,后面装 headers 要用到。

第二,确认当前加载的驱动。

lsmod | grep -i nouveau lsmod | grep -i nvidia

如果 nouveau 有输出、nvidia 没有,说明当前用的是开源驱动,符合预期。如果 nvidia 已经有输出,说明系统里已经装了官方驱动,你要做的是升级或者重装,不是从头装。

第三,做一次快照。这条我要重点强调:如果你用的是虚拟机,直接打一个快照,成本几乎为零。如果是物理机,至少把重要数据备份出来。我见过太多人因为驱动装崩了进不去系统,最后重装整个 Ubuntu,数据全丢。花五分钟做个备份,比事后抢救一整个下午划算得多。

提示:物理机上如果没做快照,至少确认你知道怎么进 GRUB 编辑启动参数、怎么切到 TTY(Ctrl+Alt+F3),这是后面救命的两个技能。

依赖方面,走 apt 路线基本不用额外装什么;走 runfile 路线,必须先装:

sudo apt install build-essential linux-headers-$(uname -r) dkms

linux-headers这个包特别关键,它提供了编译内核模块需要的头文件。很多人 runfile 装到一半报Unable to find the kernel source tree,就是这个包没装,或者装的是别的版本内核的 headers。

3.2 路线一完整操作:ubuntu-drivers 自动推荐

先更新索引,再跑检测:

sudo apt update ubuntu-drivers devices

输出大概长这样:

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 == modalias : pci:v000010DEd00002504sv00001462sd00003914bc03sc00i00 vendor : NVIDIA Corporation model : GA106 [GeForce RTX 3060] driver : nvidia-driver-535 - distro non-free recommended driver : nvidia-driver-525 - distro non-free driver : nvidia-driver-470 - distro non-free

带recommended的那个就是 Ubuntu 建议你装的。直接:

sudo ubuntu-drivers autoinstall

这条命令会自动装驱动、写 nouveau 黑名单、更新 initramfs。整个过程可能要几分钟,取决于你的网络速度。装完会让你重启:

sudo reboot

重启之后,正常情况下直接跑nvidia-smi就能看到显卡信息了。

这里有个小技巧:如果你用的是笔记本双显卡(Intel 核显 + NVIDIA 独显),装完之后还需要切换模式:

# 查看当前模式 prime-select query # 切到独显(性能模式,耗电) sudo prime-select nvidia # 切到核显(省电,NVIDIA 只在需要时唤醒) sudo prime-select on-demand

我一般笔记本用on-demand,台式机就用nvidia。切完要重启才生效。

3.3 路线二完整操作:apt 指定版本

假设你要装 535:

sudo apt update sudo apt install nvidia-driver-535

如果你的 Ubuntu 版本仓库里没有 535,会提示找不到包。这时候先搜一下有什么:

apt search nvidia-driver apt-cache search "^nvidia-driver-[0-9]+$"

还有个办法是加上官方的软件源。不同版本的源地址不一样,你应该去 NVIDIA 官方文档查当前对应的地址,不要照抄别人教程里的老地址——这是很常见的一个坑,抄了旧地址之后apt update报 GPG 错误或者 404。

安装过程中如果弹出 Secure Boot 相关的对话框,让你设置一个密码,那是在准备 MOK 注册。记住这个密码,重启时会有一个蓝色界面让你输入,输完以后模块才能被内核接受。这个环节后面第 4 章会详细讲。

装完重启,然后验证。验证命令我一般跑这一套:

# 基础验证 nvidia-smi # 显示驱动版本信息 cat /proc/driver/nvidia/version # 看看哪些进程在用显卡 nvidia-smi -q | head -50

nvidia-smi正常输出应该是这样的:

+-----------------------------------------------------------------------------+ | NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 12.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 NVIDIA GeForce RTX 3060 Off | 00000000:01:00.0 On | N/A | | 30% 45C P8 18W / 170W | 156MiB / 12288MiB | 0% Default | +-------------------------------+----------------------+----------------------+

看到这个表,恭喜你,驱动装好了。

注意一个容易误读的地方:右上角那个CUDA Version: 12.2不是说你已经装了 CUDA 12.2,而是说这个驱动最高支持的 CUDA 运行时版本是 12.2。你实际装的 CUDA Toolkit 可能是 11.8,也可能是 12.4,两者不是一回事。这个误解太常见了,我在第 6 章还会再展开。

3.4 路线三完整操作:官方 runfile 手动安装

这条路麻烦,我按顺序写。

第一步,装依赖。

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

第二步,禁掉 nouveau。新建一个文件:

sudo tee /etc/modprobe.d/blacklist-nouveau.conf <<'EOF' blacklist nouveau options nouveau modeset=0 EOF # 更新 initramfs sudo update-initramfs -u

第三步,重启进文本模式。

sudo reboot # 重启后如果进了桌面,手动切 sudo systemctl isolate multi-user.target

或者开机时在 GRUB 里给内核参数加3,直接进 multi-user 模式。

第四步,确认 nouveau 真的没加载。这一步很关键,很多人跳过了:

lsmod | grep nouveau

如果还有输出,说明黑名单没生效,回去检查文件路径和 initramfs。必须确认没有输出,才能往下走。

第五步,运行安装程序。

chmod +x NVIDIA-Linux-x86_64-535.183.01.run sudo ./NVIDIA-Linux-x86_64-535.183.01.run

安装过程中会问你几个问题:

  • 是否注册 DKMS 模块:选 Yes。这样内核升级后模块会自动重编译,省很多事。选 No 的话,每次内核升级你都得手动重装一遍驱动。
  • 32 位兼容库:桌面用户建议装,服务器可以不装。
  • 是否更新 xorg.conf:一般选 No,让 Xorg 自动配置就行。只有多屏、需要固定分辨率的时候才手动配置。
  • 是否运行 nvidia-xconfig:同上,一般 No。

第六步,重启验证。

sudo reboot nvidia-smi

3.5 安装后的验证清单

装完别急着庆祝,按这几条过一遍,能提前发现大部分问题:

检查项命令期望结果
驱动是否加载lsmod | grep nvidia有 nvidia、nvidia_modeset 等
设备节点ls /dev/nvidia*nvidia0、nvidiactl、nvidia-uvm
驱动版本cat /proc/driver/nvidia/version与安装版本一致
工具是否可用nvidia-smi正常输出表格
图形加速glxinfo | grep "OpenGL renderer"显示 NVIDIA 显卡型号
内核日志dmesg | grep -i nvidia没有 error、failed 关键字

glxinfo需要mesa-utils包,没装的话先sudo apt install mesa-utils。如果它输出的是llvmpipe或者Intel,说明图形加速没有走 NVIDIA,这时候得查prime-select的状态。

4. 高频报错逐条排查手册

这一章是全文最实用的部分。我把这些年遇到最多的几个报错按出现频率排一下,逐条给排查思路。

4.1 nvidia-smi 通信失败

报错原文:nvidia-smi has failed because it couldn't communicate with the nvidia driver. Make sure that the latest NVIDIA driver is installed and running.

出现这个,说明nvidia-smi这个用户态工具能找到,但内核模块没加载上。按这个顺序排查:

第一,看模块有没有加载。

lsmod | grep nvidia

没输出说明内核模块压根没起来。接着看日志:

dmesg | grep -i nvidia | tail -30 sudo journalctl -k | grep -i nvidia | tail -30

常见的原因是内核版本和驱动不匹配,日志里会写version magic ... should be ...。这基本就是 DKMS 没跑或者跑失败了,手动触发一次:

sudo dkms status sudo dkms autoinstall

第二,看是不是内核升级引起的。如果你昨天还好好的,今天开机就不行了,先查内核版本:

uname -r ls /lib/modules/$(uname -r)/kernel/drivers/video/

大概率是新内核下没编译出 nvidia 模块。解决办法是进旧内核启动,或者装新内核对应的 headers 然后sudo apt install --reinstall nvidia-driver-535。

第三,看有没有被 nouveau 重新抢占。偶尔会有这种情况:

lsmod | grep nouveau

如果有,检查黑名单文件还在不在。

4.2 glxserver_nvidia 加载失败

报错原文:(EE) NVIDIA: Failed to load module "glxserver_nvidia" (module does not exist, 0)。

这个报错通常出现在 Xorg 日志里(/var/log/Xorg.0.log),表现为图形界面起不来或者退回软件渲染。根因一般有两个:一是驱动包没装全,nvidia-driver-XXX装了但libnvidia-gl-XXX缺了;二是残留的xorg.conf指向了旧的模块路径。

排查方式:

# 检查相关包 dpkg -l | grep nvidia # 看是否存在手工配置 ls -l /etc/X11/xorg.conf /etc/X11/xorg.conf.d/

如果/etc/X11/xorg.conf存在,而且不是你专门配的,直接删掉或者重命名:

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

然后重启图形界面或者直接重启。这一招解决过我至少三次同类问题。

4.3 黑屏、循环登录、分辨率错乱

这三个症状表现不同,根因经常是同一个——驱动和显示管理器打架。

黑屏:屏幕完全没信号,或者卡在启动画面。这时候切到 TTY(Ctrl+Alt+F3),如果能进去,说明系统活着,只是图形界面起不来。

循环登录:输入密码后又弹回登录界面。这是最典型的一种,通常是 Wayland 和 NVIDIA 驱动不兼容导致的。

针对循环登录,我的处理办法是临时切到 Xorg 会话:

sudo nano /etc/gdm3/custom.conf # 取消注释这一行 # WaylandEnable=false

保存后sudo systemctl restart gdm3。老一点的驱动在 Wayland 下确实容易出问题,切到 Xorg 立刻就稳了。新驱动(535 以后)在 Wayland 下已经好很多,但如果你想少折腾,Xorg 依然是更保险的选择。

分辨率错乱:只能显示 800x600 或者 1024x768,说明显卡驱动没接管显示输出。检查glxinfo和nvidia-smi,如果是 nouveau 在跑,那还是驱动没装上。

还有一个隐藏杀手是nomodeset参数。如果你之前为了救系统在 GRUB 里加了nomodeset,装完驱动之后一定要把它去掉,否则它会阻止 NVIDIA 驱动接管模式设置。

sudo nano /etc/default/grub # 从 GRUB_CMDLINE_LINUX_DEFAULT 里删掉 nomodeset sudo update-grub

4.4 Secure Boot 与模块签名

现在的电脑默认开着 Secure Boot,这会阻止未签名的内核模块加载,NVIDIA 驱动就是未签名的。表现是nvidia-smi报同样的通信失败,但dmesg里会明确写:

Loading of module with unavailable key is rejected module verification failed: signature and/or required key missing

两个解法。

解法一:注册 MOK(推荐)。apt 安装驱动时会问你要一个密码,重启后出现蓝色界面,选Enroll MOK,输入那个密码,然后重启。这样模块就会被信任。

如果当时没设密码,可以手动补:

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der # 会提示设置一个一次性密码,记住它 sudo reboot

解法二:关掉 Secure Boot。进 BIOS/UEFI 设置,把 Secure Boot 设为 Disabled。这招最省事,但如果你有双系统跑 Windows 11,关掉可能影响某些功能,自己权衡。

注意:如果你的机器是企业统一管理的,BIOS 密码可能不在你手上,这种情况优先用 MOK 注册,别去动 BIOS。

4.5 报错速查表

报错关键词最可能原因首选处理
could not communicate with the nvidia driver模块未加载lsmod、dkms status、重装
Failed to load module "glxserver_nvidia"包不全或残留 xorg.conf删 xorg.conf、补装 gl 包
version magic should be内核与模块不匹配dkms autoinstall
module verification failedSecure Boot 未签名MOK 注册或关 SB
No devices were found设备未识别查 BIOS 是否禁用独显
unknown error / initialization failed驱动与卡不兼容换版本重装
Unable to find the kernel source tree缺 headers装linux-headers-$(uname -r)
NVRM: API mismatch用户态库和内核模块版本不一致apt purge后重装

表格里最后一条特别值得说。API mismatch 通常是你先手动装了一次 runfile,后来又用 apt 装了一次,两套文件混在一起。这种时候唯一的办法是彻底清理,不能指望覆盖安装。

5. 驱动卸载、版本切换与内核更新后的维护

装好不是终点,后面还有维护。这一章讲的就是「装完以后的日子」。

5.1 干净卸载的两种做法

apt 装的,用 apt 卸:

# 先看看装了哪些 dpkg -l | grep -i nvidia # 全部清掉,注意 purge 会连配置一起删 sudo apt purge nvidia-* libnvidia-* # 清理依赖 sudo apt autoremove # 更新 initramfs sudo update-initramfs -u

apt purge和apt remove的区别要搞清楚:remove保留配置文件,purge连配置文件一起删。驱动这种强耦合的东西,我建议直接purge,别留尾巴。

runfile 装的,用官方卸载程序:

sudo /usr/bin/nvidia-uninstall

如果这个脚本找不到,说明安装时没生成,那就手动清:

sudo rm -rf /usr/lib/modules/$(uname -r)/kernel/drivers/video/nvidia* sudo rm -rf /usr/lib/x86_64-linux-gnu/libnvidia* sudo update-initramfs -u

手动清有风险,容易删多或者删漏,所以我一再强调:能用 apt 就用 apt。

5.2 版本升降级与双显卡切换

降级是常见需求,新驱动有时候会有兼容性问题。做法是先卸再装:

sudo apt purge nvidia-* sudo apt install nvidia-driver-470 sudo reboot

不要试图直接覆盖安装,两套文件混着很容易出 API mismatch。

双显卡切换用prime-select:

prime-select query # 看当前 sudo prime-select nvidia # 独显模式 sudo prime-select intel # 核显模式 sudo prime-select on-demand # 按需切换

on-demand模式下,程序默认跑核显,想要用独显得显式指定:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep "OpenGL renderer"

如果输出的渲染器是 NVIDIA,说明离屏渲染配置生效了。这条命令我在调试笔记本外接显示器的时候用得特别多。

5.3 内核更新后驱动失效的补救

Ubuntu 的安全更新会升级内核,升级后重启,如果 DKMS 正常工作,模块会自动重建,你什么都不用做。但如果 DKMS 出问题,就会开机进不了图形界面。

判断方法:

dkms status

正常输出应该是nvidia/535.183.01, 5.15.0-91-generic, x86_64: installed。如果显示built但没有installed,或者干脆没有你这个内核版本,就是 DKMS 没跑成功。

补救:

# 装新内核的 headers sudo apt install linux-headers-$(uname -r) # 手动触发 sudo dkms autoinstall # 确认 dkms status lsmod | grep nvidia

为了防止这种情况,我的习惯是:设置 apt 不自动升级内核,或者至少在升级前看一眼会不会动内核。

# 查看可升级的包 apt list --upgradable | grep linux

另外,保留一个旧内核也是好习惯,万一新内核起不来,在 GRUB 的「Advanced options」里选旧内核进去,把驱动修好再重启。默认情况下 Ubuntu 会保留几个旧内核,别手贱全删了。

6. 进阶衔接:CUDA、ffmpeg 硬编解与容器环境

驱动只是地基,上面还要盖房子。这一章讲讲装完驱动之后常见的三个延伸场景。

6.1 nvidia-smi 里的 CUDA Version 到底是什么意思

再强调一遍,nvidia-smi右上角显示的CUDA Version是驱动支持的最高 CUDA 运行时版本,不是你装的 CUDA Toolkit 版本。这两个数字经常被人搞混,然后在装 PyTorch 的时候选错版本。

正确的关系是这样的:

  • 驱动版本决定了一个上限,比如 535 支持到 CUDA 12.2。
  • 你安装的 CUDA Toolkit 可以是 11.8、12.0、12.1、12.2 中任意一个,只要不超过上限。
  • 实际运行时用的是 Toolkit 里的版本。

查实际安装的版本:

nvcc --version

如果提示nvcc: command not found,说明你没装 CUDA Toolkit,只装了驱动,这是正常的状态。

装 CUDA Toolkit 的时候有个坑:官方安装包里会问你要不要装驱动,一定选No。你已经装好驱动了,让它再装一遍,很可能把现有驱动覆盖成另一个版本,然后就是一堆 API mismatch。

6.2 ffmpeg 调用 NVENC/NVDEC

装完驱动之后,ffmpeg如果编译时开启了 NVENC 支持,就能用显卡做视频转码,速度比 CPU 快几倍到几十倍。

先确认支持:

ffmpeg -hide_banner -hwaccels ffmpeg -hide_banner -encoders | grep nvenc

如果hwaccels里没有cuda,或者encoders里没有h264_nvenc,说明你装的 ffmpeg 是发行版仓库里的精简版,需要换一个带 NVENC 支持的构建。Ubuntu 仓库的 ffmpeg 有时候确实不带,这时候可以考虑官方静态构建或者自己编译。

用 NVENC 转码的命令大概是这样:

ffmpeg -hwaccel cuda -i input.mp4 \ -c:v h264_nvenc -preset p4 -b:v 5M \ -c:a copy output.mp4

-hwaccel cuda是解码加速,h264_nvenc是编码器,-preset p4是速度与质量的平衡点,数字越大越慢质量越好。实测在 RTX 3060 上转一个 1080p 的十分钟视频,CPU 软编要五六分钟,NVENC 只要二十几秒,差距非常直观。

注意:NVENC 并发会话数是有限制的,消费级卡一般是 3 到 8 路,具体看型号和驱动版本。而且这个限制不是靠软件绕过去的,硬要绕需要改驱动,我不建议在正式环境这么干。

6.3 虚拟机与容器场景的注意点

虚拟机里装 Ubuntu 跑 NVIDIA 驱动,需要先在宿主机上把显卡直通(PCI Passthrough)配好,同时 BIOS 要开 VT-d/IOMMU、CPU 要支持虚拟化直通。如果只是普通虚拟机,没有直通,那 Ubuntu 里看到的是虚拟显卡,lspci根本找不到 NVIDIA 设备,装驱动自然也无从谈起。所以如果你在 VMware 或 VirtualBox 里折腾,先确认有没有做直通。

容器场景下,现在主流是用 NVIDIA Container Toolkit。装好之后,运行容器时加--gpus all就能在容器里用显卡:

docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

容器里的nvidia-smi显示的驱动版本跟宿主机一致,因为容器直接复用了宿主机的驱动,这也是为什么容器里不需要单独装驱动。

7. 一些踩坑记录和我的使用习惯

最后聊聊我这些年攒下来的几个习惯,都是被坑出来的。

第一,装驱动之前一定先查内核版本和显卡型号。我刚开始的时候图快,上来就apt install nvidia-driver-535,结果机器是 GTX 750,装完直接黑屏。后来才知道 750 得用 470。五秒钟的lspci能省你两小时的抢救时间。

第二,能不用 runfile 就不用。我手上有一台工作站,当年为了追新驱动用了 runfile 安装,后来每次内核升级都要手动重装一次,忘了就是黑屏。换成 apt 之后,两年没出过事。DKMS 这个机制真的省心,前提是你得走包管理。

第三,装完立刻做一次完整验证。不要只跑nvidia-smi就完事,glxinfo、/dev/nvidia*、dmesg都要看一眼。有一次我nvidia-smi正常,但glxinfo显示的是 llvmpipe,跑图形程序特别卡,查了半天才发现是 prime-select 没切。

第四,笔记本用户记得配 on-demand。一直用独显模式,电池续航会掉一半以上,风扇也吵。prime-select on-demand配合__NV_PRIME_RENDER_OFFLOAD环境变量,日常用核显、跑训练用独显,这是笔记本最舒服的姿势。

第五,出问题先切 TTY,别急着重装系统。绝大多数驱动问题都能在 TTY 里修好,dmesg和/var/log/Xorg.0.log里通常写得明明白白。养成看日志的习惯,比在论坛上发帖等回复快得多。

我个人的感觉是,Ubuntu 装 NVIDIA 驱动这件事,难点从来不在命令本身,而在「知道自己在哪一步、知道出错时该看哪里」。把 nouveau 和官方驱动的区别搞清楚,把三条路线的适用场景记牢,把 dmesg 和 Xorg 日志养成习惯,剩下的就是重复劳动了。等你把这套流程走顺,以后帮同事装十台机器也就是半小时的事。

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

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

立即咨询