当前位置:首页>Linux>Linux/Windows 双系统引导修复(下)——boot-repair 与手动修复进阶

Linux/Windows 双系统引导修复(下)——boot-repair 与手动修复进阶

  • 2026-09-02 17:20:25
Linux/Windows 双系统引导修复(下)——boot-repair 与手动修复进阶

大家好,我是冯哥的缓存。上篇聊了 GRUB 为什么会消失,以及用 Live USB 进入 chroot 手动修复的方法。今天聊一下两件事:一是更傻瓜的 boot-repair 一键修复工具;二是怎么防止 Windows 更新再次把 GRUB 干掉——修完不是终点,不再被干掉才是目标。

一、boot-repair:不想敲命令的救命工具

如果觉得 chroot 操作太复杂,boot-repair 是一个可以"一键修复"的图形化工具。

1. boot-repair 能干什么

boot-repair 是专门为引导修复设计的 Ubuntu 工具,主要功能:

功能
说明
Recommended Repair
自动分析引导问题并修复,覆盖 90% 的常见场景
GRUB 重装
自动检测 EFI 分区并重装 GRUB
修复 MBR
Legacy BIOS 环境同样支持
修复 os-prober
自动让 GRUB 重新检测 Windows 分区
生成引导报告
上传到网络,方便在论坛求助时分享

2. 怎么用 boot-repair

第一步:用 Ubuntu Live USB 启动

插入 Ubuntu Live USB,选择"Try Ubuntu"(不要安装),进入桌面。

第二步:联网

boot-repair 需要联网安装。点右上角网络图标,连接 Wi-Fi 或插网线。

⚠️ 注意: 如果网络不通,可以先参考上篇的 chroot 手动修复方法,不依赖网络。

第三步:安装 boot-repair

打开终端,执行:

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

第四步:启动并修复

boot-repair

图形界面打开后,直接点 "Recommended Repair"(推荐修复),然后按提示操作,全程鼠标操作即可。

修复结束后会弹出摘要,告诉你做了什么。按提示重启,引导菜单一般就回来了。

💡 提示: 如果 Recommended Repair 失败,界面上还有"Advanced options",可以手动指定安装 GRUB 到哪块硬盘的哪个分区。通常不需要动这里,但如果有多块硬盘,可能需要手动指定。比如系统装在NVMe SSD(/dev/nvme0n1)而EFI分区在SATA硬盘(/dev/sda1)时,boot-repair 可能识别错,需要手动选对EFI分区。

二、efibootmgr:手动管理 NVRAM 启动项

不管是手动 chroot 修复还是 boot-repair 修复,修完之后可能还想手动调整 NVRAM 里的启动顺序,让 GRUB 永远排第一。这时候用 efibootmgr。

1. 查看当前启动项

efibootmgr -v

输出示例:

BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0000,0002
Boot0000* Windows Boot Manager  HD(1,GPT,...)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0001* ubuntu                HD(1,GPT,...)/File(\EFI\ubuntu\shimx64.efi)
Boot0002  UEFI: USB Flash Drive ...
  • BootCurrent
    :本次实际用哪个启动项启动的
  • BootOrder
    :启动尝试顺序(从左到右,0001 优先于 0000)
  • Boot0000*
    :带星号表示该项已激活;无星号表示禁用

2. 修改启动顺序

把 GRUB(ubuntu,假设编号 0001)调到第一位:

# 查看完整BootOrder,然后按原样加上ubuntu排前面
efibootmgr -v

# 不要把其他启动项丢掉,否则可能无法从U盘启动
sudo efibootmgr --o 0001,0000,0002

顺序改完立即生效,重启就会按新顺序启动。

3. 删除多余的启动项

有时候会留下很多残余的启动项,可以删掉:

sudo efibootmgr --delete-bootnum --bootnum 0003

把 0003 换成要删的编号。

4. 手动添加 GRUB 启动项

如果 GRUB 条目不见了,可以手动添加(需要知道 EFI 分区在哪块硬盘的哪个分区):

