ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu误装NVIDIA驱动导致无法开机?从GRUB到chroot的完整自救指南

Ubuntu误装NVIDIA驱动导致无法开机?从GRUB到chroot的完整自救指南

玩双系统这些年,踩过最大的坑就是显卡驱动。尤其是 Ubuntu 20.04 上误装 NVIDIA 驱动后,重启直接卡死,Logo 界面一动不动,按什么都像进了死胡同。那段时间我前后帮朋友和自己处理过好几台这样的机器,总结下来,这个问题九成不需要重装系统,只是大多数人不知道该怎么进修复环境、也不敢乱敲命令。

这篇文章就是把我实际处理“误装 nvidia 驱动导致无法开机启动”的完整过程写出来,包括三种进入修复环境的方式、清驱动、重建内核镜像、重新装驱动、以及几个我踩过之后才懂的坑。你只要还能看到 GRUB 菜单,或者有一个 U 盘能做启动盘,基本都能救回来。

1. 误装 NVIDIA 驱动之后,到底发生了什么

很多人不理解,好端端的系统为什么装个显卡驱动就开不了机。其实不是系统坏了,而是内核启动之后,显示管理器在加载图形界面的阶段直接崩了。

1.1 “开不了机”的三种表现和真正的原因

我遇到的情况大致分三种:

  • 开机后卡在 Ubuntu Logo,转圈圈转到天荒地老,没有登录界面。
  • 黑屏,显示器无信号,但主机指示灯还亮。
  • 能看到登录界面,输入密码之后又闪回登录界面,陷入死循环。

这三种表现的根源不太一样,但多数情况下都和显卡驱动冲突有关。Ubuntu 20.04 默认用的是开源驱动 nouveau,这是内核里自带的一个通用 NVIDIA 驱动。你如果手动装官网的 runfile 包,或者装了和你显卡不匹配的 apt 驱动包,系统里就会出现两套驱动同时对显卡指手画脚的情况。轻则 nouveau 被 nvidia 模块顶掉之后没能正常切换,重则 Xorg 加载 nvidia 模块时直接段错误,桌面起不来。

理论上,内核本身已经启动了,所以这不是真正的“开不了机”,而是图形界面起不来。默认 Ubuntu 20.04 的 grub 菜单是隐藏的,开机不按任何键就直接进系统,你根本看不到内核输出,所以体感上就是电脑废了。

1.2 双系统环境下更容易让人误判

双系统还有一个隐藏干扰项:很多人以为自己把 Windows 的引导搞坏了。实际上,显卡驱动误装基本不会碰 EFI 分区,也不会影响 Windows 引导。你从开机菜单里选 Windows 启动项,Windows 大概率能正常进。只是在 Ubuntu 的 GRUB 菜单界面,系统停在那个 Logo 不动,给你一种“整个电脑没救”的错觉。

所以第一个判断标准就是:开机时能不能进 GRUB 菜单?能进,就按下面的方法处理;不能进,再考虑引导修复的问题。

2. 自救第一步:在不重装的前提下先进入修复环境

进入修复环境的思路很简单:绕过坏掉的图形界面,通过命令行把错误驱动清掉。

2.1 最简单的一招:开机时给内核加 nomodeset

如果只是卡在 Logo 或者黑屏,最值得先试的是 nomodeset 参数。这个参数的意思是告诉内核:先别做显示模式的切换和初始化,把图形相关的工作留给用户空间。加了它之后,很多和 KMS(内核模式设置)相关的黑屏问题能临时绕过去。

操作是这样的:

  1. 开机进入 GRUB 菜单,选中 “Ubuntu” 那一行,按e进入编辑模式。
  2. 找到以linux开头的那一行,通常长这样:
    linux /boot/vmlinuz-...-generic root=UUID=... ro quiet splash $vt_handoff
  3. 把quiet splash删掉,或者在行尾加一个nomodeset,变成:
    linux /boot/vmlinuz-...-generic root=UUID=... ro nomodeset
  4. 按Ctrl+X或者F10启动。

