一、问题描述
本人电脑是 Windows 11 + Ubuntu 22.04 双系统。
这次问题是误删了 Ubuntu 引导相关内容之后出现的。刚开始我以为只是 `/boot/efi` 里的 Ubuntu 引导没了,所以第一反应就是用 Boot-Repair 去修 GRUB。
但后面发现,这次并不是单纯的 GRUB 问题,而是几个问题叠在一起:
- Ubuntu 引导项需要恢复;
- `/boot` 目录中的内核文件缺失;
- `/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 |
重点其实就两个:
| 1. GRUB 只有 Windows:重点查 /boot 里有没有 vmlinuz 和 initrd.img |
三、通用方法:先用 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 |
打开图形界面后,点击:
| Recommended repair |

图:Boot-Repair 中点击 Recommended repair
正常情况下,等待几分钟后重启,GRUB 菜单就能恢复。
如果重启后还是直接进 Windows,可以进 BIOS,把启动顺序改成:
| 1. ubuntu |
四、为什么我这里 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 分区 |
重点确认两个分区:
| Ubuntu 根分区:/dev/nvme0n1p5 |
不同电脑分区号可能不一样,不能照抄,要以自己的 `lsblk -f` 结果为准。
3. 挂载 Ubuntu 根分区
| sudo mount /dev/nvme0n1p5 /mnt |
4. 挂载 EFI 分区
| sudo mkdir -p /mnt/boot/efi |
5. 绑定系统目录
| for i in /dev /dev/pts /proc /sys /run |
6. chroot 进入原系统
| sudo chroot /mnt |
进入后提示符类似:
| root@ubuntu:/# |
六、检查 `/boot`:这里是本次问题的关键
进入 chroot 后,先确认是不是挂对了系统:
| cat /etc/os-release |
我这里显示:
| Ubuntu 22.04.5 LTS |
然后检查 `/boot`:
| ls /boot |
当时我的结果是:
| efi |

图:检查 /boot,发现缺少 vmlinuz 和 initrd.img
正常 Ubuntu 的 `/boot` 目录应该有:
| vmlinuz-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 |
再看模块目录:
| ls /lib/modules |
能看到:
| 6.8.0-49-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` 和 `initrd.img` 后,说明关键文件已经恢复。
九、重新生成 GRUB 菜单
执行:
| update-grub |
如果提示找不到命令,可以执行:
| grub-mkconfig -o /boot/grub/grub.cfg |
正常情况下会看到:
| Found linux image: /boot/vmlinuz-6.8.0-90-generic |

图:update-grub 成功识别到 Ubuntu 内核
这里重点看两行:
| Found linux 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 |
就可以继续往下走。
十、重新安装 GRUB
执行:
| grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck |
我这里出现过:
| EFI variables cannot be set on this system. |
这个提示看起来比较吓人,但我这里不是致命问题。
因为 BIOS 里本来就已经有 `ubuntu` 启动项,而且最后显示:
| Installation finished. No error reported. |
所以可以继续。
如果 BIOS 里面没有 `ubuntu`,再考虑用 `efibootmgr` 单独创建 UEFI 启动项。
十一、重启测试
退出 chroot:
| exit |
重启:
| sudo reboot |
重启时拔掉 U 盘。
进入 BIOS,把启动顺序设置为:
| 1. ubuntu |
正常情况下,这时 GRUB 菜单里应该有:
| Ubuntu |
十二、如果进入 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 |
但是实际分区里面已经没有对应的 `/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 |

图:编辑 /etc/fstab,注释掉不存在的挂载项
保留正常的根分区、EFI 分区和 swap:
| UUID=53d8d19f-bc21-4846-851f-65c7c7b64ae0 / ext4 errors=remount-ro 0 1 |
保存:
| Ctrl + O |
测试挂载:
| systemctl daemon-reload |
如果没有报错,就重启:
| reboot |
十四、最终结果
修复完成后,GRUB 菜单恢复:
| Ubuntu |
Ubuntu 可以正常启动,Windows 也可以从 GRUB 里启动。
最后放一张流程汇总图,后面自己复盘也方便。

图:本次 Ubuntu 引导修复流程汇总
十五、重点总结
1. 如果只是 Ubuntu 引导没了
先用 Boot-Repair:
| sudo add-apt-repository ppa:yannubuntu/boot-repair -y |
然后点击:
| Recommended repair |
2. 如果 GRUB 菜单只有 Windows
不要只盯着 GRUB,先检查:
| ls /boot |
如果没有:
| vmlinuz |
那就需要重新安装内核:
| apt install --reinstall linux-image-当前版本-generic |
3. 如果 `update-grub` 能看到 `Found linux image`
说明 Ubuntu 已经被 GRUB 识别到了。
关键输出是:
| Found linux image |
4. 如果 Ubuntu 进入 emergency mode
优先检查:
| cat /etc/fstab |
重点看有没有已经不存在的分区,比如:
| /boot |
把不存在的挂载项注释掉,再执行:
| mount -a |
5. `/boot` 和 `/boot/efi` 不要搞混
这点很重要。
| /boot/efi |
是 EFI 分区,里面通常有:
| EFI/Microsoft |
而:
| /boot |
里面放的是 Ubuntu 内核文件:
| vmlinuz |
我这次就是:
| /boot/efi 正常 |
所以 GRUB 菜单里才只有 Windows。
十六、这次踩坑的核心
这次修复最大的坑是:一开始以为只是 GRUB 丢了。
但实际问题是:
| 1. Ubuntu 引导项需要恢复 |
所以最后的修复路线不是单纯执行一次 Boot-Repair,而是:
| Boot-Repair 恢复基础引导 |
写这篇主要是记录一下,避免以后再遇到类似问题时,只在 Boot-Repair 上反复折腾。
此处是文档连接:https://download.csdn.net/download/m0_51759289/92972877,适合保存下来。

276

被折叠的 条评论
为什么被折叠?



