三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ubuntu系统NVIDIA驱动安装与CUDA环境配置全攻略

Ubuntu系统NVIDIA驱动安装与CUDA环境配置全攻略

1. 从“nvidia-smi has failed”说起:为什么Ubuntu装驱动是个技术活

如果你刚给Ubuntu装好系统,兴冲冲地打开终端敲下nvidia-smi,准备看看显卡的“身份证”,结果屏幕上弹出一行冰冷的错误:“NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver”,那一刻的心情,大概就像新车刚提回来发现发动机打不着火一样。这个报错,几乎是所有Linux用户与NVIDIA显卡“初次见面”时的标准问候语,它直白地告诉你:系统和你的显卡硬件之间,还缺一个关键的“翻译官”——NVIDIA驱动。

Ubuntu,作为最流行的Linux桌面发行版之一,以其易用性著称。但恰恰是在驱动管理上,它和闭源的NVIDIA驱动之间存在着一种微妙的“相爱相杀”关系。Ubuntu默认使用的是开源显卡驱动nouveau,它能让你的显卡亮起来,显示桌面,但对于需要调用CUDA进行深度学习、AI计算、3D渲染或者仅仅是想要发挥显卡全部游戏性能的用户来说,nouveau就力不从心了。你必须手动换上“原厂”的NVIDIA专有驱动。这个过程,远不像在Windows上点几下“下一步”那么简单,它涉及到禁用开源驱动、处理内核模块签名、应对不同内核版本的兼容性,甚至可能因为一个不当操作导致系统无法进入图形界面(也就是传说中的“黑屏”或“卡在登录循环”)。

所以,这篇内容不是一份简单的命令清单。我会结合我这些年反复在Ubuntu 18.04、20.04、22.04乃至最新的24.04 LTS上安装驱动的经验,把其中的门道、常见的坑以及背后的原理掰开揉碎了讲清楚。我们的目标不仅仅是让nvidia-smi命令跑起来,更是要让你理解每一步在做什么,以及当事情不按预期发展时,你知道该从哪里着手排查。无论你是为了跑TensorFlow/PyTorch,用DaVinci Resolve做视频剪辑,还是单纯想用Steam玩个游戏,一个稳定、正确的NVIDIA驱动都是基石。

2. 战前准备:理清思路与关键信息侦察

在动手敲任何命令之前,花十分钟做好准备工作,能避免后面百分之九十的麻烦。安装驱动不是闭着眼睛执行教程,它需要根据你的具体硬件和系统环境来定制方案。

2.1 明确你的显卡型号与系统架构

这是最基础,也最容易出错的一步。你需要两个关键信息:

  1. 显卡型号:你用的是哪一款NVIDIA显卡?是消费级的GeForce RTX 4090/4080,还是专业级的Quadro RTX 6000,或者是嵌入式的Jetson系列?型号决定了你应该选择哪个版本的驱动分支(比如长期支持版-longlived、生产就绪版-production,或者最新的-new-feature分支)。
  2. 系统架构与内核版本:打开终端,运行以下命令:
    uname -m
    这会输出你的系统架构,最常见的是x86_64(即64位系统)。接着运行:
    uname -r
    这会显示你当前正在运行的内核版本,例如6.8.0-31-generic。NVIDIA驱动是以内核模块(.ko文件)的形式加载的,它必须针对你当前运行的内核进行编译。如果你更新了内核但没有重装驱动,就会导致驱动模块与内核不匹配,从而引发各种问题。

2.2 选择驱动安装方法:PPA、Runfile还是预编译包?

Ubuntu下主要有三种安装NVIDIA驱动的方法,各有优劣:

  • 方法一:使用Ubuntu附加驱动工具(最简便,但可能不是最新)在“软件和更新” -> “附加驱动”选项卡中,系统会自动检测可用的NVIDIA驱动版本并列表。你只需点选一个,点击“应用更改”,系统会自动处理安装。优点是极其简单,与系统集成度最高。缺点是版本更新往往滞后于NVIDIA官网,对于需要特定版本(如匹配某版本CUDA)的用户来说可能不够用。

  • 方法二:添加Graphics Drivers PPA并安装(推荐给大多数桌面用户)这是社区维护的第三方仓库,提供了较新且经过一定测试的驱动版本。通过命令行添加PPA源后,用apt安装。优点是版本较新,依然通过包管理器管理,安装卸载方便,能跟随系统更新。缺点是依赖第三方仓库的维护。

  • 方法三:从NVIDIA官网下载.run文件手动安装(最灵活,也最复杂)直接从NVIDIA官网下载对应你显卡型号和系统架构的.run安装文件,在命令行下运行。优点是能安装绝对最新的驱动,甚至测试版;可以自定义安装选项(如不安装OpenGL库,这在双显卡笔记本上很重要)。缺点是过程完全手动,需要关闭图形界面,卸载旧驱动,且后续系统内核更新后,可能需要手动重新关联驱动模块。