如果运气好,这次就能进到图形界面。进去以后别犹豫,直接按第 3 节的方法把误装的驱动清掉。如果加了 nomodeset 还是黑屏,再按Ctrl+Alt+F3切到 tty 尝试登录。能登录说明内核和文件系统没问题,只是图形栈坏了。

2.2 终端还能用:用 Recovery Mode 的 root Shell

如果 nomodeset 也救不回来,Ubuntu 20.04 自带 recovery 模式,这是一个很可靠的入口。

在 GRUB 菜单里选择 “Advanced options for Ubuntu”,里面会看到带(recovery mode)的选项,选中进入。屏幕上会弹出一个菜单,选择 “root” 进入 root shell。

要注意的是,recovery 模式默认会把根文件系统挂成只读。进去第一件事就是重新挂成可读写:

mount -o remount,rw /

然后你就可以直接操作系统了。清驱动、重建 initramfs 都在这个 shell 里完成。只不过 recovery 模式下网络默认不一定打开,如果后面需要重新安装驱动,先启一下网络:

dhclient

或者手动配 IP,总之保证apt能联网。

2.3 最稳妥的后路:Live USB + chroot

如果连 recovery 模式都进不去,或者你是在一台被折腾得非常彻底的机器上操作,那就用 Live USB。

找另一个正常的电脑,做一个 Ubuntu 20.04 的启动 U 盘,选择 “Try Ubuntu”,进入临时桌面环境。然后在终端里把硬盘上原来那个 Ubuntu 系统挂载进来,用 chroot 进入修复。

先看一下分区情况:

sudo lsblk -f

找到根分区和 EFI 分区。常见情况是一个 ext4 的根分区(比如/dev/nvme0n1p2)和一个 vfat 的 EFI 分区(比如/dev/nvme0n1p1)。如果你的/boot是单独分区,也要挂上。

sudo mount /dev/nvme0n1p2 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt

进入 chroot 之后,你就像是坐在原来那个系统里一样,可以执行 apt 命令。这个方法比 recovery 模式更灵活,尤其是需要重装内核、重建引导的时候。我个人建议,如果你手头有 U 盘,直接用 Live USB + chroot,能少走很多弯路。

3. 把误装的驱动和依赖清干净

进了修复环境,第一件事不是急着装新驱动,而是把现有的错误驱动彻底清掉。很多人栽在“装驱动”这一步,就是因为没清干净,新旧模块混在一起,重启之后还是一样黑屏。

3.1 先确认到底装了哪些 nvidia 相关包

在修复环境里先看看系统里有什么:

dpkg -l | grep -i nvidia dpkg -l | grep -i cuda

输出里会有很多带nvidia-前缀的包,比如nvidia-driver-xxx、libnvidia-gl、nvidia-utils-xxx等等。你要做的是把这些全部清掉,一个不留。下载下来的 runfile 安装包还可能会往/opt或/usr/src里塞东西,之后单独处理。

如果原来是拿官网 runfile 装的驱动,系统里可能没有对应的 deb 包。这时候检查/usr/bin/nvidia-uninstall是否存在,存在的话先执行它:

/usr/bin/nvidia-uninstall

没有这个命令也不是坏事,说明它可能就只是 apt 装的,按下面代码清就行。

3.2 清包、清内核模块、清残留配置

用 apt 清理是最省事的:

apt purge '*nvidia*' 'libnvidia*'

注意 purge 比 remove 更彻底,会连配置文件一起删。执行完再补一句:

apt autoremove

autoremove 会把因为 nvidia 驱动才装进来的、现在已经没有任何依赖需要的包一起清掉,比如 nvidia-dkms、nvidia-kernel-common 之类。这一步很重要,光 purge 主包不 autoremove,残留的内核模块还是会带着走。

接着检查 modprobe 配置:

ls /etc/modprobe.d/

之前安装驱动时,系统可能会生成一个blacklist-nvidia-nouveau.conf或者nvidia-dkms.conf。如果 nvidia 已经清掉,这个 blacklist 不该继续留着,否则 nouveau 也被禁了,你进桌面以后图形加速就是零。删掉它:

rm -f /etc/modprobe.d/blacklist-nvidia-nouveau.conf rm -f /etc/modprobe.d/nvidia*.conf

再检查/etc/X11/xorg.conf和/etc/X11/xorg.conf.d/里面有没有 nvidia 相关的 Device 配置。有的话也移除或改名备份。这步针对的是“能进桌面但进不去显卡驱动”的问题。

3.3 重建 initramfs 和 GRUB 引导

清完包之后,最关键的一步来了:重建 initramfs。initramfs 是内核启动时用的临时根文件系统,里面包含硬件驱动模块。nvidia-dkms 在安装时会把 nvidia 内核模块塞进 initramfs,卸载后如果不重建,下次启动还是会尝试加载已经不存在的模块,可能继续黑屏。

执行:

update-initramfs -u

然后重建 GRUB 菜单:

update-grub

如果你在 chroot 环境里,执行这些命令时会自动读写硬盘上的配置。执行完没有报错之后,重启试试。正常情况下,系统应该能回到开头那种用 nouveau 驱动的状态,虽然性能一般,但至少能开机进桌面。

4. 别再用错误姿势装驱动:选版、避坑、安全启动

驱动清干净了,问题解决了一半。另一半是怎么装一个“不会把系统搞挂”的驱动。

4.1 认清显卡型号,让系统自己推荐驱动

不要再凭感觉找驱动了。先看硬件:

lspci -nn | grep -i nvidia

输出里能看到你的显卡型号。但型号只是参考,最靠谱的是让系统推荐:

sudo apt update sudo ubuntu-drivers devices

这个命令会扫描硬件并列出仓库里可用的 NVIDIA 驱动版本,还会标出哪个是 recommended。一般情况下,直接安装 recommended 版本就够了:

sudo ubuntu-drivers install

如果你更喜欢手动指定,就用sudo apt install nvidia-driver-xxx,xxx 填ubuntu-drivers devices列出的版本号。有一点要注意:20.04 软件源里的驱动版本和 22.04 不完全一样,别拿网上搜到的新版本号硬套仓库里没有的包名,装不上去还是小事,装版本不匹配的依赖出问题才是麻烦。

4.2 官方仓库安装和官网 runfile 安装怎么选

我的态度非常明确:能用 apt 就不要跑官网 runfile。

apt 安装的驱动有几个优势:

  • Ubuntu 官方仓库里的版本是测过的。
  • 驱动会注册到 DKMS,内核更新时会自动编译对应的新模块。
  • 卸载干净,一条apt purge就能撤干净。

而 runfile 安装包虽然能拿到最新版本,但它不会自动跟进内核升级。内核一更新,驱动模块没重新编译,你可能又变成开机黑屏。而且 runfile 安装的卸载路径比较脏,光删/opt/nvidia是删不干净的。

有些显示服务器场景下确实只能跑 runfile,但如果你没有特殊需求,别折腾。

4.3 安全启动和内核模块签名是大坑

这是新手最容易忽略的坑之一。

如果你的主板开启了 Secure Boot,apt 安装完 NVIDIA 驱动后,重启时大概率会进入一个蓝色的 MOK 管理界面。这个界面要求你选择 Enroll MOK,然后输入密码,确认签名导入。如果你没注意到这个界面,直接重启过去,NVIDIA 内核模块会因为签名不被信任而拒绝加载,驱动等于白装,nvidia-smi会提示找不到驱动。

所以装完驱动第一次重启,看到蓝色界面时不要慌:

  1. 选择 “Enroll MOK”。
  2. 选择 “Continue”,确认把新密钥导入。
  3. 输入之前设置的密码(如果你不是自己导入过,通常是装驱动时 dkms 提示设置的)。

之后重启就没问题了。如果你完全不想折腾安全引导,可以进 BIOS 把 Secure Boot 关掉,但双系统环境下关不关要看你自己的风险取舍,我只是说这个选项存在。

4.4 装完以后怎么验证

驱动装完之后,一定先确认真的生效了:

nvidia-smi

