Windows 10 升级会破坏 grub,而 boot-repair 也无法解决这个问题。

我刚刚从安装了Ubuntu 14.04的分区笔记本电脑上的Windows 8.1升级到了Windows 10。启动时没有出现Grub引导界面,所以我从Ubuntu的liveUSB中运行了boot-repair。但是这似乎没有任何效果。我已经检查过,安全启动仍然被禁用。
来自boot-repair的日志: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但是即使报告“操作成功”,也没有任何效果。

接下来应该是提交一个错误报告。 - Rinzwind
@Rinzwind 我刚刚将日志发送到boot.repair@gmail.com,解释了我的情况。 - Nicholas Verstegen
如果您已经在ESP中更新了grub的文件,是否已进入ACER的UEFI并在这些文件上启用了信任。您需要设置系统密码才能这样做。http://askubuntu.com/questions/597213/bootable-device-not-found-after-clean-install-of-ubuntu-14-04-uefi - oldfred
为了避免在每次BOOTMGR更新时Windows擦除GRUB,请为两者保留独立的ESP。 - Erkin Alp Güney
这个简短的注释(http://linuxbsdos.com/2015/07/29/will-an-upgrade-to-windows-10-on-a-dual-boot-system-mess-grub-up/)指出,如果你的ESP位于UEFI分区中,升级应该不会破坏任何东西。 - Carles Araguz
尝试了被接受的答案但没有成功后,我意识到我可以在BIOS中更改启动优先顺序,并将其指向正确的分区(ubuntu),这样grub菜单就会在启动时显示出来 :) - Raf
14个回答

我刚刚不得不以管理员身份在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应该在列表中的某个位置。
注意:这可以在没有Live USB的情况下工作,但您可能需要进入BIOS并关闭安全启动。这可能会阻止上述操作起作用。

