【如何恢复 Ubuntu 引导分区:Windows11 + Ubuntu22.04 双系统 GRUB 修复踩坑记录】

一、问题描述

本人电脑是 Windows 11 + Ubuntu 22.04 双系统

这次问题是误删了 Ubuntu 引导相关内容之后出现的。刚开始我以为只是 `/boot/efi` 里的 Ubuntu 引导没了,所以第一反应就是用 Boot-Repair 去修 GRUB。

但后面发现,这次并不是单纯的 GRUB 问题,而是几个问题叠在一起:

  1. Ubuntu 引导项需要恢复;
  2. `/boot` 目录中的内核文件缺失;
  3. `/etc/fstab` 中还保留着已经不存在的挂载项,导致最后进了 emergency mode。

最开始的表现是:

  • Windows 可以正常启动;
  • BIOS 里面还能看到 `ubuntu` 启动项;
  • 选择 `ubuntu` 后可以进入 GRUB;
  • 但是 GRUB 菜单里面 **只有 Windows Boot Manager**;
  • Ubuntu 启动项不见了。

图:BIOS 中还能看到 ubuntu 启动项

图:GRUB 菜单中只有 Windows Boot Manager

这里先说一个判断重点:

|--------------------------------------------------------------------------------------------------------|
| 重点:**BIOS 里有 ubuntu,说明 EFI 启动项不一定丢了;GRUB 能出来,说明 GRUB 本身也不是完全坏掉。真正的问题可能是 GRUB 找不到 Ubuntu 的内核。** |

所以这篇文章不是简单写"怎么修 GRUB",而是记录我这次完整的排查过程。

二、总的解决思路

这次最后的修复路线大概是:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 启动盘进入 Live Ubuntu → 先尝试 Boot-Repair 修复通用引导 → 如果 GRUB 里仍然只有 Windows,就检查 /boot → 重新安装内核,恢复 vmlinuz 和 initrd.img → update-grub 重新生成启动菜单 → grub-install 重新安装 GRUB → 如果进入 emergency mode,再修 /etc/fstab |

重点其实就两个:

|---------------------------------------------------------------------------------------------------------------|
| 1. GRUB 只有 Windows:重点查 /boot 里有没有 vmlinuz 和 initrd.img 2. Ubuntu 进入 emergency mode:重点查 /etc/fstab 有没有挂载不存在的分区 |

三、通用方法:先用 Boot-Repair 恢复 Ubuntu 引导

如果只是普通的 Ubuntu 引导丢失,比如 Windows 更新后启动顺序乱了,或者误删了 `/boot/efi/EFI/ubuntu`,可以先尝试 Boot-Repair。

1. 准备 Ubuntu 启动盘

准备一个 U 盘,把 Ubuntu 22.04 镜像烧录进去。

可以使用:

  • balenaEtcher
  • Rufus
  • Ventoy

2. 从 U 盘启动

进入 BIOS,选择从 U 盘启动。

注意,尽量选择带有 `UEFI` 字样的 U 盘启动项:

|-----------|
| UEFI: USB |

不要选成 Legacy 模式,不然后面可能会遇到:

|------------------------------------------------|
| EFI variables are not supported on this system |

3. 进入 Try Ubuntu

进入 Ubuntu 启动盘后,不要点安装系统,选择:

|------------|
| Try Ubuntu |

4. 安装并运行 Boot-Repair

打开终端,输入:

|------------------------------------------------------------------------------------------------------------------------|
| sudo add-apt-repository ppa:yannubuntu/boot-repair -y sudo apt update sudo apt install -y boot-repair && boot-repair |

打开图形界面后,点击:

|--------------------|
| Recommended repair |

图:Boot-Repair 中点击 Recommended repair

正常情况下,等待几分钟后重启,GRUB 菜单就能恢复。

如果重启后还是直接进 Windows,可以进 BIOS,把启动顺序改成:

|-----------------------------------|
| 1. ubuntu 2. Windows Boot Manager |

四、为什么我这里 Boot-Repair 不够用?

我一开始也是先用 Boot-Repair 修的。

Boot-Repair 修完之后,BIOS 里能看到 `ubuntu` 启动项,选择后也能进入 GRUB。

但是问题还在:

|---------------------------------|
| GRUB 菜单里只有 Windows Boot Manager |

这说明 Boot-Repair 只是把基础引导修回来了一部分,但它没有解决 Ubuntu 内核启动文件的问题。

换句话说:

