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 couldnt communicate with the NVIDIA driver.说明NVIDIA 显卡虽然在电脑里但是系统没有正常加载 NVIDIA 驱动。3. 检查显卡硬件是否还在执行lspci-nnk|grep-A4-EiVGA|3D|DisplayIntel 显卡显示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-Envidia-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-EiVGA|3D|Display看显卡硬件和当前驱动。dpkg-l|grep-Envidia-driver|nvidia-dkms|linux-modules-nvidia看 NVIDIA 驱动和内核模块版本。以后如果出现当前内核7.x NVIDIA 模块6.x就应该第一时间怀疑Linux 内核升级以后NVIDIA 驱动模块没有跟上。