我的经验建议:对于绝大多数桌面用户,尤其是新手,优先考虑方法二(PPA)。它在易用性和版本新鲜度之间取得了很好的平衡。只有当PPA中的版本无法满足你的特定需求(比如必须安装官网某个特定版本以兼容专业软件),或者你遇到了非常棘手的兼容性问题时,再考虑方法三。方法一适合对版本无要求、追求极致稳定的用户。

2.3 重要数据备份与恢复模式确认

在开始前,请确保你的重要文件已经备份。虽然安装失败导致数据丢失的概率极低,但导致图形界面无法进入的情况却很常见。因此,你需要知道如何进入文本模式(TTY)恢复模式(Recovery Mode)来修复系统。

  • 进入TTY:在图形界面下,按下Ctrl + Alt + F3(F3到F6通常都可以)可以切换到纯文本终端。按下Ctrl + Alt + F2Ctrl + Alt + F1(取决于你的桌面环境)可以切换回图形界面。如果驱动安装导致图形界面崩溃,TTY就是你救命的命令行窗口。
  • 进入恢复模式:在开机GRUB引导菜单时(如果没看到,开机时按住Shift键),选择“Advanced options for Ubuntu”,然后选择一个内核版本后面带有“(recovery mode)”的选项。在恢复模式菜单中,你可以选择“root”进入一个具有root权限的终端,进行故障修复。

知道这两条退路,你就能放心大胆地进行后续操作了。

3. 实战PPA安装法:一步步搞定驱动

这里我们以目前最流行的方法二(PPA)为例,进行详细演示。假设我们的环境是Ubuntu 22.04 LTS。

3.1 彻底禁用令人头疼的Nouveau驱动

Nouveau是开源驱动,但它和NVIDIA官方驱动是互斥的。不先禁用它,安装时很可能冲突。禁用需要两个步骤:

  1. 创建黑名单配置文件

    sudo nano /etc/modprobe.d/blacklist-nouveau.conf

    在打开的文件中,输入以下内容:

    blacklist nouveau options nouveau modeset=0

    第一行是将nouveau加入黑名单,阻止其加载。第二行是禁用它的内核模式设置功能。输入完成后,按Ctrl + O保存,再按Ctrl + X退出nano编辑器。

  2. 更新初始RAM文件系统并重启

    sudo update-initramfs -u sudo reboot

    update-initramfs -u命令非常重要,它会让系统在下次启动时,初始的内存盘镜像就不再包含nouveau模块。不执行这一步,黑名单可能不生效。

重启后,你可以验证nouveau是否被禁用:

lsmod | grep nouveau

如果没有任何输出,说明禁用成功。如果还有输出,请检查上述步骤,尤其是是否执行了update-initramfs

3.2 添加PPA仓库并安装驱动

重启进入系统后(此时可能因为没驱动而使用低分辨率的基本显示模式,没关系),打开终端。

  1. 添加Graphics Drivers PPA

    sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update

    add-apt-repository命令会添加第三方软件源,apt update是刷新本地软件包列表。

  2. 查找可用的驱动版本

    apt list nvidia-driver-*

    你会看到一个列表,例如nvidia-driver-550nvidia-driver-535nvidia-driver-525等。数字越大,通常版本越新。你可以去NVIDIA官网查看不同驱动版本号对应的具体发布版本。对于大多数用户,选择版本号最高的稳定版即可。例如,当前(以知识截止日期2024年7月为例)nvidia-driver-550可能是一个较新的选择。

  3. 安装选定的驱动

    sudo apt install nvidia-driver-550

    这里将550替换成你选择的版本号。apt会自动处理所有依赖,包括nvidia-utils-550libnvidia-*等一系列包。

  4. 再次重启

    sudo reboot

    重启是为了让系统加载新安装的NVIDIA内核模块。

3.3 安装后的验证与基本检查

