【如何恢复 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 /mnt$i
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,适合保存下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值