上周一个朋友急急忙忙找我,说电脑开机直接黑屏,屏幕正中间只有一个孤零零的grub>提示符,Ubuntu 怎么都起不来。我一听就猜到大概了:你最近是不是动过磁盘分区,或者拿 Windows 的磁盘管理清理过什么?他沉默了几秒,说前一天用某工具“清理无效分区”,顺手把一个几百 MB 的 EFI 分区给删了。好,破案了,这就是典型的“误删 Ubuntu 相关分区,开机掉进 grub 命令行”事故。
这个场景其实非常常见:双系统用户、手误删分区、调整磁盘容量时误格式化、Windows 更新把引导项覆盖掉,甚至有人只是把/boot目录当垃圾文件清掉了,重启后直接黑屏进 grub。别急着重装系统,也别慌着乱敲命令。这篇博文就专门聊一件事:开机黑屏进 grub 之后,怎么把 Ubuntu 救回来。我会把grub>和grub rescue>两种提示符分别怎么处理、如何手动引导进系统、如何用 Live USB + chroot 彻底修复引导,全部拆开讲清楚,适合双系统新手,也适合想弄明白 grub 引导原理的老手。
1. 先分清故障阶段:grub> 还是 grub rescue>
1.1 两种提示符代表完全不同的故障等级
很多人一看到 grub 界面就慌了,其实 grub 提示符分两种状态,处理思路天差地别。
屏幕显示的是grub>,说明 grub 主程序已经加载成功,基础模块都在内存里,只是找不到自动启动菜单或启动配置,所以退到了命令行模式。这种情况是最温柔的,你甚至可以用命令手动把系统拉起来。
屏幕显示的是grub rescue>,事情就麻烦一些。这是 grub 的救援模式,它连正常模块都没加载,只能执行ls、set、insmod等很少的几个命令,需要先手动告诉它“正常的 grub 模块在哪个分区、哪个路径”,才能继续往下救。
我在实际操作中遇到最多的情况是:用户平时根本不关心什么 EFI 分区、/boot目录,直到某一天删了个分区重启,才发现自己的系统变成了一个光秃秃的命令行。别慌,不管哪种提示符,都有对应的救法。
1.2 黑屏进 grub 的真正原因:引导链断了
要理解这个问题,得先搞明白电脑开机后到底发生了什么。以传统 BIOS + MBR 引导为例,开机流程是:主板固件 → MBR 里的引导程序 → grub 核心 → 读取/boot/grub/grub.cfg配置文件 → 加载 Linux 内核 → 启动系统。
UEFI 引导则略有不同:主板固件直接读取 EFI 系统分区(ESP)里的.efi引导文件,比如EFI/ubuntu/shimx64.efi,再由这个文件加载 grub,继续后面的流程。
你现在开机掉进 grub,本质上就是这条链路的某一环断了:MBR 被重写、EFI 系统分区被删除、/boot/grub目录里缺少模块、或者grub.cfg配置里的分区 UUID 对不上。所谓“误删 Ubuntu 导致黑屏进 grub”,绝大多数时候不是 Ubuntu 系统文件被删了,而是指向系统的“地图”丢了。
你可以把 grub 想成小区门口的保安,本来手里有一张住户清单(grub.cfg)和一个通信工具包(grub 模块),误删操作相当于把清单和工具包全扔了,保安只能坐在门口喊:告诉我你在哪一户,不然我谁都不放行。
1.3 先判断要不要救:你的 Ubuntu 数据还在吗
网上很多教程一上来就教你敲命令,但我建议先冷静 1 分钟,搞清楚一个关键问题:Ubuntu 的根分区到底还在不在。
如果只是 EFI 分区、/boot目录或 MBR 被搞坏了,根分区里存放的系统文件、/home下的资料都完好无损,这种情况必须救,而且大概率能救回来。
但如果你是误删了 Ubuntu 的根分区、格式化掉了“Linux 系统分区”,那数据基本没戏了,再修 grub 也只是修出一个“空壳”。这种极端情况下,与其花几个小时折腾,不如直接考虑重装系统,重点去恢复 Windows 引导即可。
快速判断方法:准备一个 Ubuntu Live U 盘启动进入试用模式,打开终端执行lsblk -f或sudo fdisk -l,看看磁盘列表里还有没有 ext4 格式、卷标可能写着 ubuntu 的分区。如果有,你的数据大概率还在,后面几章的方法可以使用。如果那一整块分区已经变成空闲空间,那真的是“误删 Ubuntu 本尊”了。
2. 还能进 grub>,手动把系统拉起来
2.1 第一步:用 ls 命令找到 Ubuntu 根分区
假设你现在屏幕上是grub>(不是 rescue),先别乱按,在提示符下输入ls回车。屏幕上会列出 grub 能识别到的所有磁盘和分区,大概长这样:
grub> ls (hd0) (hd0,msdos1) (hd0,msdos2) (hd0,msdos5)这里的hd0是第一块硬盘,msdos1表示第一个主分区(MBR 分区表风格),msdos5表示逻辑分区。如果你用的是 GPT 分区表和 UEFI,可能显示成(hd0,gpt1)这种格式,意思类似。
怎么判断哪一个是 Ubuntu 根分区?逐个探测就行:
grub> ls (hd0,msdos5)/如果这个分区是 Ubuntu 的根目录,你会看到/boot、/etc、/home、/usr这些熟悉的目录名。如果在某个分区上提示unknown filesystem或error: unknown filesystem,说明那不是 Linux 能识别的分区,直接跳过。
这个过程中可以用 Tab 键补全,比如输入ls (hd0,后按两下 Tab,grub 会提示可用的分区编号,省去手动敲。
2.2 手动指定内核参数并启动 Ubuntu
找到根分区后,手动引导就三步:设置 root、加载内核、加载 initrd,然后 boot。
grub> set root=(hd0,msdos5) grub> linux /boot/vmlinuz-generic root=/dev/sda5 grub> initrd /boot/initrd.img-generic grub> boot注意几个坑。第一,linux后面跟的内核文件名我写的是vmlinuz-generic,这只是个通配习惯,实际文件名一定带完整版本号,比如vmlinuz-6.8.0-51-generic。最靠谱的做法是敲linux /boot/vmlinuz-之后按 Tab 让 grub 自动补全,能少敲不少字。
第二,root=/dev/sda5里的sda5要和 grub 分区编号对应起来:(hd0,msdos5)对应 Linux 下的/dev/sda5。如果你用的是 NVMe 固态,设备名是/dev/nvme0n1p5这种格式,注意别写错。
第三,如果你的/boot是独立分区,那么内核文件就不在/boot/vmlinuz-...下,而是直接在分区的根目录,命令要改成linux /vmlinuz-generic root=/dev/sda5。这也是为什么修 grub 前先ls看清楚目录结构很重要。
执行完boot后,屏幕开始滚动大量日志,看到登录界面或桌面就成功了。这个过程不一定会 100% 一次成功,如果内核路径写错,grub 会报error: file not found,用ls再看一眼文件名重试即可。
2.3 启动成功后的第一件事:备份数据,别急着“修复”
很多人千辛万苦手动引导进系统,第一反应就是赶紧执行sudo update-grub修复,我强烈建议你先忍一忍。
正确顺序是:先备份,再修复。因为接下来无论是用grub-install手动重建引导,还是用 boot-repair 一键修复,本质上是往磁盘引导区写入数据,万一中途断电或操作失误,情况可能比现在更糟。先打开终端,把你最重要的资料拷贝到移动硬盘或另一台机器上:
sudo rsync -av /home/用户名 /media/你的U盘/backup/至少把/home下的数据保住,这是个保底操作。数据安全落地之后,再开启修复流程,心理压力也会小很多。
3. grub rescue> 模式下的临时救急操作
3.1 告诉 grub 普通模块在哪里:set prefix 与 set root
如果你开机看到的是grub rescue>,说明 grub 连 normal 模块都没加载成功,所有和菜单、文件系统解析有关的命令都不可用。这个模式下能用的核心命令就是ls、set、insmod、normal。
先老办法,ls看分区列表,找到装有/boot/grub目录的那个分区,比如(hd0,msdos5)。然后在 rescue 模式下执行:
grub rescue> set prefix=(hd0,msdos5)/boot/grub grub rescue> set root=(hd0,msdos5) grub rescue> insmod normal grub rescue> normal这个操作相当于手动告诉 grub:你的模块仓库在这个分区的这个目录下。insmod normal是加载 normal 模块,让 grub 从精简模式升级到完整模式,normal则是让 grub 尝试读取配置并显示启动菜单。
如果一切顺利,你会看到熟悉的 grub 菜单,选择 Ubuntu 就能进去。但这里有个很常见的尴尬:normal命令执行后,菜单确实出来了,点 Ubuntu 却还是启动失败,或者直接黑屏不动。很多人卡在这一步,就会产生“我都 normal 了怎么还不行”的疑问。
3.2 normal 之后还是不行?回到手动引导
在 grub rescue 环境下,normal只是让 grub 尝试读取grub.cfg,如果配置里的 UUID 和实际分区对不上,菜单仍然无法正确引导系统。比如误删分区后,分区顺序变了,原来的 UUID 跟着变,grub.cfg里记录的旧 UUID 自然失效。
遇到这种情况,在 grub 菜单界面按c进入命令行,回到第 2 章的手动引导流程:set root、linux、initrd、boot,手动指定参数把系统拉起来。重点:手动引导时不要用 UUID 方式,直接使用/dev/sdaX方式指定根分区,跳过 grub.cfg 里的旧配置,成功概率会大很多。
3.3 临时救急只是权宜之计
用set prefix和normal临时恢复引导,本质上像是在寒冬里先给房子点了个火堆——能住人,但不是长久之计。因为下次重启时 grub 多半又找不到模块了,你还需要重复一遍这套命令。所以进入系统后,务必抓紧时间执行真正的修复,把 grub 重新安装到磁盘引导区并生成正确的配置文件,这是第 4、5 章的内容。
4. 进入系统后,用 boot-repair 或手动命令修复 grub
4.1 图形化修复:boot-repair 一键推荐修复
如果你觉得命令行操作容易出错,boot-repair 是一个救命的图形化工具,它做的事情本质上是:检测并挂载各个分区、重新安装 grub、扫描 Windows 和其他系统、重新生成 grub.cfg。在系统终端里依次执行以下命令安装并启动:
sudo add-apt-repository ppa:yannubuntu/boot-repair sudo apt update sudo apt install boot-repair boot-repair启动后会弹出一个窗口,直接点击“Recommended repair”。它会先联网检测,然后自动执行一系列修复工作,界面会滚动输出运行日志,最后提示修复成功或需要手动执行若干命令。
在这个过程中,建议保持网络畅通,因为 boot-repair 可能会安装额外组件,也更方便它通过 os-prober 识别 Windows 等系统。修复完成后重启,grub 菜单基本就回来了,里面会同时列出 Ubuntu 和 Windows。
有一点可以放心:boot-repair 的主要操作是往 EFI 分区写入引导文件和更新配置,不会碰你的个人数据。我之前遇到过 EFI 分区被误删的情况,boot-repair 会自动尝试重建 EFI 目录并重新注册引导项,成功率相当高。
4.2 不想装图形工具?手动 grub-install 也可以
如果你不想安装第三方 PPA 工具,或者 boot-repair 执行途中报错,手动修复也完全可行。流程只有两个核心命令:先安装 grub 到磁盘,再重新生成配置。
sudo grub-install /dev/sda sudo update-grub注意第一个命令的目标是整块磁盘(/dev/sda),而不是某个分区(/dev/sda1)。如果是传统 BIOS + MBR 引导,grub-install 会把引导代码写入磁盘的主引导记录区,也就是sda最前面的 446 字节;执行到这一步,grub 本体就已经重新写入磁盘了。update-grub则负责扫描所有已安装的系统,更新/boot/grub/grub.cfg,把 Ubuntu、Windows 的启动项重新生成出来。
如果你用的是 UEFI 引导,grub-install会自动检测 EFI 系统分区并写入EFI/ubuntu目录;但前提是 EFI 系统分区必须存在且已挂载在/boot/efi。如果之前误删过 EFI 分区,你可能需要先手动创建或恢复 EFI 分区,再执行 grub-install,这种情况下操作会复杂一些,建议直接跳到第 5 章的 Live USB + chroot 流程,在隔离环境里从容处理。
4.3 修复后的常见遗留问题:Windows 启动项不见了
修复 grub 成功,能进 Ubuntu,双系统用户通常还会碰到另一个问题:grub 菜单里没有 Windows。不用着急,这多半是os-prober没生效。
新版 Ubuntu 默认/etc/default/grub里有一行GRUB_DISABLE_OS_PROBER=false需要手动取消注释或添加,否则 update-grub 不会主动探测 Windows。改完之后执行:
sudo nano /etc/default/grub sudo update-grub再次重启,Windows 启动项一般就会出现在 grub 菜单里。如果没有,检查一下 Windows 所在的 EFI 分区是否还存在,以及 Windows 的引导文件EFI/Microsoft/Boot/bootmgfw.efi是否完好。
5. 最稳方案:Live USB + chroot 彻底修复 grub
5.1 准备启动盘,进入 Try Ubuntu
如果上面的方法都执行过了还是不成功,或者 grub 损坏极其严重,连系统都进不去,那就得动用终极手段:用 Ubuntu Live USB 启动进入“试用 Ubuntu”(Try Ubuntu)模式,从外部“侵入”硬盘系统,完成彻底修复。
准备工作很简单:找一个 U 盘,用 Rufus、balenaEtcher 或 Ventoy 等工具把 Ubuntu 安装镜像写入 U 盘,然后在 BIOS 启动菜单里选择从 U 盘启动。看到 Ubuntu 桌面后不要点“安装 Ubuntu”,而是点“试用 Ubuntu”,进入桌面环境后在终端操作。
这种方式的优势在于:整个过程不依赖硬盘上的任何东西,即使原系统的 grub 已经烂到无法运行,也不妨碍我们从 Live 系统里挂载并修复它。
5.2 挂载根分区、EFI 分区和必要的虚拟目录
打开终端后,第一步是搞清楚硬盘分区现状:
sudo fdisk -l lsblk -flsblk -f能看到每个分区的文件系统类型和 UUID,信息最直观。假设你的 Ubuntu 根分区是/dev/nvme0n1p5,EFI 系统分区是/dev/nvme0n1p1,挂载命令如下:
sudo mount /dev/nvme0n1p5 /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这里的顺序有讲究。先挂根分区,再挂 EFI 分区,因为 EFI 分区要挂载到/mnt/boot/efi这个子目录中。然后是/dev、/proc、/sys这几个虚拟文件系统——它们是系统运行的必要接口,chroot 之后如果没有绑定这些目录,很多命令会直接报错。有些教程还会让你挂/run,一般场景下这三个已经够用。
如果你的 Ubuntu 根分区原来有独立/boot分区,还需要额外把它挂到/mnt/boot,否则后续 grub-install 会找不到内核。
5.3 chroot 进入系统并重建引导
挂载完成后,就是用 chroot 进入“准系统”环境的时间:
sudo chroot /mnt执行之后,你的终端提示符会变成类似root@ubuntu:/#,此时你虽然身处 Live 系统,但操作的是硬盘上原来的 Ubuntu 系统,相当于“原地复活了它的系统环境”。接着按顺序执行:
grub-install /dev/nvme0n1 update-grub如果系统引导方式为 UEFI,grub-install 会写入 EFI 分区;如果为传统 BIOS 方式,会写入nvme0n1的 MBR 区。update-grub会扫描当前系统里所有内核以及所有已安装的其他系统,自动生成 grub.cfg。
执行完不要急着拔盘,先退出 chroot 并卸载挂载点:
exit sudo umount -R /mnt sudo reboot重启后拔掉 U 盘,正常情况下 grub 菜单会重新出现,Ubuntu 和 Windows 都能正常选择进入。
5.4 为什么这套流程几乎一定能救回来
很多人担心 chroot 操作看起来很“重”,怕把系统弄坏。其实 chroot 只是改变了当前终端所能看到的“根目录”,并没有对原系统做任何破坏性操作,它只是让你进入原系统环境执行命令而已。只要挂载步骤没搞错,grub-install 和 update-grub 的作用范围就是可控的。
这也是我个人最推荐的方法:boot-repair 偶尔会因为 PPA 源不可用或检测错误而失败,但 Live USB + chroot 是纯本地操作,不依赖网络,只要硬盘物理上是好的、根分区数据还在,成功率接近 100%。如果你对命令不熟悉,我建议你用这套方法,并且每一步都对照lsblk -f的输出仔细确认分区编号,不要想当然。
6. 常见错误提示与排查速查
6.1 高频报错对照表
我在处理 grub 问题这几年,遇到最多的报错信息就下面这几种,整理成表格方便你对照排查:
| 报错提示 | 含义 | 处理思路 |
|---|---|---|
error: file '/boot/grub/i386-pc/normal.mod' not found | grub 找不到 normal 模块 | 说明/boot/grub目录不完整或路径不对,用ls核对分区,执行set prefix/insmod normal |
error: unknown filesystem | 分区文件系统无法识别 | grub 当前不知道如何处理该分区,通常是分区被格式化或文件系统损坏,用ls逐个探测 |
error: disk 'hd0,msdosX' not found | 指定的分区不存在 | grub.cfg 中记录的旧分区号失效,按下c进入命令行手动引导,或进入系统后重新 update-grub |
error: no such partition | 找不到分区 | 分区布局变了,方法同上,进 Live USB 用lsblk -f查看实际分区 |
error: invalid arch-independent ELF magic | 尝试加载的文件不是有效的 grub 模块 | 常见于误把普通文件当模块加载,确认路径确实是/boot/grub/...下的.mod文件 |
Minimal BASH-like line editing is supported... | grub 命令行模式提示 | 说明 grub 本体启动成功但配置失效,按第 2 章手动引导即可 |
执行normal后菜单出来了但启动失败 | grub.cfg 里的 UUID 对不上 | 进命令行手动引导,进系统后 update-grub 重新生成配置 |
6.2 血的教训:这些操作最容易把问题搞得更严重
修复过程中最怕的不是 grub 本身,而是用户心急乱操作。
第一,不要在 grub 提示符下尝试“格式化”的命令,grub 命令行里没有所谓“格式化C盘”的概念,网上某些段子纯属玩笑,乱敲命令轻则无响应,重则破坏分区表。grub>下能执行的命令是有限的,如果不懂,就只用我上面提到的ls、set、linux、initrd、boot。
第二,不要在 Windows 磁盘管理或第三方分区工具里随意删除“未知分区”或“系统保留分区”。很多事故就是这么来的:看着一个 100MB 或 500MB 的小分区碍眼,想合并或删除,结果它正是双系统安装时创建的 EFI 系统分区,一删,grub 和 Windows 引导全都遭殃。
第三,使用 GParted 调整分区大小时,中途不要强制断电或重启。分区表或文件系统只写了一半,重启后可能出现比 grub 更麻烦的问题,比如根分区的文件系统损坏。
6.3 想少踩坑,记住三条建议
如果这篇文章只能留下三段话,那我希望你是为了记住这三点:
第一,任何涉及 Linux 分区的操作,开始前先打开lsblk -f看清楚分区现状,并截个图或抄下来,尤其是每个分区的设备名、大小、文件系统类型、挂载点。这张“地图”不仅给你安全感,也能在系统崩溃后快速定位问题。
第二,重要数据一定定期备份。系统可以重装,文档、照片和项目代码丢了才叫真损失。哪怕只是把/home目录整体打包到移动硬盘,也比追悔莫及强。
第三,如果你用的是双系统,Windows 更新后经常出现“开机直接进 Windows 不出现 grub 菜单”的情况,别急着动刀,先尝试在 BIOS 启动菜单里手动选择 ubuntu 启动项,很多时候只是引导顺序变了,grub 本身没坏,选择一次 Ubuntu 后进入系统执行sudo update-grub就能把菜单顺序拉回来。
我在实际维护中修 grub 的次数,说真的已经数不过来了,从最早的传统 BIOS + MBR,到后来的 UEFI + GPT,每次的场景都大同小异:某人不小心删了东西,重启后一脸懵。但修得多了你会发现一条规律:grub 这个东西看着脆弱,其实只要根分区和内核文件还在,它几乎永远都有救。真正让情况恶化的,往往是急于求成时的一通乱操作。所以如果你现在正对着 grub 提示符发愁,深呼吸,按着文章里的顺序,先用ls把分区情况摸清楚,再从手动引导开始一步一步来。最后再分享一个私人心得:修好 grub 之后,我习惯顺手给/etc/default/grub里的超时时间改成至少 10 秒,这样下次哪怕引导配置出问题,至少还能看清屏幕上发生了什么,而不是黑屏一闪而过。