大家好,我是冯哥的缓存。上篇聊了 GRUB 为什么会消失,以及用 Live USB 进入 chroot 手动修复的方法。今天聊一下两件事:一是更傻瓜的 boot-repair 一键修复工具;二是怎么防止 Windows 更新再次把 GRUB 干掉——修完不是终点,不再被干掉才是目标。
一、boot-repair:不想敲命令的救命工具
如果觉得 chroot 操作太复杂,boot-repair 是一个可以"一键修复"的图形化工具。
1. boot-repair 能干什么
boot-repair 是专门为引导修复设计的 Ubuntu 工具,主要功能:
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 ...
BootCurrentBootOrder:启动尝试顺序(从左到右,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
| |
|---|
grub-install --target=x86_64-efi --efi-directory=/boot/efi | grub-install /dev/sda |
| |
| |
⚠️ 注意: 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 已经被检测到了。
六、完整修复路线汇总
遇到引导问题,按这个路线走:
| |
|---|
| |
| 在→ 在 BIOS 里把 GRUB 调到第一位,重启,问题解决 |
| |
| 想简单→ 用 boot-repair 图形界面,点 Recommended Repair |
| 想手动→ chroot + grub-install + update-grub(上篇方法) |
| 修好后→ 用 efibootmgr 确认 GRUB 在第一位 |
| 防复发→ 把 GRUB 的 shimx64.efi 复制到 fallback 路径 |
💡 提示: 多数情况下步骤 1-2 就能解决问题,根本不需要 Live USB。Windows 更新只是改了 NVRAM 顺序,GRUB 文件本身还在,进 BIOS 调一下就好。步骤6确认后,可以记录一下GRUB的编号(如0001),以后Windows更新后直接改BIOS或跑efibootmgr -o就行。
七、写在最后:双系统引导的最佳实践
引导问题折腾过一次就心有余悸,这里总结几条预防建议:
| |
|---|
| GRUB 装在 Linux 之后,自动检测并加上 Windows 条目,顺序最干净 |
| Windows 更新最容易动 NVRAM,更新后进 BIOS 确认一次 |
| 把 GRUB 的 shimx64.efi 备份到 fallback 路径 | |
| |
| 每次 chroot 修复都要用,记下来(比如 /dev/sda1)省事 |
💡 提示: 如果你已经装了Linux,不需要重装,用上篇+本篇的方法修就行。
下篇预告: Linux 的 Shell 配置——bashrc 和 zshrc 怎么用、alias 怎么设、提示符怎么美化,让终端不再是一张白纸。