2@bheeshmar:这个问题本身就值得回答!**;-)** - Fabby
这对我来说没有起作用,不知道为什么。在Ubuntu 14.04上安装了全新的Windows 10,都是x64位的(我想)。看来我只能走一条漫长的路了。 - Krøllebølle
3这对我有用,非常感谢。请问那个命令实际上是做了什么? - Jehoshuah
1对我没有起作用,现在我觉得Windows启动速度有点慢。我该如何撤销这个操作? - Santiago Gil
3FYI:在Windows PowerShell中无效,需要以管理员身份运行cmd才能正常工作。 - William Saunders
2@Jehoshuah 它将Grub设置为系统引导管理器,而不是Windows引导管理器,这意味着当系统启动时,它会运行Grub。BCD代表"Boot Configuration Data"(引导配置数据)。 - wjandrea
11注意:要找到该命令的最后一个参数的路径,您可以使用“bcdedit /enum firmware”。如果您正在使用另一个Linux发行版,并且您的搜索引擎将您带到了这里,这将会有所帮助 :-) - David Faure
1救命稻草!!在Windows 10和Ubuntu 17.10双系统上都运行得很完美。 - Ganesh Krishnan
1bcedit 不被识别为内部或外部命令... 我做错了什么? - HiFile.app - best file manager
1根据你的问题判断,你输入的是"bcedit"而不是"bcdedit"。 ;) - userfuser
1在一台戴尔XPS 13(因此是UEFI和NVMe)上,由于Windows / Dell更新后,双启动停止了,甚至无法引导进入Windows。最后,我不得不使用一个带有快速引导关闭的USB键启动Linux,然后使用@Nir的建议重新安装grub(尽管我认为这些建议也适用于我的情况,即使它暂时使事情变得更糟)。 - Gordon Williams
救命稻草!它有效果了!正如@William Saunders所说,要以管理员身份运行cmd才能生效,而不是在powershell中运行。 - e7lT2P
\EFI\fedora\grubx64.efi 在 Fedora 28 上也适用! - Christopher Markieta
没有引号的话,对我来说不起作用。如果你有Debina,你应该在所述路径中将ubuntu替换为debian - Matt
1如果您不记得 .efi 文件的路径,请使用 diskpart 挂载您的 EFI 卷(https://www.howtogeek.com/197296/how-to-use-the-diskpart-utility-to-assign-and-remove-drive-letters/),然后您可以通过命令提示符列出您的文件。 - Andre Soares
如何使用以下步骤在您的操作系统中找到EFI路径:
  1. 使用diskpart命令。
  2. 使用list volume命令。
  3. 使用select volume 2命令(数字应与FAT32卷相对应)。
  4. 使用assign letter=p:命令。 然后在管理员命令提示符中执行以下步骤:
  5. 输入p:
  6. 输入cd EFI。 在这里,您将看到您的操作系统名称目录。
- Raghavendra
1我的Linux系统中存在一个EFI文件,但对我来说没有起作用。 - Raghavendra
它更新了路径,但问题并没有解决。 路径:\EFI\ubuntu\shimx64.efi 描述:Windows引导管理器 - Mayank
1哇,对我来说完美无缺!我只有shimx64.efi,在阅读了这个链接后https://askubuntu.com/questions/342365/what-is-the-difference-between-grubx64-and-shimx64,我决定使用它,结果非常完美。 - Ilia Andrienko
1有一天早上,我发现我的 grub 加载器不见了。这个建议真是救命稻草,非常感谢!! - N. F.
这些步骤对我来说还不够。它们确实更改了引导管理器,但它仍然无法显示出来。我必须使用bcdedit /set {bootmgr} displaybootmenu on来启用它。我在http://www.mistyprojects.co.uk/documents/BCDEdit/files/examples4.htm上找到了这个。 - Firewave
又坏了,而且命令还是不够。我必须确保{bootmgr}是第一个条目,使用bcdedit /set {fwbootmgr} displayorder {bootmgr} /addfirst命令,并从bcdedit /enum firmware中的{fwbootmgr}显示顺序中删除Windows引导管理器条目,使用bcdedit /set {fwbootmgr} displayorder <GUID> /remove命令。 - Firewave

我找到的唯一有效的解决方案在这个链接上有描述。 我再次将其放在这里,只是因为在谷歌上更容易找到这个帖子。
基本步骤如下:
  1. 使用Ubuntu Live光盘以“试用Ubuntu”模式启动。
  2. 使用GParted验证正确的Linux分区(例如:/dev/sda2)。
  3. 挂载Linux分区:

    sudo mount /dev/sda2 /mnt  #将sda2替换为您的分区号
    
  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在我上面提到的链接中的贡献。

2部分对我有用..现在它直接启动到Linux,而不显示启动菜单 - PowerAktar
@PowerAktar 你试过按下“ESC”键来显示 grub 菜单吗? - InitializeSahib
答案对我有帮助。基本上,我使用“尝试Ubuntu”模式启动了我的电脑,并安装了boot-repair来修复grub。Linux分区已经恢复了。但是在修复后,我丢失了Windows分区。所以我尝试从第4步到第6步进行操作。这些步骤帮助我恢复了Windows 10分区。谢谢你,Nir。 - r0ng
2这个答案与链接问题中的答案几乎相同,除了格式和语法更差。如果你的答案本质上是另一个问题的副本,最好将此问题标记为重复,一旦你获得了15点声望。不要忘记为那些你发现有用的答案投票! - David Foerster
这是唯一对我有效的方法。我注意到(L)ubuntu在sda1/EFI/boot/...中无法创建任何内容,但是手动操作可以修复问题。谢谢! - user2084865
这是唯一对我有效的解决方案。不知何故,我无法安装boot-repair。 - kmchmk
首先确保您以EFI模式启动,检查/sys/firmware/efi是否存在。当为chroot绑定挂载/sys时,使用--rbind而不是--bind, mount --rbind /sys /media/linux/sys,否则它将无法设置EFI变量。 - Duke

我也遇到了同样的问题,从Windows 7升级到10的双系统电脑... 我是这样解决的:

  1. 升级Windows
  2. 在安装过程中,第一次重启后,我遇到了grub rescue提示,用一个USB闪存驱动器上的BootRepair修复了这个问题
  3. 完成了Windows的安装,GRUB消失了,然后我用gparted的live cd发现所有分区仍然存在,但它们都变成了NTFS格式
  4. 在Windows中使用TestDisk恢复了我的Linux分区
  5. 再次运行BootRepair,一切似乎都正常(GRUB菜单中有两个Windows选项,我不知道为什么,但对我来说一切都正常!)

希望对某人有所帮助!


更多的一步一步的说明会更有帮助。 - Veridian
这个解决方案对我也起作用了..并且救了我的一天 :)附注: 这个逐步指南可能会有所帮助:http://www.cgsecurity.org/wiki/TestDisk_Step_By_Step - The Good Giant
1TestDisk是如何恢复你的Linux分区的?你只是用它来改变分区类型吗? - Greg Bell
你是说Windows安装程序会将ext4分区转换为NTFS吗?那文件权限和符号链接这些东西怎么办呢?它们在NTFS上无法完全相同地表达出来。我会预料到会有部分文件信息的丢失。 - bluenote10