# 先查 EFI 分区在哪
lsblk -f | grep -i vfat

# 假设 EFI 分区是 /dev/sda1(第一块硬盘的第一个分区)
sudo efibootmgr \
  --create \
  --disk /dev/sda \
  --part 1 \
  --label "ubuntu" \
  --loader '\EFI\ubuntu\shimx64.efi'

💡 提示:--loader 里的路径用反斜杠,这是 UEFI 标准要求的,不是 Linux 习惯。

三、防止 Windows 更新再次干掉 GRUB

这才是最关键的部分。很多人修了一次 GRUB,Windows 大版本更新后又被干掉,然后再修,循环往复。根本解法是把 GRUB 设成"不可被覆盖"的默认启动项。

方案一:把 GRUB 写入 fallback 路径(最简单)

UEFI 规定,如果 NVRAM 里的所有启动项都失败,会自动尝试 \EFI\Boot\bootx64.efi,这叫 fallback 路径。

Windows 更新会把自己的 bootmgfw.efi 复制到这个位置(也就是覆盖这里),这正是 GRUB 被"干掉"的机制之一。

**解法:把 GRUB 的 shimx64.efi 复制到 fallback 位置,并设置为优先。**如果想恢复,把 bootx64.efi.bak 复制回来就行。

# 挂载 EFI 分区(如果没挂载的话)
sudo mount /dev/sda1 /mnt/efi

# 备份 Windows 的 fallback(重要!)
sudocp /mnt/efi/EFI/Boot/bootx64.efi /mnt/efi/EFI/Boot/bootx64.efi.bak

# 安装shim-signed 包(如果没有安装)
sudo apt install shim-signed   

# 把 GRUB 的 shim 复制过去
sudocp /mnt/efi/EFI/ubuntu/shimx64.efi /mnt/efi/EFI/Boot/bootx64.efi

这样即使 NVRAM 被 Windows 改了,fallback 路径也会加载 GRUB。

⚠️ 注意: 这个方法的代价是:如果想直接进 Windows(绕过 GRUB),从 fallback 路径就进不了了,只能从 NVRAM 里的 Windows 条目进,或者在 GRUB 菜单里选 Windows。通常这不是问题——GRUB 里本来就有 Windows 选项。

方案二:用 GRUB 自身的重装命令(在 Linux 系统里执行)

在安装好的 Linux 系统里(不是 Live USB),每次发现 GRUB 被干掉之后:

sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
sudo update-grub

这会重新注册 NVRAM 条目并重新生成配置文件,把 GRUB 恢复到第一位。

如果想让这步在每次 Windows 大版本更新后自动执行,可以加一条 cron 任务:

# 打开 root 的 crontab
sudo crontab -e

# 加这一行(每次重启后检查一次,如果 GRUB 不是第一启动项就修复)
@reboot /usr/sbin/grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --quiet 2>/dev/null

⚠️ 注意: 这个方法有一定风险,grub-install 每次重启都跑一遍,大多数情况无害,但如果系统处于特殊状态(比如 EFI 分区未挂载)可能出问题,所以不推荐给普通用户。如果需要自动化,建议改为检测efibootmgr -v中GRUB是否在第一位,不在才执行grub-install。如果实在不放心,改用手动执行。对大多数用户来说方案一更实用。

四、MBR/Legacy BIOS 环境的修复(老电脑)

如果用的是老电脑(BIOS 模式,不是 UEFI),修复方式有所不同。

确认是 Legacy BIOS

在 Live USB 环境里:

ls /sys/firmware/efi
# 如果报错"没有这个文件或目录",就是 Legacy BIOS
也可以用 [ -d /sys/firmware/efi ] && echo UEFI || echo Legacy 一键判断。

Legacy BIOS 的引导结构

Legacy BIOS 的引导程序写在硬盘 MBR(主引导记录,512字节)里,没有 EFI 分区这个概念。GRUB 装在 MBR 里,直接接管整块硬盘的引导。

修复步骤

进入 Live USB 后 chroot(步骤和上篇一样,但不挂载 EFI 分区),然后:

# Legacy 模式:把 GRUB 写到 MBR
# /dev/sda 是目标硬盘(整块硬盘,不是分区)
sudo grub-install /dev/sda
sudo update-grub

UEFI 模式
Legacy 模式
grub-install --target=x86_64-efi --efi-directory=/boot/efigrub-install /dev/sda
改 NVRAM 调启动顺序
MBR 只有一个,装了就是第一
EFI 分区(FAT32,100MB+)
不需要 EFI 分区

⚠️ 注意: Legacy 模式下多个系统争同一块 MBR,谁装在后面谁的引导器就会覆盖前面的。Windows 安装会覆盖 GRUB,所以如果是先装 Linux 再装 Windows,Windows 会直接覆盖 MBR,必须用上面的 grub-install /dev/sda 重新装回来。

五、GRUB 配置文件常见调整

修复完之后,顺带讲几个 GRUB 配置的实用调整:

1. 修改默认启动项

sudo nano /etc/default/grub

把 GRUB_DEFAULT=0 改成想要的条目编号(0 是第一个,通常是 Ubuntu;如果 Windows 排在第 3 个,就改成 2),或者直接写名称:

GRUB_DEFAULT="Windows Boot Manager"

> ⚠️ **注意:**必须和 update-grub 输出里的菜单标题完全一致,包括大小写和空格。

修改后重新生成:

sudo update-grub

2. 修改启动等待时间

GRUB_TIMEOUT=10    # 等10秒;改成0就直接不等,改成-1就一直等

3. 让 GRUB 记住上次选择

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

这样每次选了哪个系统,下次开机就默认选那个——双系统用户很实用。

4. GRUB 看不到 Windows

# 确认 os-prober 已安装
sudoapt install os-prober

# 编辑 GRUB 配置,把这行加上(或取消注释)
sudo nano /etc/default/grub
# GRUB_DISABLE_OS_PROBER=false

# 重新生成
sudo update-grub

update-grub 输出里如果有 Found Windows Boot Manager on /dev/sda1,说明 Windows 已经被检测到了。

六、完整修复路线汇总

遇到引导问题,按这个路线走:

步骤
操作
1
开机进 BIOS,看 Linux 启动项还在不在
2
在→ 在 BIOS 里把 GRUB 调到第一位,重启,问题解决
3
不在→ 用 Ubuntu Live USB 启动
4
想简单→ 用 boot-repair 图形界面,点 Recommended Repair
5
想手动→ chroot + grub-install + update-grub(上篇方法)
6
修好后→ 用 efibootmgr 确认 GRUB 在第一位
7
防复发→ 把 GRUB 的 shimx64.efi 复制到 fallback 路径

💡 提示: 多数情况下步骤 1-2 就能解决问题,根本不需要 Live USB。Windows 更新只是改了 NVRAM 顺序,GRUB 文件本身还在,进 BIOS 调一下就好。步骤6确认后,可以记录一下GRUB的编号(如0001),以后Windows更新后直接改BIOS或跑efibootmgr -o就行。

七、写在最后:双系统引导的最佳实践

引导问题折腾过一次就心有余悸,这里总结几条预防建议:

建议
原因
先装 Windows,再装 Linux
GRUB 装在 Linux 之后,自动检测并加上 Windows 条目,顺序最干净
Windows 大版本更新后立刻检查引导
Windows 更新最容易动 NVRAM,更新后进 BIOS 确认一次
把 GRUB 的 shimx64.efi 备份到 fallback 路径
一次性操作,长期有效
制作一个 Ubuntu Live USB 常备
修引导、修分区、救数据都靠它
记录自己的 EFI 分区设备名
每次 chroot 修复都要用,记下来(比如 /dev/sda1)省事

💡 提示: 如果你已经装了Linux,不需要重装,用上篇+本篇的方法修就行。

下篇预告: Linux 的 Shell 配置——bashrc 和 zshrc 怎么用、alias 怎么设、提示符怎么美化,让终端不再是一张白纸。

最新文章

随机文章