|--------------------------------------------------------------|
| 重点:**GRUB 已经能启动了,但它找不到 Ubuntu,所以菜单里没法生成 Ubuntu 选项。** |

这时候继续反复点 Boot-Repair 意义不大,应该去检查 `/boot`。

五、进入原 Ubuntu 系统环境

下面是我真正修好的步骤。

1. 用启动盘进入 Live Ubuntu

还是先进入:

|------------|
| Try Ubuntu |

然后打开终端。

2. 查看分区

执行:

|----------|
| lsblk -f |

我这里的分区大致是:

|----------------------------------------------------------------------------------------------------------------|
| /dev/nvme0n1p1 EFI 分区 /dev/nvme0n1p3 Windows /dev/nvme0n1p4 Data /dev/nvme0n1p5 Ubuntu 根分区 /dev/nvme0n1p6 swap |

重点确认两个分区:

|-------------------------------------------------|
| Ubuntu 根分区:/dev/nvme0n1p5 EFI 分区:/dev/nvme0n1p1 |

不同电脑分区号可能不一样,不能照抄,要以自己的 `lsblk -f` 结果为准。

3. 挂载 Ubuntu 根分区

|--------------------------------|
| sudo mount /dev/nvme0n1p5 /mnt |

4. 挂载 EFI 分区

|---------------------------------------------------------------------|
| sudo mkdir -p /mnt/boot/efi sudo mount /dev/nvme0n1p1 /mnt/boot/efi |

5. 绑定系统目录

|----------------------------------------------------------------------------|
| for i in /dev /dev/pts /proc /sys /run do sudo mount --bind i /mnti done |

6. chroot 进入原系统

|------------------|
| sudo chroot /mnt |

进入后提示符类似:

|----------------|
| root@ubuntu:/# |

六、检查 `/boot`:这里是本次问题的关键

进入 chroot 后,先确认是不是挂对了系统:

|---------------------|
| cat /etc/os-release |

我这里显示:

|--------------------|
| Ubuntu 22.04.5 LTS |

然后检查 `/boot`:

|----------|
| ls /boot |

当时我的结果是:

|-------------------|
| efi grub grub.bak |

图:检查 /boot,发现缺少 vmlinuz 和 initrd.img

正常 Ubuntu 的 `/boot` 目录应该有:

|----------------------------------------------------------------------------------------------------------|
| vmlinuz-6.x.x-xx-generic initrd.img-6.x.x-xx-generic config-6.x.x-xx-generic System.map-6.x.x-xx-generic |

但我这里没有 `vmlinuz` 和 `initrd.img`。

这里就能确定:

|----------------------------------------------------------------------------------------------|
| 重点:**不是 GRUB 菜单自己抽风,而是 `/boot` 里的 Ubuntu 内核启动文件丢了。GRUB 找不到内核,自然就不会生成 Ubuntu 启动项。** |

七、确认内核包还在不在

先查看系统里还有没有内核包记录:

|-----------------------------|
| dpkg -l | grep linux-image |

我这里还能看到类似:

|----------------------------------------------------------------------------------------------------------------|
| linux-image-6.8.0-49-generic linux-image-6.8.0-52-generic linux-image-6.8.0-90-generic linux-generic-hwe-22.04 |

再看模块目录:

|-----------------|
| ls /lib/modules |

能看到:

|----------------------------------------------------|
| 6.8.0-49-generic 6.8.0-52-generic 6.8.0-90-generic |

所以我的情况是:

|-------------------------------------------------|
| 重点:**内核包和模块还在,但 `/boot` 里的实际启动文件丢了。** |

这种情况不用急着重装系统,重新安装对应内核包即可。

八、重新生成 `/boot` 里的内核文件

我这里重新安装当前内核包。

先更新软件源:

|------------|
| apt update |

然后重新安装当前内核。

我这里用的是 `6.8.0-90-generic`:

|------------------------------------------------------|
| apt install --reinstall linux-image-6.8.0-90-generic |

如果不确定版本,可以根据前面的:

|-----------------------------|
| dpkg -l | grep linux-image |

选择最新的那个版本。

也可以补充重装 HWE 元包:

|-------------------------------------------------|
| apt install --reinstall linux-generic-hwe-22.04 |

安装完成后检查 `/boot`:

|--------------|
| ls -lh /boot |

此时应该能看到:

|-----------------------------------------------------------------------------------------------------------------------------------------------|
| vmlinuz -> vmlinuz-6.8.0-90-generic vmlinuz-6.8.0-90-generic initrd.img -> initrd.img-6.8.0-90-generic initrd.img-6.8.0-90-generic efi grub |