重启后,你应该能正常进入图形界面,并且分辨率可能已经恢复正常。现在进行关键验证:

  1. 运行nvidia-smi

    nvidia-smi

    这是最关键的检查点。如果安装成功,你会看到一个表格,显示你的显卡型号、驱动版本、GPU利用率、温度、显存使用情况等信息。驱动版本号会明确显示,例如Driver Version: 550.54.15

  2. 检查图形界面是否使用了NVIDIA驱动: 打开“系统设置”或“关于”,查看图形/显示信息。或者在终端安装一个小工具:

    sudo apt install inxi inxi -G

    inxi -G的输出会明确显示当前正在使用的显卡和驱动,例如“Device-1: NVIDIA GA104 [GeForce RTX 3070] driver: nvidia v: 550.54.15”。

  3. 检查NVIDIA X Server设置: 在应用程序菜单里搜索“NVIDIA X Server Settings”并打开。如果能正常打开并显示显卡信息和控制选项,说明驱动和图形服务器(X.Org)的集成也是成功的。

如果以上检查都通过,那么恭喜你,驱动已经成功安装并运行了。

4. 手动安装.run文件:应对特殊需求的终极手段

当PPA仓库的版本无法满足你,或者你需要在没有网络的环境下安装时,手动安装.run文件是必须掌握的技能。这个过程更底层,也更能让你理解驱动安装的机制。

4.1 下载正确的驱动安装包

首先,访问NVIDIA官方驱动下载页面。选择你的产品类型(如GeForce)、产品系列、具体产品型号、操作系统(Linux 64-bit)和语言。最关键的是下载类型,这里选择“Linux 64-bit.run文件”。点击搜索后下载,你会得到一个类似NVIDIA-Linux-x86_64-550.54.15.run的文件。

注意:强烈建议将下载的.run文件放在你的用户主目录(~/)下,并且路径中不要有中文或空格,这可以避免很多不必要的权限和解析错误。

4.2 进入纯文本模式并关闭显示管理器

.run文件的安装必须在没有图形界面运行的环境下进行,因为安装过程会替换与图形系统相关的核心库。

  1. 切换到TTY:按下Ctrl + Alt + F3切换到第三个文本终端。你需要在这里登录你的用户账户。
  2. 停止显示管理器:显示管理器(Display Manager)是图形登录界面的服务,常见的有GDM(GNOME)、LightDM、SDDM等。你需要停止它来释放图形系统。
    • 对于使用GDM的Ubuntu GNOME版本:
      sudo systemctl stop gdm
    • 对于使用LightDM的Ubuntu版本:
      sudo systemctl stop lightdm
    停止后,当前的图形界面会话会结束,你所在的TTY会保持活动。如果不知道用的是哪个,可以尝试sudo systemctl stop gdm,如果报错说服务未找到,再试lightdm

4.3 卸载旧驱动并运行安装程序

在运行安装程序前,最好先清理系统中可能存在的旧版NVIDIA驱动。

# 如果之前用apt安装过,尝试卸载 sudo apt purge *nvidia* # 如果之前用.run文件安装过,使用其自带的卸载功能(假设旧.run文件还在) # sudo /path/to/old-nvidia-driver.run --uninstall

然后,给.run文件添加执行权限并运行:

cd ~ chmod +x NVIDIA-Linux-x86_64-*.run sudo ./NVIDIA-Linux-x86_64-*.run

这时,安装程序会启动。你会遇到几个重要的交互选项:

  • 预安装脚本失败:安装程序可能会警告“The distribution-provided pre-install script failed”。这通常是正常情况,直接选择“Continue installation”继续。
  • 注册DKMS:强烈建议选择“Yes”来注册DKMS(Dynamic Kernel Module Support)。这意味着以后当你更新系统内核时,DKMS会自动为新的内核重新编译NVIDIA内核模块,省去手动重装的麻烦。
  • 安装32位兼容库:除非你确定不需要运行任何32位的应用程序(有些老游戏或专业软件可能需要),否则建议选择“Yes”。
  • 运行nvidia-xconfig:这个工具会自动帮你配置X.Org的配置文件。对于大多数单显卡系统,可以选择“Yes”。但对于双显卡笔记本(如Intel集成显卡+NVIDIA独立显卡)用户,这里必须选择“No”。因为双显卡的配置更为复杂,通常需要依靠像prime-select这样的工具来切换,让安装程序自动配置X.Org很容易导致无法进入图形界面。

安装过程会编译内核模块,这需要一些时间。完成后,重启系统:

sudo reboot

4.4 双显卡笔记本的特例:Prime与Offload模式

