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 5807. 安装之前先模拟
这是我以后会保留的习惯。
先执行:
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安装完成后重启:
sudoreboot9. 重启后检查
先执行:
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 驱动模块没有跟上。