看到 `vmlinuz` 和 `initrd.img` 后,说明关键文件已经恢复。

九、重新生成 GRUB 菜单

执行:

|-------------|
| update-grub |

如果提示找不到命令,可以执行:

|--------------------------------------|
| grub-mkconfig -o /boot/grub/grub.cfg |

正常情况下会看到:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| Found linux image: /boot/vmlinuz-6.8.0-90-generic Found initrd image: /boot/initrd.img-6.8.0-90-generic Found Windows Boot Manager on /dev/nvme0n1p1 done |

图:update-grub 成功识别到 Ubuntu 内核

这里重点看两行:

|--------------------------------------|
| Found linux image Found initrd image |

只要出现这两行,就说明 GRUB 已经识别到 Ubuntu 了。

小坑:grub-probe 报 `/dev/sda2`

我当时出现过:

|-----------------------------------------------------------|
| grub-probe: error: cannot find a GRUB drive for /dev/sda2 |

这个不一定是硬盘问题。

我这里 `/dev/sda2` 是 U 盘 / Ventoy 分区,不是电脑硬盘里的 Ubuntu 分区。

只要最后能看到:

|----------------------------------------------------------------------|
| Found linux image Found initrd image Found Windows Boot Manager done |

就可以继续往下走。

十、重新安装 GRUB

执行:

|---------------------------------------------------------------------------------------------|
| grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck |

我这里出现过:

|------------------------------------------------------------------------------------------------------------------------------------------|
| EFI variables cannot be set on this system. You will have to complete the GRUB setup manually. Installation finished. No error reported. |

这个提示看起来比较吓人,但我这里不是致命问题。

因为 BIOS 里本来就已经有 `ubuntu` 启动项,而且最后显示:

|-------------------------------------------|
| Installation finished. No error reported. |

所以可以继续。

如果 BIOS 里面没有 `ubuntu`,再考虑用 `efibootmgr` 单独创建 UEFI 启动项。

十一、重启测试

退出 chroot:

|------|
| exit |

重启:

|-------------|
| sudo reboot |

重启时拔掉 U 盘。

进入 BIOS,把启动顺序设置为:

|-----------------------------------|
| 1. ubuntu 2. Windows Boot Manager |

正常情况下,这时 GRUB 菜单里应该有:

|---------------------------------------------------------|
| Ubuntu Advanced options for Ubuntu Windows Boot Manager |

十二、如果进入 emergency mode

我这次又遇到了第二个问题:Ubuntu 开始启动了,但进入了 emergency mode。

图:Ubuntu 启动后进入 emergency mode

这里要注意:

|-------------------------------------------------------------------------------|
| 重点:**能进入 emergency mode,说明 GRUB 和内核大概率已经修好了。现在的问题通常是系统启动过程中某个挂载项失败。** |

在 emergency mode 里执行:

|--------------------|
| systemctl --failed |

然后查看 `/etc/fstab`:

|----------------|
| cat /etc/fstab |

我这里发现有两个旧挂载项:

|------------------------------------------------------------------------------------------------------------------------------------|
| UUID=8713f31d-8d64-4fec-b292-92173181a05b /boot ext4 defaults 0 2 UUID=cbf0a282-a120-461c-982e-dbb681c1157c /tmp ext4 defaults 0 2 |

但是实际分区里面已经没有对应的 `/boot` 和 `/tmp` 独立分区。

所以系统启动时一直尝试挂载不存在的分区,最后进入 emergency mode。

十三、修复 `/etc/fstab`

先把根分区重新挂载成可写:

|-----------------------|
| mount -o remount,rw / |

备份 fstab:

|------------------------------|
| cp /etc/fstab /etc/fstab.bak |

编辑:

|-----------------|
| nano /etc/fstab |

把不存在的 `/boot` 和 `/tmp` 挂载项注释掉:

|----------------------------------------------------------------------------------------------------------------------------------------|
| # UUID=8713f31d-8d64-4fec-b292-92173181a05b /boot ext4 defaults 0 2 # UUID=cbf0a282-a120-461c-982e-dbb681c1157c /tmp ext4 defaults 0 2 |

图:编辑 /etc/fstab,注释掉不存在的挂载项

保留正常的根分区、EFI 分区和 swap:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| UUID=53d8d19f-bc21-4846-851f-65c7c7b64ae0 / ext4 errors=remount-ro 0 1 UUID=DBCF-B0C1 /boot/efi vfat umask=0077 0 1 UUID=ad453f2a-9caf-46fc-9a1b-b68e5be702dc none swap sw 0 0 |