如果你用的是带有Intel/NVIDIA双显卡的笔记本,安装驱动后还需要额外配置才能正确使用独立显卡。Ubuntu通常使用prime-select工具来管理。

  1. 安装相关工具

    sudo apt install nvidia-prime
  2. 查看和切换模式

    # 查看当前模式 prime-select query # 切换到Intel集成显卡(省电) sudo prime-select intel # 切换到NVIDIA独立显卡(性能) sudo prime-select nvidia # 切换到按需加载模式(推荐),平时用集显,需要时调用独显 sudo prime-select on-demand

    每次切换后都需要注销并重新登录才能生效。

    在“按需加载”模式下,你可以通过环境变量__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia来启动特定程序,使其运行在NVIDIA显卡上。例如:

    __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep “OpenGL renderer”

    这会显示当前glxinfo命令是由NVIDIA显卡渲染的。

5. 安装后的深度调优与问题排查

驱动装上了,nvidia-smi能跑了,这仅仅是开始。要让它在生产环境(如AI开发、渲染农场)中稳定高效地工作,还需要一些调优和知道如何排查深层次问题。

5.1 持久化模式与计算应用优化

对于服务器或长期运行计算任务的机器,建议启用持久化模式(Persistence Mode)。GPU在无任务时,会频繁进入和退出低功耗状态,这个过程会产生微小的延迟和能耗。持久化模式让GPU内核驱动始终保持加载状态,对于需要快速响应计算请求的场景(如频繁调用的推理服务)有益。

# 启用持久化模式 sudo nvidia-smi -pm 1 # 禁用持久化模式 sudo nvidia-smi -pm 0 # 查看当前状态 sudo nvidia-smi -q | grep “Persistence Mode”

启用后,nvidia-smi显示的“Persistence-M”字段会从“Disabled”变为“Enabled”。需要注意的是,这会稍微增加空闲时的功耗。

5.2 内核更新后的驱动维护:DKMS是关键

这是很多人在系统常规更新后遇到的经典问题:某天系统自动更新了内核,重启后图形界面没了,或者nvidia-smi又报错了。其根本原因是:新内核需要对应版本的NVIDIA内核模块,而旧的模块是为旧内核编译的。

解决方案就藏在安装方式里

  • 如果你通过PPA的apt方式安装,并且安装的驱动包名是nvidia-driver-5xx,那么它通常已经包含了DKMS包。当系统安装新内核时,apt在配置linux-image-xxx包的过程中,会触发DKMS自动为新的内核头文件编译NVIDIA模块。这个过程是自动的,你通常无需干预。
  • 如果你通过手动.run文件安装,并且在安装时选择了注册DKMS,那么效果同上,也是自动的。
  • 只有当你手动安装.run文件且没有选择DKMS,或者DKMS编译失败时,才需要手动处理。

如何手动处理DKMS问题?首先检查DKMS状态:

sudo dkms status

你应该能看到类似nvidia, 550.54.15, 6.8.0-31-generic, x86_64: installed的条目,表示对应内核版本的模块已安装。

如果在新内核下没有“installed”状态,可以尝试手动为当前内核编译安装:

sudo dkms install nvidia/550.54.15

(请将550.54.15替换为你的实际驱动版本号,可以通过dkms status查看)。

如果连DKMS记录都没有,那可能需要用.run文件重新安装,并务必确保选中DKMS选项。

5.3 常见报错与“黑屏”救砖指南

