Ubuntu Desktop 部署 NVIDIA 驱动的流程及常见错误处理

该文章根据本人安装ubuntu24.02中nvidia驱动安装遇到的问题以及大模型给出的解决方案整理。

引言

在 Ubuntu Desktop 系统上为 NVIDIA 显卡安装驱动,是许多开发者、数据科学家和游戏玩家的必备操作。然而,由于硬件、系统版本、尤其是安全启动(Secure Boot)机制的复杂性,这个过程常常充满挑战。本指南旨在提供一个从标准到高级的完整安装流程,并深入剖析在此过程中可能遇到的各种疑难杂症及其解决方案。

本指南将覆盖两种主流安装方法:

  1. 官方仓库 apt 安装:推荐新手和追求稳定性的用户使用。
  2. 官网 .run 文件安装:适用于需要最新驱动、或官方仓库不支持新硬件的用户。

我们将以一个典型的排错路径来组织内容:从标准流程开始,逐步深入到因 Secure Boot 等机制引发的复杂问题。

一、通用准备工作(所有方法适用)

在开始任何安装步骤之前,请务-必完成以下准备工作,以确保一个干净的系统环境。

  1. 更新系统
    确保所有系统软件包都处于最新状态。

    sudo apt update
    sudo apt upgrade -y
    
  2. 安装编译依赖
    无论使用何种方法,内核模块都可能需要现场编译。DKMS 工具更是保证驱动在内核更新后能自动重新编译的关键。

    sudo apt install build-essential dkms libelf-dev linux-headers-$(uname -r) -y
    
  3. 清理旧驱动(非常重要)
    为避免版本冲突,彻底清除任何可能已存在的 NVIDIA 驱动。

    sudo apt purge '*nvidia*' -y
    sudo apt autoremove -y
    

二、标准流程:使用 apt 和系统工具(推荐)

这是最简单、最安全的方法,它能与系统集成得最好,并能自动处理 Secure Boot 的签名问题。

1. 安装驱动

Ubuntu 提供了一个便捷的命令来自动安装推荐的驱动程序。

sudo ubuntu-drivers install

或者,您可以先查看推荐版本,再手动安装:

ubuntu-drivers devices
# 假设输出推荐 nvidia-driver-550-open
sudo apt install nvidia-driver-550-open

2. 配置 Secure Boot 签名 (MOK)

在安装过程中,如果您的系统启用了 Secure Boot,终端会弹出一个蓝色的图形界面 Configuring secure boot

  • 第一步: 看到提示后,选择 <Ok>
  • 第二步: 在创建密码的界面,输入一个您能记住的临时密码。这个密码仅用于下一步重启时注册密钥,非常重要。
  • 第三步: 等待安装完成。

3. 重启并注册密钥

sudo reboot

重启时,在进入 Ubuntu 之前,系统会进入一个蓝色的 "Perform MOK management" 界面。

  • 选择 Enroll MOK
  • 选择 ContinueYes
  • 输入您在上一步设置的临时密码
  • 选择 Reboot

4. 验证

登录系统后,打开终端运行:

nvidia-smi

如果成功显示显卡信息,则安装完成。


三、高级流程:使用 NVIDIA 官网 .run 文件

当您的硬件过新(如 RTX 50 系列),或需要特定版本的驱动时,就需要采用此方法。此方法与 apt 安装方式完全不兼容,请勿混合使用!

1. 禁用 Nouveau 开源驱动

.run 安装程序与系统自带的 Nouveau 驱动冲突,必须禁用。

# 创建黑名单文件
sudo nano /etc/modprobe.d/blacklist-nouveau.conf

# 在文件中添加以下内容
blacklist nouveau
options nouveau modeset=0

# 保存退出 (Ctrl+X, Y, Enter) 并更新内核镜像
sudo update-initramfs -u
sudo reboot

重启后,屏幕分辨率变低是正常现象。

2. 在 Secure Boot 环境下的核心步骤:手动签名

如果启用了 Secure Boot,必须手动创建密钥并用其签名内核模块。

步骤 A: 创建并注册 MOK 密钥

此方法利用系统的 MOK 机制,较为通用。

  1. 生成密钥对:
    mkdir ~/nvidia_mok_keys
    cd ~/nvidia_mok_keys
    openssl req -new -x509 -newkey rsa:4096 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=My NVIDIA Driver Signer/"
    
  2. 向系统导入公钥:
    sudo mokutil --import ~/nvidia_mok_keys/MOK.der
    
    根据提示,设置一个一次性的临时密码
  3. 重启并在 MOK 管理界面注册:此步骤与 apt 方法中的 MOK 注册完全相同。

步骤 B: 安装驱动并签名

  1. 进入纯命令行模式:这是必须的步骤,因为安装程序不能在图形界面运行时工作。
    # 设置默认启动到命令行
    sudo systemctl set-default multi-user.target
    sudo reboot
    
    # 登录命令行
    
  2. 运行安装程序:使用绝对路径指定密钥来避免解析错误。
    cd ~/Downloads # 进入 .run 文件所在目录
    chmod +x NVIDIA-Linux-x86_64-*.run
    
    # 使用密钥签名并安装
    # 使用该命令偶尔会在build阶段直接出错,根据信息查看日志,好像是/var/install/nvidia-install.log,如果出现类似key不存在的错误,移除该命令--dkms及后续的参数,在安装过程中手动填写密钥和公钥的路径。
    sudo ./NVIDIA-Linux-x86_64-*.run --dkms --module-signing-secret-key=/home/YOUR_USERNAME/nvidia_mok_keys/MOK.priv --module-signing-public-key=/home/YOUR_USERNAME/nvidia_mok_keys/MOK.der
    
  3. 遵循向导: 在安装向导中,对 DKMS 选择 Yes,对 nvidia-xconfig 建议选择 No