保存:

|-------------------------|
| Ctrl + O Enter Ctrl + X |

测试挂载:

|----------------------------------|
| systemctl daemon-reload mount -a |

如果没有报错,就重启:

|--------|
| reboot |

十四、最终结果

修复完成后,GRUB 菜单恢复:

|---------------------------------------------------------|
| Ubuntu Advanced options for Ubuntu Windows Boot Manager |

Ubuntu 可以正常启动,Windows 也可以从 GRUB 里启动。

最后放一张流程汇总图,后面自己复盘也方便。

图:本次 Ubuntu 引导修复流程汇总

十五、重点总结

1. 如果只是 Ubuntu 引导没了

先用 Boot-Repair:

|------------------------------------------------------------------------------------------------------------------------|
| sudo add-apt-repository ppa:yannubuntu/boot-repair -y sudo apt update sudo apt install -y boot-repair && boot-repair |

然后点击:

|--------------------|
| Recommended repair |

2. 如果 GRUB 菜单只有 Windows

不要只盯着 GRUB,先检查:

|----------|
| ls /boot |

如果没有:

|--------------------|
| vmlinuz initrd.img |

那就需要重新安装内核:

|--------------------------------------------------|
| apt install --reinstall linux-image-当前版本-generic |

3. 如果 `update-grub` 能看到 `Found linux image`

说明 Ubuntu 已经被 GRUB 识别到了。

关键输出是:

|-----------------------------------------------------------------|
| Found linux image Found initrd image Found Windows Boot Manager |

4. 如果 Ubuntu 进入 emergency mode

优先检查:

|----------------|
| cat /etc/fstab |

重点看有没有已经不存在的分区,比如:

|----------------------|
| /boot /tmp /mnt/data |

把不存在的挂载项注释掉,再执行:

|----------|
| mount -a |

5. `/boot` 和 `/boot/efi` 不要搞混

这点很重要。

|-----------|
| /boot/efi |

是 EFI 分区,里面通常有:

|--------------------------|
| EFI/Microsoft EFI/ubuntu |

而:

|-------|
| /boot |

里面放的是 Ubuntu 内核文件:

|--------------------|
| vmlinuz initrd.img |

我这次就是:

|-----------------------------------------------------------|
| /boot/efi 正常 GRUB 也正常 但是 /boot 里的 vmlinuz 和 initrd.img 没了 |

所以 GRUB 菜单里才只有 Windows。

十六、这次踩坑的核心

这次修复最大的坑是:一开始以为只是 GRUB 丢了。

但实际问题是:

|------------------------------------------------------------|
| 1. Ubuntu 引导项需要恢复 2. /boot 里的内核文件缺失 3. /etc/fstab 里还有错误挂载项 |

所以最后的修复路线不是单纯执行一次 Boot-Repair,而是:

|----------------------------------------------------------------------------------------------------------------------------|
| Boot-Repair 恢复基础引导 → chroot 进入原系统 → 重新安装内核恢复 /boot → update-grub 生成启动菜单 → grub-install 写入 EFI → 修改 fstab 解决 emergency mode |

写这篇主要是记录一下,避免以后再遇到类似问题时,只在 Boot-Repair 上反复折腾。

此处是文档连接:https://download.csdn.net/download/m0_51759289/92972877,适合保存下来。

相关推荐
流浪0011 小时前
Linux系统篇(五):Linux 进程控制全解:fork、exec、wait 核心原理与实战
linux·运维·服务器
不会就选b1 小时前
Linux之make,makefile
linux·运维·服务器
code monkey.1 小时前
【Linux之旅】HTTP 协议解析:从请求格式到构建 Web 服务器
linux·服务器·网络·http
l齐天2 小时前
Ubuntu 中编译 Go + PBC 程序为 Windows 11 可运行文件
windows·ubuntu·golang
vortex52 小时前
Linux 传统设计哲学:通过调用名区分行为的艺术
linux·运维·网络
嵌入式-老费2 小时前
esp32开发与应用(esp32-s3的usb转串口功能)
linux·运维·服务器
壮Sir不壮2 小时前
GO语言——GMP调度模型
linux·开发语言·golang·go·操作系统·线程·协程
m0_693200652 小时前
VSCode使用ssh remote插件远程连接linux主机
linux·vscode·ssh
筵陌2 小时前
Linux网络数据链路层
linux·网络