能正常显示显卡型号、驱动版本、显存占用,说明驱动层没问题。再跑:

glxinfo | grep -i renderer

输出里应该出现类似NVIDIA Corporation的字样,而不是llvmpipe这种软件渲染。看到llvmpipe说明 nvidia 模块根本没加载,或者被 fallback 到了 CPU 渲染。

5. 遇到问题别慌:常见症状与排查实录

理论和流程说完了,实际处理时总会出现各种意外情况。我整理了几个高频故障,你自己对照着排查。

5.1 一张表看懂“哪种故障对应哪种原因”

现象可能原因优先处理办法
卡在 Ubuntu Logo 转圈显卡驱动与 KMS 冲突GRUB 里加 nomodeset,进系统后清重装
黑屏但按 Ctrl+Alt+F3 能进 tty显示管理器或 Xorg 起不来在 tty 里卸载 nvidia,重建 initramfs
登录界面输入密码后闪回Xorg 配置与 nvidia 模块不匹配删除 /etc/X11/xorg.conf 相关配置,重装驱动
能进桌面但分辨率很低nvidia 模块未加载,回退到软件渲染检查 nvidia-smi,检查 Secure Boot MOK
安装后启动提示 module verification failed安全启动签名没导入重启用 MOK Enroll 导入密钥
清完驱动重启还黑屏initramfs 没有重建执行 update-initramfs -u 后重启

这张表就是我的排查框架,先定位故障在哪一层,再动手,效率高很多。

5.2 几个容易踩的坑

第一个坑:只 purge 不 autoremove。残留的 nvidia-dkms 会在下次 update-initramfs 时把旧模块重新编进去,你会陷入“清了又回来”的循环。所以 purge 之后一定要跑 autoremove。

第二个坑:混用安装方式。之前用 apt 装过 nvidia-driver,后来又在官网下 runfile 强行覆盖,这是最糟糕的组合。runfile 不会去清理 apt 的 deb 包,两套文件相互覆盖,Xorg 根本不知道加载哪一个。碰到这种情况,先回 Live USB 环境全部清掉,再选一种方式重装。

第三个坑:内核版本和 nvidia-dkms 目录不对应。你可以在/var/lib/dkms/nvidia/下看到编译过的内核版本号。如果里面没有当前uname -r对应的目录,说明 DKMS 编译失败或者内核 headers 没装。解决办法是安装内核 headers:

sudo apt install linux-headers-$(uname -r)

然后再执行sudo dpkg --configure -a,让 dkms 重新编译。

5.3 我一般按这个顺序排查

如果你现在正面对一台黑屏机器,我建议按下面的顺序来,不要跳步:

  1. 第一步:手边有 U 盘就直接做 Live USB,进 chroot。
  2. 第二步:在 chroot 里先看/var/log/Xorg.0.log和journalctl -b -1 -e,找到真正报错的模块。如果是 nvidia 相关,直接进入清驱动流程。
  3. 第三步:purge 所有 nvidia 包,autoremove,删 blacklist,重建 initramfs。
  4. 第四步:如果能进桌面,再通过ubuntu-drivers devices选 recommended 版本重新安装。
  5. 第五步:重启时留意 Secure Boot 的 MOK 界面,不要直接略过。

这套顺序我不敢说治百病,但处理“误装 nvidia 驱动导致无法开机”这个场景,成功率非常高。

6. 写在最后:一点个人体会

处理这类问题,最重要的不是背命令,而是冷静判断系统卡在哪一层。我见过太多人一黑屏就重装系统,重装完又手滑装了不对的驱动,循环折腾。其实在动手之前,花几分钟想清楚“我现在能不能看到 GRUB”“能不能进 tty”“文件系统还能不能挂载”,问题就已经解决一半了。

另外分享一个小习惯:我在 Ubuntu 20.04 里装任何显卡驱动之前,一定会先备份/etc/X11/、/etc/modprobe.d/和/boot/grub/grub.cfg。这些配置看着不起眼,但出问题时能让你三分钟恢复到上一个可用状态。平时多花半分钟,灾难时刻能省下整个通宵。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进