我读了很多关于双引导的文章,看起来就像加载 Windows,然后用 GRUB 加载 Linux 一样简单,但每个人都说 Windows 一有机会就喜欢丢弃 GRUB。我可以采取哪些步骤来防止这种情况发生(除了使用 Windows 的引导加载程序之外,我希望使其尽可能简单)?
答案1
每当您安装 Windows、将其升级到新版本或使用、 或旧版bootrec /fixmbr
等工具时,Windows 都会覆盖引导扇区。一般来说,先安装Windows,然后安装Linux。引导扇区将保持不变,直到您执行上述操作之一。 (也许还有其他方法可以写入 MBR。)但是,如果您丢失了 GRUB,它很容易恢复:bootrec /fixboot
fdisk /mbr
- 从 Live CD(CD/DVD 或闪存驱动器)启动。
- 成为 root 或使用
sudo
以下命令。 - 如果需要,列出可用分区:
fdisk -l
- Windows 几乎肯定会存在于 /dev/sda1 上:
mount /dev/sda1 /mnt
- 在 MBR 中重新安装 GRUB:
grub-install --root-directory=/mnt/ /dev/sda
- 重启:
shutdown -r now
- 恢复 GRUB 菜单:
update-grub
如果计算机足够强大,您还可以安装 100% Unix、Linux 或 BSD,并在虚拟机中简单地运行 Windows。
另外:您计算机的 BIOS 可能有一个保护引导扇区的选项。
答案2
我找到的一个解决方案在线某个地方(unix.stackexchange.com) 涉及停用 Windows 启动管理器。进入 Linux(如果可以的话,可以是原始安装,也可以是 live CD/DVD)并运行以下命令:
efibootmgr
请注意,此方法仅在 Linux 以 UEFI 模式安装时才有效,因此如果 Linux 以 Legacy 模式安装,您将收到错误消息。如果您在 UEFI 模式下安装它,您将获得一些信息和列表。您会注意到列表中某处有 Windows 引导加载程序/管理器和 Linux。 Windows 可能具有更高的优先级(启动顺序位于列表上方)。
一些(如果不是全部)条目旁边还有星星*,将它们标记为活动状态。
查看 Windows 条目旁边的 4 位启动号并运行
sudo efibootmgr --bootnum #### --inactive
这将停用 Windows 条目。另外,请确保现在停用的 Windows 具有更高的优先级(如果还没有):
sudo efibootmgr --bootorder ####,$$$$,&&&&,%%%%
其中 #### 是 Windows 启动号。
如果您现在重新启动,您将启动到 grub(如果以最高优先级启用 Linux 选项)。
请注意,Windows 似乎无法识别它已被停用,因此这不会通过启动 Windows 或更新来恢复。
我参加了一个本地 Linux 安装节,我们为感兴趣的人安装 Linux,最常见的是作为 Windows 旁边的辅助操作系统。我还没有看到这种方法失败,并且我已经在几个发行版(主要是 Ubuntu 和 Mint)和几个供应商(华硕、宏碁、惠普、联想)上尝试过。
答案3
我确实尝试了上面的一些好的建议,但没有效果。我认为 MS 变得更加棘手。
2021 年对我来说最有效的是遵循启动修复摘要中列出的建议,该建议建议启动 Windows 并在命令提示符中运行以下命令(我需要以管理员身份运行命令才能使其正常工作)
bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi
注意:上面的命令是根据我的 UEFI 安全启动情况定制的,因此如果您想遵循此方法,那么您需要运行boot-repair
并记下他们建议的修复。
除了运行之外,boot-repair
您还可以在 Linux 中使用以下命令来获取正确的 efi 路径(如果无法访问 Linux 发行版,您可能需要安装它和/或使用 live-usb):
efibootmgr -v
在 Windows 中运行该bcdedit
命令后,我总是会得到 grub 菜单,如果我启动到 Windows,它似乎不会破坏我的 grub,并且在重新启动时我会再次得到 grub 菜单,默认为 Linux。这是一件很美好的事情,
答案4
这是我使用的解决方法,它适用于 Windows 更新,无需干预:将 EFI/Microsomething 中的 EFI/Microsoft 重命名,将 grub.cfg 中的 Windows 引导路径替换为 EFI/Microsomething/bootmfgw.efi,如下所示:
menuentry "Microsoft Windows UEFI-GPT" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --set=root <PROVIDE YOUR EFI DRIVE UUID>
chainloader /EFI/Microsomething/Boot/bootmgfw.efi
}