一、问题描述
本人电脑是 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 → 先尝试 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,适合保存下来。