我的妻子的电脑是老款(非UEFI),上面安装了Ubuntu在一个逻辑扩展分区上。升级到Windows 10后,先是破坏了grub引导程序,导致重启时出现"grub rescue"提示,我用LiveUSB中的BootRepair恢复了它,但我的Linux分区却不见了!我又用LiveUSB中的parted rescue找回并恢复了这个分区。然后,我从LiveUSB中挂载了这个分区,并进行了grub-install操作,成功地重新启动了恢复的Ubuntu和Win10。希望这对其他人有所帮助。
通过LiveUSB,我指的是我用来安装Ubuntu的USB驱动器(参见http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-ubuntu)。你也可以使用可启动的光盘。一旦你从这个设备启动,你应该能够在其中找到BootRepair和gparted应用程序。

4注意:所有在BIOS引导的Windows 7上使用MBR(msdos)分区驱动器并在逻辑分区中安装Ubuntu的用户可能会遇到此问题。最好先单独备份分区表。然后,如果您没有更改分区表,可以直接恢复它。http://askubuntu.com/questions/654386/windows-10-upgrade-lead-into-grub-rescue/655080#655080 当重写分区表时,Windows一直“忘记”包括Linux分区。 - oldfred
真希望在按下我妻子电脑上的Windows 10更新按钮之前读过这个!:) - bheeshmar
2请问您能提供“BootRepair”、“parted rescue”和/或“LiveUSB”的链接吗?这些东西很常见,人们可能对使用您所使用的确切工具感兴趣(我在谷歌上没有找到明确的结果)。 - Greg Bell
1@oldfred Windows在进行升级时会重写表格?这真让人害怕。 - You'reAGitForNotUsingGit

我们这里有很多答案,提供了解决问题(最新Win10更新导致Grub菜单丢失)的步骤。各种答案证明了解决方案并不唯一,因为机器配置并不唯一。
对于我的系统(Acer E5-575G-57D4),以下是解决方法: 简短回答
1)在Windows中,如Nicholas在他的答案中所提到的,在Windows命令提示符中以管理员身份输入以下命令。
bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi

2) 使用Live Ubuntu CD/USB运行boot-repair工具。

长答案:

1) 登录Windows。

2) 创建一个带有您的Ubuntu版本的可启动的USB驱动器,并插入它。

3) 以管理员身份在命令提示符中输入以下命令:

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

重新启动。
4)在启动过程中按下F12键,以查看启动菜单。选择“Linux”。注意:为此,在BIOS设置中必须启用“F12启动菜单”(在启动时按下F2键)。
5)在菜单中,选择“尝试Ubuntu而不进行安装”,以进行实时Ubuntu会话
6)连接到您的WiFi。使用以下命令下载并运行boot-repair
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

只需按照提示操作,直到收到固件修复的消息。这对我有效。

谢谢 :)


你是否检查了启动顺序?如果Microsoft引导加载程序在第2位,请将其移至底部并重新启动。
你可以通过在终端中运行“sudo efibootmgr -v”来检查它。

