1. nouveau
根本问题是 Nouveau(开源 NVIDIA 驱动)正在运行,与你要安装的专有 NVIDIA 驱动 570.211.01 冲突。安装程序检测到后主动中止了。
日志中的关键线索:
WARNING: The Nouveau kernel driver is currently in use by your system.
This driver is incompatible with the NVIDIA driver, and must be disabled before proceeding.
解决步骤
第一步:禁用 Nouveau 并重建 initramfs
bash
# 1. 创建/确认 Nouveau 黑名单配置
sudo bash -c 'cat > /etc/modprobe.d/blacklist-nouveau.conf <<EOF
blacklist nouveau
options nouveau modeset=0
EOF'
# 2. 重建 initramfs
sudo update-initramfs -u
# 3. 重启系统
sudo reboot
第二步:重启后验证 Nouveau 已卸载
bash
# 确认 nouveau 不在内核模块列表中
lsmod | grep nouveau
# 应该没有任何输出。如果有输出,说明还在运行,需要再检查
第三步:重新运行 CUDA 安装
重启后,在纯文本终端(TTY)下执行,先关闭图形界面:
bash
# 进入纯文本模式(关闭图形界面)
sudo systemctl isolate multi-user.target
# 运行安装(只装 CUDA,不装驱动;或者先单独装驱动)
sudo bash ./cuda_12.8.2_570.211.01_linux.run --no-opengl-libs
# 安装完成后恢复图形界面
sudo systemctl start graphical.target
⚠️ 额外注意点
日志中还有一条警告:
An alternate method of installing the NVIDIA driver was detected.
这说明你的系统里可能已经通过 apt 安装过 NVIDIA 驱动 。如果你之前运行过类似 sudo apt install nvidia-driver-xxx 的命令,建议先卸载,避免与 .run 安装包冲突:
bash
# 先清理已有的 NVIDIA 驱动包
sudo apt purge nvidia* libnvidia*
sudo apt autoremove
sudo reboot
然后再按上面的步骤重新安装。
总结
| 问题 | 原因 | 解决 |
|---|---|---|
| 安装失败 | Nouveau 驱动仍在运行 | 黑名单 → 重建 initramfs → 重启 |
| 可能冲突 | 系统已有 apt 安装的 NVIDIA 驱动 | apt purge nvidia* 清理后重装 |
| 最佳实践 | 图形界面下安装驱动容易失败 | 切到 multi-user.target 纯文本模式安装 |
执行完第一步重启后,Nouveau 就会被彻底禁用,再运行 CUDA 安装即可成功。
2. gcc-12
根本问题是 GCC 编译器版本不匹配。
你的系统默认 GCC 是 11.4.0 ,但内核 6.8.0-40-generic 是用 GCC 12 编译的。内核构建系统继承了一个 GCC 12 才支持的选项 -ftrivial-auto-var-init=zero,而 GCC 11 不认识它,导致 NVIDIA 驱动模块编译失败。
解决步骤
第一步:安装 GCC-12 和 G+±12
bash
sudo apt update
sudo apt install gcc-12 g++-12 -y
第二步:将 GCC-12 设为默认编译器
方式 A(推荐,用 update-alternatives):
bash
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 --slave /usr/bin/g++ g++ /usr/bin/g++-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 50 --slave /usr/bin/g++ g++ /usr/bin/g++-11
方式 B(直接改 cc 软链接,更粗暴但有效):
bash
sudo ln -sf /usr/bin/gcc-12 /usr/bin/cc
第三步:验证版本
bash
gcc --version
cc --version
确认输出显示 gcc 12.x.x。
第四步:清理后重新安装
bash
# 先清理上次失败的残留
sudo bash ./cuda_12.8.2_570.211.01_linux.run --silent --driver --toolkit --override
# 或者只重装驱动
sudo bash ./cuda_12.8.2_570.211.01_linux.run --silent --driver --override
如果之前已经通过
.run文件部分安装过,建议先用--uninstall清理:
bashsudo bash ./cuda_12.8.2_570.211.01_linux.run --uninstall
为什么不用降级内核?
降级到 5.15 内核确实能避开这个问题(因为 5.15 用 GCC 11 编译),但你当前的内核 6.8 是 Ubuntu 22.04 的 HWE 内核,升级 GCC 到 12 是更干净的做法,既能保留新内核特性,又一劳永逸。
总结
| 问题 | 根因 | 解决 |
|---|---|---|
-ftrivial-auto-var-init=zero 不认识 |
GCC 11 不支持该选项,内核 6.8 需要 GCC 12 | apt install gcc-12 g++-12 + 设为默认 |
执行完上述步骤后,驱动编译应该就能通过了。