Windows 10 升级会杀死 grub,并且启动修复也无济于事

Windows 10 升级会杀死 grub,并且启动修复也无济于事

我刚刚在安装了 Ubuntu 14.04 的分区笔记本电脑上从 Windows 8.1 升级到 Windows 10。Grub 不再出现在启动时,因此我从 Ubuntu liveUSB 运行启动修复。这似乎没有任何效果。我已检查,安全启动仍处于禁用状态。
来自启动修复的日志:http://paste.ubuntu.com/11972534/
那么接下来该怎么做?

更新:我尝试使用 chroot 从我的 Ubuntu 分区更新 grub。update-grub 成功运行,找到 linux 和 windows 启动管理器,但该过程仍然没有任何效果。grub-install 抱怨它找不到 EFI 目录(但我已正确安装所有内容)。

更新 2:刚刚发现在 chroot 进入 ubuntu 后运行 efibootmgr 显示 ubuntu 根本不在启动顺序中。我手动更改了顺序并重新启动,发现启动顺序已被重置。我在 windows 中运行:bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi但即使在报告“操作成功”后,这也没有任何效果。

答案1

我只需要以管理员身份在 Windows 中运行它:

bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi

或者,如果您使用 PowerShell:

bcdedit /set "{bootmgr}" path \EFI\ubuntu\grubx64.efi

GRUB 在启动时显示正常,并且我可以正常启动 Ubuntu 和 Windows 10。


正如评论(由 David Faure 指出)中指出的那样,此命令的最后一个参数取决于您的特定系统配置。您可以使用此命令来确定系统的正确路径:

bcdedit /enum firmware

这将列出所有已安装的启动管理器和相关的 EFI 路径,并且 grub 应该位于列表中的某个位置。

注意:此功能无需 USB 即可运行,但您可能需要启动 BIOS 并关闭安全启动。这可能会导致上述操作无法运行。

答案2

对我有用的唯一解决方案是关联 我再次将它带到这里只是因为在 Google 上更容易找到这个帖子。

本质上步骤如下:

  1. 使用 Ubuntu Live 以“尝试 Ubuntu”模式启动。
  2. 使用 GParted 验证正确的 Linux 分区(例如/dev/sda2)。
  3. 挂载linux分区:

    sudo mount /dev/sda2 /mnt  #Replace sda2 with your partition number
    
  4. 挂载所有其他Linux系统文件夹:

    for i in /sys /proc /run /dev; do sudo mount --bind "$i" "/mnt$i"; done
    

    如果您正在运行 UEFI 系统,您还必须使用以下命令挂载您的 EFI 目录:

    sudo mount /dev/sda1 /mnt/boot/efi
    
  5. chroot 进入你的安装

    sudo chroot /mnt
    
  6. 现在你已经登录到你的安装(不是 Ubuntu Live),只需执行

    update-grub
    grub-install /dev/sda
    update-grub
    exit
    sudo reboot
    

就是这样!感谢 Scott Severance 提供上述链接。

答案3

同样的问题,在双启动电脑上从 windows7 升级到 10...我通过以下方式解决:

  1. 升级 Windows
  2. 在安装过程中,第一次重启后,我得到了 grub 救援提示,使用 USB 记忆棒中的 BootRepair 修复了这个问题
  3. 完成了 Windows 安装,GRUB 已经消失,使用 gparted 的实时 CD,我注意到所有分区仍然存在,但它们都是 NTFS
  4. 使用 Windows 的 TestDisk 恢复了我的 Linux 分区
  5. 再次启动 BootRepair 并且一切似乎正常(我的 GRUB 菜单中的 Windows 语音重复了...我不知道为什么,但是现在对我来说一切似乎都正常!)

我希望它对某人有用!

答案4

您是否检查过启动顺序?如果 Microsoft 启动加载程序位于第 2 位,请将其移至底部并重新启动。

您可以通过在 Ubuntusudo efibootmgr -v中运行终端来检查它。

相关内容