NVIDIA 显卡驱动在 Ubuntu 下的安装,最麻烦的往往不是安装这一步,而是装完以后nvidia-smi仍然报错、nouveau 和官方驱动互相干扰、CUDA 版本和驱动版本对不上。下面的内容直接进入实践:先梳理驱动、CUDA、容器运行时之间的关系,再按禁用 nouveau、安装驱动、验证nvidia-smi、配置 CUDA、打通 Docker GPU 的顺序完成一个可复现的 NVIDIA 环境。文章末尾会单独列出 Windows 端 NVIDIA App 和控制面板的常见问题排查,以及在真实项目中值得维护的验收清单。命令和输出示例用于说明思路,实际版本以生产环境为准。
1. 先弄清楚驱动、CUDA、nvidia-smi 和容器运行时之间的关系
1.1 这几个名词不是同一层东西
普通用户很容易把“NVIDIA 驱动”和“CUDA”当成同一个东西,实际上它们负责的层级完全不同。
NVIDIA 驱动负责让操作系统识别 GPU,并提供底层的设备访问能力。CUDA Toolkit 负责提供编译器、运行时库和数学库,让 CUDA 程序能够在 GPU 上执行。nvidia-smi是驱动自带的系统管理工具,它能不能正常显示 GPU 状态,反映的是驱动层是否正常,而不是 CUDA Toolkit 是否安装。
容器运行时里还有一层nvidia-container-toolkit,它负责把宿主机的 GPU 设备和驱动库暴露给 Docker 容器。容器本身不需要重复安装驱动,但宿主机必须已经有一套正常工作的 NVIDIA 驱动。
| 组件 | 作用 | 来源 | 常用验证命令 |
|---|---|---|---|
| NVIDIA Driver | 加载内核模块,提供 GPU 设备访问 | 系统仓库或官方 runfile | nvidia-smi |
| CUDA Toolkit | 编译和运行 CUDA 程序 | NVIDIA 官方仓库或 runfile | nvcc -V |
| cuDNN | 深度网络算子库,依赖 CUDA | NVIDIA 官方 deb/tar | 程序运行结果 |
| NVIDIA Container Toolkit | 让容器访问宿主机 GPU | NVIDIA 官方 apt 源 | docker run --gpus all nvidia-smi |
1.2 驱动加载链路决定了 nvidia-smi 的报错方式
Linux 下 NVIDIA 官方驱动不是单个可执行文件,而是一组内核模块。核心模块是nvidia,负责 GPU 与内核之间的通信;nvidia_modeset负责显示输出;nvidia_drm负责 DRM 接入;nvidia_uvm负责 Unified Virtual Memory 相关功能。
系统启动时,内核加载这些模块,用户态的libcuda.so再与内核模块通信。nvidia-smi报出couldn't communicate with the NVIDIA driver时,问题通常不在nvidia-smi命令本身,而在于内核模块没有加载、被 Secure Boot 拦截,或者驱动的内核模块版本和当前内核不匹配。
所以安装 NVIDIA 环境时,第一步不是急着下载驱动,而是先理解驱动模块是否真正进入了内核。后面的所有排查都围绕这条链路展开。
2. 安装前先做环境检查,确认该换驱动还是该修驱动
2.1 先确认 GPU、系统版本和 Secure Boot 状态
安装驱动之前,先收集几项基本信息,避免装到一半才发现硬件不识别或内核不匹配。
uname -a cat /etc/os-release lspci | grep -i nvidia lspci -nnk | grep -i "VGA\|3D" mokutil --sb-statelspci | grep -i nvidia用于确认系统是否能看到 NVIDIA 显卡。如果没有输出,先检查 BIOS 是否禁用了独立显卡,或者 PCIe 接口是否正常。mokutil --sb-state用来确认 Secure Boot 是否开启,因为 Secure Boot 会直接影响内核模块是否能被加载。
2.2 判断当前驱动状态是“没装”还是“装坏了”
执行nvidia-smi之前,要预先判断三种常见状态:
nvidia-smi: command not found:通常表示驱动没有安装,或者/usr/bin路径里没有这个命令。NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver:表示nvidia-smi存在,但用户态无法与内核模块通信。- 正常输出 GPU 型号、驱动版本、显存和 CUDA Version:表示驱动已经生效。
执行完nvidia-smi后,再用lsmod | grep nvidia确认模块加载情况。如果nvidia模块出现在列表里,说明驱动已经被内核加载;如果完全没有输出,说明模块没有被加载。
2.3 选择驱动安装方式,不要盲目追求最新版
Ubuntu 下安装 NVIDIA 驱动主要有三种方式,各自适用场景不同。
| 安装方式 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
ubuntu-drivers autoinstall | 自动选择推荐驱动 | 不一定是最新版本 | 不折腾、日常开发 |
apt install nvidia-driver-XXX | 稳定、依赖管理完整 | 需要手动选择版本号 | 明确知道版本需求 |
| NVIDIA 官方 runfile | 版本最新、可定制参数 | 内核更新后需要重新处理 | 新显卡或特殊场景 |
对大多数 Ubuntu 用户来说,优先用ubuntu-drivers autoinstall或者apt安装驱动。runfile 更适合需要特定新版驱动、并且有能力处理 DKMS 和 Secure Boot 的场景。
2.4 内核头文件和 DKMS 是安装前的必选项
驱动模块要编译进当前内核,必须保证内核头文件存在。缺少头文件时,驱动虽然能装上,但内核一升级就可能失效,之后就会随机触发nvidia-smi通信失败。
sudo apt update sudo apt install linux-headers-$(uname -r) dkms build-essentialDKMS 的作用是让驱动模块跟随内核版本自动重新编译。安装完驱动后,如果内核从6.5.0-25升级到6.5.0-27,DKMS 会在新内核环境下重新编译nvidia模块,避免每次升级内核后都要手动重装驱动。
3. 标准安装流程:先禁用 nouveau,再安装官方驱动
3.1 为什么必须禁用 nouveau
Ubuntu 自带的 nouveau 是 NVIDIA 的开源驱动。它虽然能点亮屏幕,但在新 GPU 上的支持不完整,而且与 NVIDIA 官方驱动存在设备节点和内核模块冲突。如果不把 nouveau 加入黑名单,安装官方驱动后经常出现模块加载优先级错乱。
3.2 创建 nouveau 黑名单并更新 initramfs
创建黑名单文件后,必须执行update-initramfs -u,否则重启时 initramfs 里仍然可能保留 nouveau 模块。
sudo bash -c 'echo "blacklist nouveau" > /etc/modprobe.d/blacklist-nouveau.conf' sudo bash -c 'echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf' sudo update-initramfs -u sudo reboot重启后验证:
lsmod | grep nouveau正常情况下没有任何输出。如果仍能看到 nouveau,说明黑名单没有真正生效,需要检查/etc/modprobe.d/下的配置是否被其他文件覆盖。
3.3 通过 apt 安装官方驱动
先枚举仓库里可用的驱动版本,再安装。
ubuntu-drivers devices apt-cache search nvidia-driver如果希望系统自动选择推荐驱动:
sudo ubuntu-drivers autoinstall如果已经明确知道版本号,比如需要nvidia-driver-550,可以直接安装:
sudo apt install nvidia-driver-550 sudo reboot版本号不要照搬,先看ubuntu-drivers devices输出的推荐版本。
3.4 使用 runfile 安装时的注意事项
runfile 安装适合仓库里没有对应驱动版本的情况。基本流程是关闭图形界面、执行安装器、再重启。
cd /tmp chmod +x NVIDIA-Linux-x86_64-550.54.15.run sudo systemctl isolate multi-user.target sudo ./NVIDIA-Linux-x86_64-550.54.15.run sudo reboot执行systemctl isolate multi-user.target会退出图形界面,操作前要先保存工作。安装器会询问是否注册 DKMS,建议选择 yes。如果系统开启了 Secure Boot,还要完成模块签名,否则重启后nvidia模块无法加载。
3.5 安装后验证驱动状态
正常安装后,nvidia-smi会输出类似下面的内容。
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Tesla T4 On | 00000000:00:1E.0 Off | 0 | |-------------------------------+----------------------+----------------------+看到这一行内容,说明驱动模块已经正常工作。右上角的CUDA Version: 12.4只代表驱动支持的最高 CUDA 版本,不代表系统已经安装了 CUDA Toolkit。会不会有nvcc,需要另外验证。
4. nvidia-smi 报 cannot communicate with NVIDIA driver 的排查链路
4.1 先判断是命令不存在、模块未加载还是设备不识别
nvidia-smi报错时,不要立刻重装系统。先按现象分类。
| 现象 | 常见原因 | 第一步检查 |
|---|---|---|
nvidia-smi: command not found | 驱动未安装或 PATH 异常 | `dpkg -l |
couldn't communicate with the NVIDIA driver | 内核模块未加载或版本不匹配 | dmesg、lsmod |
No devices were found | GPU 未识别或驱动太旧 | lspci -nnk |
| 安装驱动后重启无显示 | Secure Boot 或显示管理器冲突 | mokutil --sb-state |
4.2 按顺序执行排查命令
出现 `couldn't communicate