我不确定这是否相关,但我在尝试从Windows 8.1/Debian双启动升级到Windows 10时遇到了一些问题。
基本上,在升级的某个阶段,我发现grub进入了救援模式,因为我的Debian分区在此过程中被擦除,因此引导文件也一并丢失(通常我有一个单独的引导分区,但这次没有...)。根据这个链接的内容:Windows 10 upgrade led to grub rescue 我认为问题在于Windows在升级过程中没有正确写入分区表。
不管怎样,我通过使用Win8.1安装的外部硬盘启动并按照这些指示解决了问题:https://neosmart.net/wiki/fix-mbr/(向下滚动到win8/8.1)。这样可以清除grub并重新安装微软的引导加载程序。然后,我成功完成了升级,并重新安装了Debian,因为当时我没有意识到问题只是分区表没有正确写入。然而,更好的解决方案是尝试恢复您的分区表(使用testdisk?),然后重新安装/更新grub。
希望对您有所帮助。
附言:感谢微软对于双启动配置的用户漠不关心...

我也遇到了升级后的分区被清空的问题。 - Lewis Goddard
我不明白的是,为什么只有我的根Linux分区被清除了,而我还有其他两个逻辑分区用于/opt和linux-swap,它们却完好无损。如果Windows在写入表中的逻辑分区时真的出了问题,那么这些分区也应该受到影响才对... - Jérémy Riviere
1没有看到UEFI / gpt系统无法正确写入分区表的问题。但是,任何使用BIOS / MBR的Windows 7或8和逻辑分区中的Linux似乎都有这个问题。http://askubuntu.com/questions/654386/windows-10-upgrade-lead-into-grub-rescue/655080#655080 所有其他遇到丢失分区问题的人只有一个逻辑的Linux分区。但现在看起来非常奇怪的是,Windows只“忘记”写入/(根)分区。多年来,即使在重新安装Windows 7时也一直见过这种情况。 - oldfred
1@oldfred 如果逻辑分区的编号不按顺序排列,例如在扩展分区内sda6位于sda5之前,而不仅仅是Linux分区(我这里删除了Linux交换和NTFS),就会发生这种情况。如果Windows 10升级时引导分区无法容纳恢复环境,它有时会创建一个新的分区。 - Martin Thornton

我使用了RescueTux/Super Grub Disk。在我的Android平板电脑上通过DriveDroid引导它。然后使用自动检测的RescueTux。进入WINDOWS按钮,点击betaWindowsMBR修复按钮。选择/dev/sda2 确定 确定 确定。然后它显示成功。现在我只是重新引导回Windows UEFI菜单。


我的修复方法与@Francesco的接近,但有些不同。
1. 将Windows从7升级到10。 2. 在安装过程中,在第一次重启后,我遇到了grub rescue提示符,通过使用USB驱动器上的BootRepair来修复这个问题。 3. 现在grub出现了,但只显示Ubuntu分区,没有显示Windows。 4. 登录Ubuntu,打开终端并输入update-grub。 5. 现在Windows重新出现在grub菜单中,继续进行Windows 10的升级。

在我的情况下,使用BootRepair后,我的系统会启动到Windows。 - tbear
1此外,所有的Linux分区都像弗朗西斯科一样消失了。你很幸运。 - tbear
@tbear 那你是如何康复的呢? - Greg Bell

如果您有Win10安装媒体,您可以使用它来安装全新的MBR。只需启动直到看到“立即安装”(或类似)但不要点击它。有一个小链接说“修复工具”(或类似)。从这里,您可以进入命令提示符。
cd c:\windows\system32
bootrec /fixmbr

也许甚至
bootrec /fixboot

这应该解决问题。但是,由于微软对人们自己的选择的无视,你的Linux已经消失了很久。他们只是决定可以删除你硬盘驱动器上的任何他们不喜欢的东西。因此,我们可以合法地认为微软是一群白痴...
Win10安装媒体创建工具可以从https://www.microsoft.com/en-us/software-download/windows10免费获取。