步骤 C: 恢复并验证

  1. 恢复图形界面启动:
    sudo systemctl set-default graphical.target
    sudo reboot
    
  2. 验证: 登录后运行 nvidia-smi

四、疑难杂症排查(Troubleshooting)

如果您严格遵循了以上流程但问题依旧,下面是根据错误现象进行排查的指南。

问题一:nvidia-smi 失败,提示"couldn't communicate with the NVIDIA driver"

这是最常见的错误,意味着 NVIDIA 内核模块(nvidia.ko)没有被成功加载。

  • 诊断 1: lsmod | grep nvidia,如果无任何输出,则证实模块未加载。
  • 诊断 2: dmesg | grep -iE "nvidia|secure boot|signature",查看内核日志寻找线索。

问题二:dmesg 提示 "Key was rejected by service"

即使您已经正确注册了 MOK 密钥,也可能遇到此错误。

  • 原因分析: 这通常是由于内核进入了比标准 integrity 更严格的 confidentiality 锁定(Lockdown)模式。在此模式下,即使是 MOK 签名的密钥也会被拒绝,以防止对内核的任何修改。
  • 解决方案: 强制内核使用 integrity 锁定模式。
    1. 编辑 GRUB 配置文件: sudo nano /etc/default/grub
    2. 找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,在引号内添加 lockdown=integrity 参数,例如:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash lockdown=integrity"
    3. 更新 GRUB 并重启:
      sudo update-grub
      sudo reboot
      

问题三:禁用 Secure Boot 后无法启动 Ubuntu

在某些主板(特别是华硕等)上,禁用 Secure Boot 会导致系统无法引导。

  • 原因分析: 这是由于 BIOS 的一个“智能”设定。当禁用 Secure Boot 时,BIOS 会自动启用 CSM (Compatibility Support Module),即旧版 BIOS 兼容模式。而您的 Ubuntu 是在现代 UEFI 模式下安装的,因此在 Legacy 模式下无法被找到。
  • 解决方案:
    1. 进入 BIOS/UEFI 设置。
    2. 找到 "CSM (Compatibility Support Module)" 选项,将其强制设置为 Disabled (禁用)
    3. 找到 "Secure Boot" 选项,将其设置为 Disabled (禁用)。
    4. F10 保存并退出。这样系统就会在纯 UEFI 模式(但无签名验证)下启动。

问题四:所有方法都失败,依然是 Key was rejected... (终极问题)

这通常发生在对安全有极高要求的现代主板上(如我们遇到的华硕 X870)。固件的 Secure Boot 策略否决了操作系统层级的 MOK 密钥。

  • 原因分析: 系统的信任链不允许 MOK 密钥加载第三方模块。我们需要将自己的公钥提升到与 Microsoft、Canonical 同等的地位,直接写入 UEFI 固件的信任数据库 (db) 中。
  • 终极解决方案: 将自定义公钥注入 UEFI db
    1. 准备: 一个 FAT32 格式的 U 盘;安装 efitools (sudo apt install efitools)。
    2. 生成 UEFI 兼容的密钥:
      mkdir ~/uefi_keys && cd ~/uefi_keys
      # 生成私钥和公钥
      openssl req -new -x509 -newkey rsa:4096 -nodes \
              -keyout NVIDIA.key -out NVIDIA.pem \
              -subj "/CN=My Custom NVIDIA Key/" -days 36500
      # 转换为 UEFI 签名列表 (ESL) 格式
      cert-to-efi-sig-list -g "$(uuidgen)" NVIDIA.pem NVIDIA.esl
      
    3. 复制到 U 盘: 将 NVIDIA.esl, NVIDIA.key, NVIDIA.pem 复制到 U 盘根目录。
    4. 操作 BIOS:
      • 重启进入 BIOS/UEFI 设置。
      • 进入 "Secure Boot" 菜单,将模式从 [Standard] 切换为 [Custom]
      • 请注意,该位置有的主板会包含一个启动类型的配置,包括Windows UEFI启动和其他操作系统UEFI,大模型建议选择其他操作系统,但是本人测试发现如果先安装WINDOWS再安装Linux,该选项会导致无法进入ubuntu的系统。
      • 进入 "Key Management" -> "DB Management"。
      • 选择 "Append Key from file" 或类似选项。
      • 从 U 盘中选择 NVIDIA.esl 文件并确认添加。
      • F10 保存并退出。
    5. 用新密钥重装驱动: 按照 高级流程 (三) 的步骤进行安装,但在运行 .run 文件时,--module-signing-secret-key--module-signing-public-key 参数要指向 U 盘中新的 NVIDIA.keyNVIDIA.pem 文件

总结

安装 NVIDIA 驱动的旅程可能充满挑战,但每一个错误信息都是通往正确配置的线索。核心要点可以归纳为:

  • 优先使用 apt:对于大多数用户和硬件,这是最省心的方法。
  • 隔离安装方法绝对不要混合使用 apt.run 文件安装。
  • 理解 Secure Boot:它是大多数问题的根源。问题的层次从操作系统的 MOK 机制,到内核的 Lockdown 策略,再到最终的 UEFI 固件信任数据库。
  • 保持环境纯净:在执行关键安装步骤前,务必进入纯命令行模式,并确保系统已被清理干净。
posted @ 2025-07-03 09:57  massena  阅读(2843)  评论(0)    收藏  举报