ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 外接显示器黑屏:NVIDIA 驱动与 Linux 内核不匹配

Ubuntu 外接显示器黑屏:NVIDIA 驱动与 Linux 内核不匹配

Ubuntu 外接显示器黑屏:NVIDIA 驱动与 Linux 内核不匹配

1. 这次到底出了什么问题?

我的电脑有两块显卡:

Intel 核显 + NVIDIA RTX 3050 独显

可以简单理解成:

  • Intel 核显:CPU 自带的小显卡,功耗低,负责日常桌面显示。
  • NVIDIA 独显:单独的一块高性能显卡,负责 CUDA、深度学习、游戏,以及部分 HDMI / DP 外接显示器输出。

我的电脑虽然还能正常进入 Ubuntu,但外接显示器黑屏。

原因是:

Intel 核显还能正常工作 所以 Ubuntu 桌面还能显示 但是 NVIDIA 独显驱动没有正常加载 所以使用 NVIDIA 的外接显示接口出现黑屏

2. 第一步:检查 NVIDIA 是否正常

执行:

nvidia-smi

出现:

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.

说明:

NVIDIA 显卡虽然在电脑里,但是系统没有正常加载 NVIDIA 驱动。


3. 检查显卡硬件是否还在

执行:

lspci-nnk|grep-A4-Ei'VGA|3D|Display'

Intel 显卡显示:

Kernel driver in use: i915

说明 Intel 核显正常。

NVIDIA RTX 3050 能被识别,但是没有:

Kernel driver in use: nvidia

所以问题不是:

显卡坏了

而是:

NVIDIA 硬件存在 但是 NVIDIA 驱动没有成功加载

再执行:

lsmod|grepnvidia

没有任何输出。

这进一步说明 NVIDIA 驱动模块没有加载。


4. 找到真正的原因

检查当前 Linux 内核:

uname-r

我的结果:

7.0.0-28-generic

然后检查 NVIDIA 驱动:

dpkg-l|grep-E'nvidia-driver|nvidia-dkms|linux-modules-nvidia'

发现安装的是:

nvidia-driver-535 linux-modules-nvidia-535-6.17.0-14-generic

问题就在这里。

我的系统:

当前 Linux 内核 7.0.0-28

但是 NVIDIA 驱动模块是给:

6.17.0-14

用的。

也就是:

Ubuntu 更新 ↓ Linux 内核升级 ↓ 6.17 → 7.0 ↓ NVIDIA 驱动模块没有同步升级 ↓ 新内核无法加载旧 NVIDIA 模块 ↓ RTX 3050 无法正常工作 ↓ nvidia-smi 失败 ↓ 外接显示器黑屏

5. 什么叫“内核”和“驱动”?

可以简单理解成:

Linux 内核

内核就是:

Ubuntu 和电脑硬件之间的总管

比如:

CPU 显卡 硬盘 USB 网卡

这些硬件都需要通过 Linux 内核工作。

执行:

uname-r

看到的:

7.0.0-28-generic

就是当前正在运行的 Linux 内核版本。


NVIDIA 驱动

Linux 内核本身并不知道怎么完整使用 RTX 3050。

所以还需要:

NVIDIA Driver

可以理解成一个“翻译员”:

Ubuntu ↓ Linux 内核 ↓ NVIDIA 驱动 ↓ RTX 3050

如果 Linux 内核升级了,而 NVIDIA 驱动模块还是给旧内核准备的,就会出现:

翻译员版本不匹配

于是新内核无法正常控制显卡。

这就是我这次的问题。


6. 检查 Ubuntu 当前提供的 NVIDIA 驱动

先更新软件源:

sudoaptupdate

然后:

ubuntu-drivers devices

我的系统已经可以提供 NVIDIA 580、595、610 等驱动。

再检查:

apt-cachepolicy nvidia-driver-580 linux-modules-nvidia-580-generic-hwe-24.04

发现 Ubuntu 已经提供:

NVIDIA 580 + Linux 7.0.0-28 对应的 NVIDIA 模块

因此决定从原来的:

NVIDIA 535

升级到:

NVIDIA 580

7. 安装之前先模拟

这是我以后会保留的习惯。

先执行:

apt-sinstallnvidia-driver-580 linux-modules-nvidia-580-generic-hwe-24.04

其中:

-s

表示模拟安装。

不会真的修改电脑。

主要看有没有出现大量:

REMOVE 卸载

我的结果显示:

卸载 0 个软件包

并且会安装:

linux-modules-nvidia-580-7.0.0-28-generic

这正好和当前:

7.0.0-28-generic

匹配。


8. 正式修复

执行:

sudoaptinstallnvidia-driver-580 linux-modules-nvidia-580-generic-hwe-24.04

安装完成后重启:

sudoreboot

9. 重启后检查

先执行:

nvidia-smi

如果能够正常看到:

RTX 3050 Driver Version CUDA Version

说明 NVIDIA 驱动已经恢复。

再执行:

lsmod|grepnvidia

应该可以看到类似:

nvidia nvidia_drm nvidia_modeset nvidia_uvm

说明 NVIDIA 驱动模块已经成功加载。


10. 最终总结

这次并不是:

显示器坏了 HDMI 线坏了 RTX 3050 坏了 CUDA 坏了

真正的问题是:

Linux 内核已经升级到 7.0.0-28 但是 NVIDIA 驱动模块还停留在旧的 6.17 内核

导致:

Linux 7.0 ↓ 找不到匹配的 NVIDIA 驱动模块 ↓ RTX 3050 无法加载驱动 ↓ nvidia-smi 失败 ↓ 外接显示器黑屏

最终通过安装:

NVIDIA Driver 580 + linux-modules-nvidia-580-7.0.0-28-generic

让:

Linux 内核 NVIDIA 驱动 RTX 3050

重新匹配,问题解决。


11. 下次遇到 NVIDIA 黑屏,我先查这几个命令

uname-r

看当前 Linux 内核。

nvidia-smi

看 NVIDIA 是否正常。

lsmod|grepnvidia

看 NVIDIA 驱动模块有没有加载。

lspci-nnk|grep-A4-Ei'VGA|3D|Display'

看显卡硬件和当前驱动。

dpkg-l|grep-E'nvidia-driver|nvidia-dkms|linux-modules-nvidia'

看 NVIDIA 驱动和内核模块版本。

以后如果出现:

当前内核:7.x NVIDIA 模块:6.x

就应该第一时间怀疑:

Linux 内核升级以后,NVIDIA 驱动模块没有跟上。

返回列表