
先声明一下这篇不是从网上抄来的搬运文是我自己在 Ubuntu 18.04 上踩了两次同样的坑之后总结出来的完整排查思路和可复现的修复步骤。要是有读者正对着黑屏的显示器发呆、又发现有线网和蓝牙全没了建议按顺序看别跳因为你看到的每一步之间是有因果关系的。为什么装个显卡驱动会搞出一连串系统问题先把根因理清楚先说一个反直觉的事实Nvidia 驱动装完黑屏很多时候不是 Nvidia 驱动本身的问题而是你系统里同时存在两套互相抢资源的显示驱动方案外加一个喜欢自作主张更新内核的 apt。1.1 黑屏的真正触发链路Ubuntu 18.04 默认自带一个开源的 Nvidia 驱动模块叫nouveau。它的性能不怎么样但胜在免费、开源、系统装好就能用。问题在于当你安装官方闭源的nvidia-driver-XXX时这个闭源驱动会向内核注册自己的显示设备节点而nouveau也不会自动退位。两个驱动同时试图控制同一张显卡结果就是启动时图形栈直接崩溃屏幕一黑连登录界面都出不来。这一条链路里最大的变量是内核模块的加载顺序。正常情况下nvidia模块会在nouveau之后加载然后用自己的设备文件接管显卡。但如果内核版本升级过、或者/etc/modprobe.d/下的配置没写对nouveau就会抢先加载然后系统就卡死在显示初始化阶段。黑屏就是这么来的。如果你装完 Nvidia 驱动之后能看见 GRUB 菜单但过了 GRUB 就黑屏那大概率就是这条链路出了问题而不是硬件坏了。1.2 网络和蓝牙驱动为什么会被殃及很多人的第一反应是我装的是显卡驱动关网络和蓝牙什么事答案是不是 Nvidia 驱动本身删了它们是 apt 的依赖自动处理在捣鬼。Ubuntu 18.04 的软件仓库里nvidia-driver-XXX包往往依赖linux-modules-extra-$(uname -r)和某个具体的内核版本。当你执行apt install nvidia-driver-430时为了满足依赖apt 可能会顺手安装一个新内核比如从原本的 5.3.0 系列升到 5.4.0 系列。如果你的网卡/蓝牙模块是Realtek 系列这在笔记本上特别常见比如 RTL8821CE、RTL8723DE它们的驱动不在内核主线里而是以第三方 DKMS 包的形式存在。奔着这个新的内核版本这个 DKMS 包没有对应的模块编译产物于是系统一重启网卡驱动就消失了。蓝牙模块同理。很多 Realtek 无线网卡把 Wi-Fi 和蓝牙做在同一颗芯片里驱动没了Wi-Fi 和蓝牙一起没了。你打开设置面板看到的是一片空白的网络列表好像系统从来没装过网卡一样。注意如果是 Intel 网卡比如 8265、9260、AX200情况一般稍微好一点。Intel 的无线驱动iwlwifi是内核自带的但固件文件放在linux-firmware包里这个包也可能会被 apt 自动变更。固件版本不对一样会出现网卡无法识别的情况。黑屏之后怎么应急恢复三种进入命令行的可靠方法在动手修复之前你首先得从黑屏状态里挣扎出来。不管你屏幕上有没有光标、有没有登录界面下面三种方法里至少有一种能让你进入命令行。2.1 方法一CtrlAltF3 切换到 TTY 终端这是最快的方法也是我第一个会尝试的方法。Nvidia 驱动冲突导致的黑屏往往只是显示服务器X Server挂了内核本身还在正常运行。也就是说你的系统活着只是没脸见人。按下Ctrl Alt F3F1 到 F6 都行一般从 F3 开始试因为 F1/F2 可能被 GDM 登录管理器占用如果能看到一个纯黑底白字的登录提示符恭喜系统核心是完好的。输入用户名和密码登录然后先确认一下当前是不是真的有显卡驱动冲突lsmod | grep -E nouveau|nvidia这个命令会把内核里加载的显示驱动模块列出来。如果你看到nouveau和nvidia同时存在那基本坐实了打架的判断。2.2 方法二重启进入 Recovery Mode 恢复模式如果 TTY 切换没反应按下电源键强制重启在 GRUB 菜单出现时选择Advanced options for Ubuntu里面会有一个带(recovery mode)字样的内核条目选中它回车。Recovery Mode 会弹出一个蓝色菜单里面有几项root直接获得 root shell这是最常用的network把网络挂载打开方便联网修复resume尝试正常继续启动进入 root shell 之后你就有了完整的修复权限。我个人习惯在 Recovery Mode 里执行的第一步是apt update apt install -f-f参数会修复损坏的依赖关系有时候光是跑这一句就能解决不少问题。2.3 方法三在 GRUB 引导参数里加 nomodesetT 方法都进不去的人不要慌还有最后一个硬办法临时禁用内核的 KMS内核模式设置。在 GRUB 菜单界面选中默认启动项按e进入编辑模式。在linux那一行通常是linux /boot/vmlinuz-... root... quiet splash的末尾加上一个参数nomodeset加完之后按CtrlX或F10启动。这个参数会让内核在启动时不加载任何显卡相关的模式设置模块Nvidia 和 nouveau 谁也别想抢显卡系统会以最基本的 VESA 兼容模式跑起来黑屏概率大大降低。这个方法本来是给老显卡或者新显卡不兼容时用的但在装完驱动后黑屏的场景下特别有用。注意它只是临时让你能进桌面/命令行不解决根本问题——你还需要继续往下看把驱动冲突彻底处理掉。网络和蓝牙驱动的修复全过程从确认网卡型号到重装驱动进了命令行之后别急着碰显卡驱动先把网络和蓝牙救回来。没有网络你连后续的下载动作都做不了。3.1 第一步确认系统到底还认不认网卡硬件很多情况下驱动消失只是操作系统层面的模块没了硬件本身是好的。你要做的是和设备对话看它还有没有反应。lspci | grep -i -E network|ethernet这个命令会把 PCI 总线上的网络控制器列出来。如果你能看到一行类似07:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8821CE 802.11ac PCIe Wireless Network Adapter或者06:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller说明硬件在 PCI 总线上是正常的驱动丢失而已。如果lspci下面什么都没有那问题就更麻烦了可能需要进 BIOS 看设备是否被禁用或者检查是不是内核里 PCI 枚举出了问题。也可以用dmesg | grep -i firmware查看有没有固件加载失败的报错比如r8169: firmware: failed to load rtl_nic/rtl8168e-3.fw看到这种输出就说明网卡驱动在等固件文件但固件文件不存在或版本不对。3.2 第二步临时用手机共享网络解决联网问题如果你的有线网络也挂了就会陷入死循环没网 → 没法装驱动 → 没法联网。这时候最实用的办法是在本机操作之前先给电脑提供一条临时网络通道。用 USB 数据线连接手机在手机端开启USB 网络共享USB Tethering或者用手机开热点但前提是你的无线网卡还能被识别USB 网络共享走的是 USB RNDIS 协议Ubuntu 内核里默认集成了相关模块几乎不需要额外驱动。连接之后运行ip addr应该能看到一个usb0或enp0s20f0u1之类的接口这时系统就能上网了。这个方法不解决根本问题但能保证你有网去下载驱动源码编译。3.3 第三步针对 Realtek 网卡/蓝牙的专项修复如果你确认网卡是 Realtek 系列那修复流程几乎是标准化的。以 RTL8821CE 为例步骤如下# 安装编译工具链 sudo apt update sudo apt install -y dkms build-essential git # 从 GitHub 获取 RTL8821CE 驱动源码这一步需要网络 git clone https://github.com/tomaspinho/rtl8821ce.git cd rtl8821ce # 编译并安装 sudo ./dkms-install.sh这里的dkms-install.sh脚本干了三件事把源码注册进 DKMS 系统、针对当前内核编译模块、在/lib/modules/$(uname -r)/updates/dkms/下生成.ko文件。装完重启Wi-Fi 和蓝牙理论上就回来了。如果是 RTL8111/8168 等有线网卡Ubuntu 官方仓库里有r8168-dkms包直接用 apt 装也行sudo apt install -y r8168-dkms注意Realtek 的 GitHub 驱动仓库可能存在版本兼容问题下载前看清楚 README 里支持的内核版本范围。有些老仓库源码在 5.4 之后的内核上编译会报错这时建议改写/etc/modprobe.d/blacklist.conf里的r8169模块而改用r8168单独加载。3.4 第四步确认蓝牙服务正常Wi-Fi 网络恢复后还需要专门检查一下蓝牙。Ubuntu 18.04 上蓝牙协议栈用的是 BlueZ其中关键服务有两个bluetooth.service和bluetoothd。执行systemctl status bluetooth如果服务状态是inactive (dead)启动它sudo systemctl enable --now bluetooth如果服务是启动的但仍搜不到蓝牙设备很可能是rtl_bt的固件文件缺失。Realtek 蓝牙固件一般放在/lib/firmware/rtl_bt/目录下可以对比一下同型号的主机有没有对应文件。没有的话去linux-firmware仓库下载对应型号的.bin文件放进去sudo cp rtl8821cu_config /lib/firmware/rtl_bt/ sudo cp rtl8821cu_fw /lib/firmware/rtl_bt/放完固件重启蓝牙服务或者直接重启系统。为什么网络蓝牙驱动会再次消失DKMS 机制才是关键很多人在网络和蓝牙修复后的几天内再次重启发现它们又不见了。这不是你运气差而是DKMS 机制没建立好。4.1 DKMS 是什么它和内核升级是什么关系DKMSDynamic Kernel Module Support动态内核模块支持是一套让第三方内核模块自动为新内核重新编译的机制。它的工作逻辑是你有一个模块源码包它把这个源码注册到/usr/src/下然后当系统检测到新内核安装时DKMS 就会用新内核的 headers 去重新编译模块并把编译产物放到新内核对应的模块目录里。所以正确安装第三方驱动的姿势是注册到 DKMS而不是只在当前内核编译一次。4.2 怎么确认自己的驱动是否已经被 DKMS 接管执行dkms status你会看到类似这样的输出rtl8821ce/1.0.0, 5.4.0-42-generic, x86_64: installed如果输出的行尾是installed说明这个模块已经和内核版本绑定并安装成功。如果显示built而不是installed或者显示missing就说明编译产物没装好可能需要手动执行sudo dkms install -m rtl8821ce -v 1.0.0其中-m是模块名-v是版本号这些都能从dkms status的输出里看到。4.3 为什么建议安装前先把内核固定住从网络/蓝牙驱动消失这个问题的角度出发有一个简单粗暴但很管用的技巧在确定所有驱动都稳定之前不要让 apt 自动升级内核。修改/etc/apt/apt.conf.d/50unattended-upgrades文件把Unattended-Upgrade::Allowed-Origins里的main和updates相关源注释掉只保留安全补丁源。同时如果你用的是 HWE 内核版本硬件支持版还要防止linux-generic-hwe-18.04这类元包被自动升级sudo apt-mark hold linux-generic-hwe-18.04 linux-image-generic-hwe-18.04 linux-headers-generic-hwe-18.04apt-mark hold会把包固定在当前版本除非你手动取消否则 apt 不会对它做任何变更。这是一种宁可手动升级也不要被动升级的思路。很多服务器运维人员都这么干在图形工作站上同样适用。回到正题Nvidia 驱动到底应该怎么装才不会再次黑屏把网络救了回来系统终于能正常上网了这时候才轮到正儿八经地处理显卡驱动。如果你重新安装 Nvidia 驱动的方式还是老一套随便 apt 装一下那就等着第二次黑屏吧。以下是我验证过多次的安装方案。5.1 先彻底清理旧驱动环境如果在之前黑屏的过程中你已经安装过 Nvidia 驱动或者系统里残留了部分安装文件一定要先清理干净。执行sudo apt purge nvidia-* sudo apt autoremove然后确认/etc/modprobe.d/目录里没有 nvidia 相关的配置文件残留ls /etc/modprobe.d/ | grep -i nvidia有的话直接删掉。目的很简单——让系统回到一个干净的、只存在 nouveau 的状态。虽然 nouveau 性能烂但它至少不会让系统黑屏适合作为修复过程的兜底底线。5.2 禁用 nouveau这一步不能省前面说了黑屏的核心原因是两套驱动抢显卡。所以安装 Nvidia 驱动之前先要明确告诉内核后面的操作与 nouveau 无关你不要再加载它了。创建一个配置文件sudo tee /etc/modprobe.d/blacklist-nouveau.conf EOF blacklist nouveau options nouveau modeset0 EOF然后刷新 initramfssudo update-initramfs -u这个动作会把 nouveau 的 blacklist 信息写入内核启动镜像。之后重启nouveau 就不会再被加载了。注意这台机器会再次回到黑屏状态因为没有显卡驱动了别慌用第一章的 TTY 方法进命令行继续下一步。提示如果你用的是 UEFI 启动并且在 BIOS 里开启了Secure Boot那么安装驱动大概率会失败。Nvidia 官方驱动和 DKMS 编译出来的模块都没有微软签名Secure Boot 会直接拒绝加载未签名内核模块表现就是装完驱动后系统自动回到 nouveau 或者黑屏。最简单的处理是进 BIOS 暂时关闭 Secure Boot或者把生成的 MOK 签名文件注册进 UEFI。个人建议直接用前者省心。5.3 安装用 ubuntu-drivers 自动选择还是手动指定Ubuntu 18.04 上推荐用ubuntu-drivers工具自动检测并推荐显卡驱动版本sudo apt install ubuntu-drivers-common sudo ubuntu-drivers auto这个命令会扫描你的显卡型号列出所有可用的 Nvidia 驱动分支并按推荐程度排序。一般直接装那个写着recommended的版本就行。如果你想手动指定版本比如为了匹配 CUDA 或某个深度学习框架可以用sudo apt install nvidia-driver-470装完之后先不要重启把 DKMS 状态检查一遍dkms statusNvidia 驱动包会通过 DKMS 注册nvidia和nvidia-modeset等模块。确认输出里有installed字样再重启不然大概率是白装。5.4 安装后的验证流程重启之后第一步验证驱动是否生效nvidia-smi这个命令会输出 GPU 型号、显存使用量、驱动版本号。如果能看到这样的输出说明 Nvidia 驱动已经正常接管黑屏问题基本宣告解决。第二步验证显示环境是否正常。如果用的是桌面版且当初黑屏是因为 GDM 显示管理器配置问题建议把 GDM 重启一次sudo systemctl restart gdm3或者干脆再用nvidia-settings看 3D 加速能不能跑起来。跑一个glxinfo | grep OpenGL renderer如果显示的是你的 Nvidia 显卡型号而不是llvmpipe软件渲染那就说明图形栈已经走 GPU 了。5.5 如果还是黑屏检查日志和 Xorg 配置不肯睡觉的问题总得找到证据。黑屏重启后进入 TTY查看 Xorg 日志cat /var/log/Xorg.0.log | grep -i -E EE|error如果看到类似(EE) Failed to load module nvidia (module does not exist, 0)说明驱动模块没有正确安装到内核里用modprobe nvidia手动测试加载看看有没有具体的报错信息。如果看到(EE) no screens found(EE)说明 Xorg 配置里写的显示器信息和你实际的设备对不上。这时候可以配置 Xorg 的 Nvidia 设备段。最简单的方法是删掉或备份/etc/X11/xorg.conf然后重新生成sudo nvidia-xconfig这是 Nvidia 官方自带的配置工具它会根据当前设备重新生成 xorg.conf覆盖掉之前错误的配置。做完之后重启黑屏概率会小很多。关于安装顺序和系统备份的最后提醒最后分享几个纯经验层面的建议属于没人告诉我、但我希望有人早点告诉我的那种。第一个建议不要在刚刚装完系统、网卡驱动还没配置好的时候就安装 Nvidia 驱动。这听起来是废话但很多人包括我都是这样栽的。显卡驱动和网卡/蓝牙驱动看似独立中间隔着一个 apt 依赖处理实际上它们会在内核升级这个环节交汇。正确顺序应该是先把系统的网络环境、网卡驱动、蓝牙全部搞定确认重启之后一切正常再着手安装显卡驱动。这样即使显卡驱动出了问题你至少还有网能查资料、能下载修复工具。第二个建议装驱动前用 Timeshift 做一次系统快照。Timeshift 是 Linux 上类似 Windows 还原点的工具能把系统完整快照成 rsync 或 Btrfs 快照。在安装任何驱动或内核变更之前我先做一个快照出了问题可以直接恢复到安装前的状态比任何排查都省时间。Ubuntu 18.04 上一条命令就能装sudo apt install timeshift第三个建议在/etc/modprobe.d/里给网卡和显卡都写上明确的配置不要依赖系统默认的模块加载顺序。显卡那边是blacklist-nouveau.conf网卡那边可以手动指定r8168或r8169的加载顺序。这样即使以后系统为了满足某个依赖自动更换了内核模块加载也不至于顺序大乱。说到底Ubuntu 18.04 的这套问题之所以让那么多人头疼是因为它把内核、驱动、显示管理器、网络栈和固件管理搅在一起牵一发而动全身。但只要你理解了这几个组件之间的依赖关系解决的路径其实非常固定先救网络再修显示最后整理模块加载。照着这个顺序来大多数问题都能收尾。