即使按照步骤操作,也可能遇到问题。这里分析几个高频报错:

  • “NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver”

    • 可能原因1:驱动未正确安装或加载。用lsmod | grep nvidia检查nvidianvidia_uvmnvidia_drm等模块是否加载。如果没加载,尝试sudo modprobe nvidia。如果失败,查看内核日志dmesg | grep nvidia看具体错误。
    • 可能原因2:内核版本不匹配。这是最常见的原因,尤其是系统更新后。按照上面5.2节的方法检查和处理DKMS。
    • 可能原因3:Secure Boot启用。某些UEFI系统启用了安全启动,会阻止未签名的内核模块加载。要么在BIOS中关闭Secure Boot,要么为NVIDIA模块签名(过程较复杂)。
  • “Failed to initialize NVML: Driver/library version mismatch”

    • 这个错误明确指出了用户态驱动库(通过apt.run安装的libnvidia-*等)和内核态驱动模块(nvidia.ko)版本不一致。这通常发生在你部分升级了驱动(比如用apt upgrade更新了用户态库),但内核模块没有随之更新。最彻底的解决办法是重启系统,让系统尝试加载匹配的模块。如果重启无效,尝试完全重装驱动:sudo apt purge *nvidia*然后重新安装。
  • 安装后重启黑屏/卡在Ubuntu Logo/循环登录

    • 这是最令人头疼的情况,通常与图形服务器(X.Org或Wayland)的配置有关。
    • 第一步:尝试进入恢复模式或TTY(开机时按Shift进GRUB,选恢复模式;或卡住时按Ctrl+Alt+F3)。
    • 第二步:检查显示管理器状态。在TTY中,尝试重启显示管理器:sudo systemctl restart gdm(或lightdm)。
    • 第三步:查看X.Org日志。日志文件通常在/var/log/Xorg.0.log。用catless查看,搜索关键词“EE”(Error)和“WW”(Warning),特别是与“nvidia”, “GLX”, “screen”相关的错误。
    • 第四步:如果是双显卡笔记本,且你在手动安装时让nvidia-xconfig生成了配置,这很可能是罪魁祸首。在TTY下,尝试备份并删除X.Org的配置:sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.backup,然后重启显示管理器或直接重启。
    • 第五步:回滚驱动。在TTY下,用apt安装一个更旧的、已知稳定的驱动版本,或者完全卸载NVIDIA驱动,暂时用回开源驱动nouveau(需要移除之前设置的黑名单文件并update-initramfs)。

6. 驱动之上的世界:CUDA、容器与专业工具链

对于开发者而言,驱动只是地基。在地基之上,你需要搭建CUDA工具链来运行AI框架,或者配置容器环境以便于部署。

6.1 安装CUDA Toolkit与cuDNN

NVIDIA驱动和CUDA Toolkit是两个不同的东西。驱动让系统认识显卡,而CUDA Toolkit是用于开发GPU加速应用程序的软件层。它们有版本依赖关系,通常CUDA Toolkit会要求一个最低版本的驱动。

  1. 安装CUDA Toolkit:推荐使用NVIDIA提供的网络安装包(.deb网络安装包),它会自动配置APT源。

    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt install cuda-toolkit-12-4 # 安装CUDA 12.4,请根据需求选择版本

    安装后,需要将CUDA路径加入环境变量。编辑~/.bashrc文件,在末尾添加:

    export PATH=/usr/local/cuda-12.4/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

    然后执行source ~/.bashrc使其生效。运行nvcc --version验证安装。

  2. 安装cuDNN:cuDNN是深度神经网络加速库。你需要先在NVIDIA开发者网站注册并下载对应CUDA版本的cuDNN本地安装包(.tar文件)。假设下载了cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz

    tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include/ sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64/ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

6.2 在Docker容器中使用GPU

如今,容器化部署是主流。要让Docker容器能使用宿主机的GPU,你需要安装nvidia-container-toolkit

# 添加NVIDIA容器工具包仓库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt update sudo apt install -y nvidia-container-toolkit # 配置Docker运行时 sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker

安装配置完成后,你可以使用--gpus all参数来让容器访问所有GPU:

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

如果这个命令能成功输出和在宿主机上一样的nvidia-smi信息,说明容器GPU支持已配置成功。

6.3 性能监控与日常维护命令

除了nvidia-smi,还有一些有用的命令和工具:

  • 实时监控GPU状态

    watch -n 1 nvidia-smi

    这会每秒刷新一次GPU状态,非常适合在运行训练任务时观察。

  • 查看更详细的GPU信息

    nvidia-smi -q

    这会输出所有可查询的详细信息,包括温度、功耗、时钟频率、ECC错误计数等。

  • 设置GPU风扇速度(需X Server运行)

    sudo nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=70

    这条命令启用GPU 0的风扇控制,并将风扇目标转速设为70%。注意:手动调整风扇有风险,请谨慎操作。

  • 清理无用的旧内核和驱动包:系统更新几次后,会积累很多旧内核和可能残留的驱动包,占用磁盘空间。

    # 自动删除不再需要的旧内核包 sudo apt autoremove # 查看已安装的linux-image包,手动删除非常旧的版本(确保当前内核在运行) dpkg --list | grep linux-image

驱动安装和配置是一个系统工程,从最初的禁用开源驱动,到选择安装方法,再到处理双显卡、内核更新、容器化支持,每一步都有其逻辑和可能遇到的“坑”。理解背后的原理,而不仅仅是记住命令,才能让你在遇到新问题时游刃有余。希望这份超详细的指南,能成为你Ubuntu之旅中一份可靠的参考资料。

← 返回列表