双系统安装Ubuntu/Windows时出现错误:"找不到文件 '/EFI/Microsoft/Boot/bootmgfw.efi'"

我有一台双系统电脑,硬盘上安装了Ubuntu 20.04和Windows 10。过去的4周一切都运行良好,直到一个小时前:
突然间,在从GRUB启动Windows时,我遇到了这个错误:
error: file '/EFI/Microsoft/Boot/bootmgfw.efi' not found

这个问题我能做些什么呢?
到目前为止,我尝试和检查了以下内容:
- 更新了grub - 检查了给定的文件:它确实存在!并且大小为1558328字节,所以不是空的 - 按照这个答案尝试了boot-repair以及Rescatux(重新安装Microsoft Windows UEFI) 这里是由boot-repair分析得出的我的当前引导设置的报告链接
迄今为止,这些尝试都没有解决问题。有人有解决方案或者至少有什么可以尝试的吗?
[编辑]

到目前为止,我取得的成就是能够使用UEFI重新引导进入两个操作系统。在启动时按下DEL键,我可以使用UEFI的引导菜单进入grub(然后从那里进入ubuntu)或进入Windows。但是,当从grub启动并尝试从那里启动Windows时,我仍然收到相同的错误消息。这里是通过boot-repair分析的另一个引导报告。如您在第97行所见

Boot0011* (Rescapp) bootmgfw.efi    HD(1,GPT,84e08278-2d18-4a4c-9885-fde204e033e6,0x800,0x32000)/File(\EFI_PRE_RESCATUX_2020-09-01-20-46-59\Microsoft\Boot\bootmgfw.efi)

有一个UEFI条目可以引导进入Windows。但是这个条目使用了EFI的备份来引导进入Windows。而GRUB则使用了一个更近期的文件来尝试引导Windows,你可以在grub.cfg文件中看到这一点。
### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows Boot Manager (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-efi-92CE-E05A' {
    insmod part_gpt
    insmod fat
    set root='hd0,gpt1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  92CE-E05A
    else
      search --no-floppy --fs-uuid --set=root 92CE-E05A
    fi
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10
fi
### END /etc/grub.d/30_os-prober ###

我考虑过简单换行

/EFI/Microsoft/Boot/bootmgfw.efi

/EFI_PRE_RESCATUX_2020-09-01-20-46-59/Microsoft/Boot/bootmgfw.efi

但是在文件的顶部写着不要编辑这个配置文件,所以我不敢这样做。这样会有什么问题吗?为什么只有备份版本有效,而最近的版本无效?我的整个启动设置看起来有点混乱。

1Windows是否进行了更新并重新启用了快速启动?Grub只能引导正在工作的Windows或未休眠且不需要进行磁盘检查的Windows。但是,看起来你没有一个UEFI Windows引导项可以直接从UEFI引导它。请参考IV中使用efiboomgr的UEFI引导项。https://askubuntu.com/questions/486752/dual-boot-win-8-ubuntu-loads-only-win 还可以参考man efibootmgr - oldfred
Windows至少进行了一些更新。我关闭了它并重新启动了两次,进入Windows后再次关机和重启。然后我启动了Ubuntu并运行了引导修复工具。但是状态摘要仍然显示:“Windows处于休眠状态,拒绝挂载。由于NTFS分区处于不安全状态,回退到只读挂载。请完全恢复并关闭Windows(不要休眠或快速启动)。”看起来好像出了点问题?我按照这个指南操作[https://www.asus.com/us/support/FAQ/1031533/]。当我启动Windows时,标志出现了,所以至少看起来好像已经停用了。 - Tayfe
Rescatux 不知怎么地给我添加了一个 UEFI 条目,可以直接从 UEFI 启动进入 Windows,至少我现在能够再次使用 Windows 了。但是我不知道它是如何做到的,也不知道如何修复 grub 来实现同样的功能。而且出于某种原因,我无法再从我的 USB 硬盘启动 Rescatux 了?在 UEFI 列表中显示它 [https://imgur.com/a/9GwYE7P],但当点击后只有黑屏一秒钟,然后笔记本电脑又返回到 UEFI 菜单。 - Tayfe
什么品牌/型号的系统?什么样的显卡/芯片?有时在安装过程中会将某些内容写入闪存驱动器,导致其无法工作,需要重新创建。黑屏通常是视频问题。请参考以下链接了解如何解决计算机启动后出现黑屏的问题:https://askubuntu.com/questions/162075/my-computer-boots-to-a-black-screen-what-options-do-i-have-to-fix-it - oldfred
我买了一台"HP Elitebook 840 G3"笔记本电脑,配备了Intel 6200U和HD520。但是我觉得这个问题与显卡无关,因为它一直在工作。黑屏似乎更像是启动问题。 - Tayfe
你的是像这个一样吗?HP Elitebook 840 G5 gpt问题 - HP在UEFI设置中放置了一个故障安全gpt恢复功能,进入UEFI菜单,在安全性->硬盘工具->取消选中“保存/恢复GPT硬盘系统” https://ubuntuforums.org/showthread.php?t=2436271 - oldfred
11个回答

这对我来说是工作。
1. 创建一个可启动的Windows 10 USB。 2. 从启动菜单中选择USB。 3. "修复您的计算机" > 故障排除 > 启动修复。 4. 完成。
只需要几秒钟。 :)

这对我有用!!! - codetiger

我遇到了和Tayfe(最顶部的帖子)一样的问题,每当我从grub引导菜单中选择Windows 10时,就会弹出错误提示“error: file '/EFI/Microsoft/Boot/bootmgfw.efi' not found”。
我尝试按照上面提到的方法编辑grub.cfg文件,但没有起作用。
当我使用文件浏览器浏览到该位置时,efi文件是存在的,只是在启动过程中无法找到它。
为了解决这个问题,我做了以下操作: (首先从引导菜单中禁用安全启动)(已编辑)
1. 创建一个可启动的Windows 10 USB。 1a. 从Windows官方网站下载Windows 10 ISO文件。 1b. 使用balenaEtcher(这是我在Ubuntu上找到的唯一的Rufus替代品)创建一个可启动的Windows 10媒体。
  1b1.First format the usb.

  1b2.Then using Gparted(in device tab in Gparted) create a new partition table (type of partition == GPT ).

  1b3.then created a new partition of fat32 type(allocated all the space to this partition so there is only a single partition on the usb)

1bc. 使用balena etcher将Windows 10 ISO文件刻录到这个USB上(它会警告ISO文件可能无法识别,请忽略它(我已经忽略了))。
2. 现在,一旦你有一个可启动的Windows 10 USB,重新启动电脑,在grub引导菜单中按下c进入命令行。
3. 按下ls。
4. 它将显示电脑上的所有硬盘。
5. 我的USB是(hd0)(你的可能不同,但你可以通过先执行没有插入USB的"ls"部分,然后再插入USB来找到它),或者像下一步那样。
6. 要查看硬盘的详细信息(例如对于(hd0),执行"ls (hd0)",它将显示详细信息,我通过比较大小和名称知道这是我的可启动USB,例如对于(hd1,msdos),运行"ls (hd1,msdos)",类似这样)。
7. 现在运行"set root=(hd0)",你的"(hd0)"部分可能不同。
8. 现在运行"ls -l /"。
9. 这将显示USB上根目录中的所有文件。
10. 如果有一个名为"efi"的目录,那么一切都很好,你可以按照这个步骤进行。
11. 现在只需检查"ls -l /efi/boot/"是否有一个efi文件,当我运行这个命令时,我的显示了一个bootx64.efi文件。
12. 你还可以通过先在Ubuntu中打开USB并从文件浏览器中转到此路径来确保你的路径"/efi/boot/bootx64.efi"是正确的。
13. 在运行root=(hd0)命令之后,运行这个命令"chainloader /efi/boot/bootx64.efi"。
14. 然后如果命令运行正常,运行"boot"。
15. 这将启动Windows 10安装程序,请按照这个链接(https://www.thewindowsclub.com/boot-or-repair-windows-10-using-the-installation-media)从第3步或以下说明进行操作。
15a 当您从USB驱动器启动时,它将启动Windows 10安装。不要一直点击下一步,否则您将最终安装Windows。在第一个安装屏幕上,寻找一个名为“修复计算机”的链接。点击它。它将引导您的计算机进入高级恢复模式。
15b 在高级故障排除界面上,选择高级选项。选择故障排除。在高级选项屏幕下,您将看到“启动修复”。点击它并按照说明进行操作。
16.我按照以上步骤操作后,我的错误得到了修复,希望对您也有同样的效果。

非常感谢你提供的详细步骤,它确实有效。 - Tanvir
谢谢,这是我的案例。 - Jackssn

这里有一个简单得多的替代方案。对我来说,它运作得像魔法一样,并且可能能够拯救成千上万其他绝望的灵魂。
  1. 下载此文件并将其保存在下载文件夹中。

  2. 将您的主目录路径保存在/tmp/home.txt中:

    echo "$HOME" > /tmp/home.txt
  3. 导出变量HOMEOLD

    export HOMEOLD=$(cat /tmp/home.txt)
  4. .tar.gz文件复制到EFI目录:

    sudo cp $HOMEOLD/Downloads/WindowsBoot.tar.gz /boot/efi/EFI
  5. 进入EFI目录:

    cd /boot/efi/EFI
  6. 解压缩.tar.gz文件:

    sudo tar -xzf WindowsBoot.tar.gz
  7. 删除.tar.gz文件:

    sudo rm WindowsBoot.tar.gz
  8. 重新启动,完成!

    sudo reboot
信用归功于随机巴西YouTuber Vinicius Rolins,他在他的频道中分享了这个解决方案(链接1),他还发布了一份葡萄牙语教程(链接2)。

对我来说很有效,非常感谢你! - Giovanne Afonso

似乎每个答案都有完全不同的解决此问题的经验。我的解决方法相对简单:我使用命令df -h检查了一下/boot/设备上是否还有剩余空间,结果发现已经完全满了。我在运行sudo su后以root身份访问了/boot/efi目录,发现里面有几个FSCKXXXX.rec文件,可能是之前无意中进行磁盘检查时留下的。我将它们全部删除后,磁盘就不再满了,我也能够顺利地启动Windows系统,没有出现其他问题。

我不确定解决这个问题的确切方法。但是我尝试了几种方法,最终找到了一个解决方案!所以至少可以简单总结一下:
有一段时间,我觉得我完全搞砸了UEFI。当启动笔记本电脑时,鼠标和键盘会闪烁一次,然后在GRUB或UEFI加载之前再次关闭。而且当尝试从USB驱动器启动时,我也遇到了空白屏幕的问题。所以我决定将UEFI恢复为出厂设置。这解决了鼠标、键盘和USB驱动器的问题!
要解决实际的问题,
error: file '/EFI/Microsoft/Boot/bootmgfw.efi' not found

我决定试一试并按照我在第一篇帖子中提到的方法编辑/boot/grub/grub.cfg。我只改变了这一行,没有其他任何改动!这让它对我起作用了!所以现在我可以从GRUB引导进入Ubuntu和Windows 10。我唯一想知道的是,我是从哪里得到了位于/EFI_PRE_RESCATUX_2020-09-01-20-46-59/Microsoft/Boot/bootmgfw.efi的文件。看起来很像是Rescatux负责了这个,但我不确定我做了什么导致rescatux创建了这个备份文件。
如果你遇到类似的问题,祝你好运! :)

嗯,我不确定这是否非常有帮助,但对我来说,将我的Win11外部驱动器插入电脑中“修复”了问题,哈哈。

我的问题是我将grub和Ubuntu安装在与Windows不同的驱动器上,而Windows加载程序却没有,所以即使最初在GRUB配置中包含了该条目,它也无效(文件丢失)。
我成功解决了这个问题:
1. 在`/etc/default/grub`中添加一行`GRUB_DISABLE_OS_PROBER=false`(需要安装os-prober软件包) 2. 运行`update-grub`命令。然后它找到并添加了正确的条目。但是这要求我禁用安全启动才能真正加载它(这并不理想)。
另外,根据我的初始情况,我还可以通过从UEFI BIOS设置中选择引导驱动器来启动Windows和Ubuntu,所以现在不确定我更喜欢哪种方式。

对于其他遇到同样问题但文件确实丢失的人来说。
在我的电脑上安装了Windows和Ubuntu在同一物理硬盘上,在断电故障后,我遇到了这个问题。 我的解决方案 我启动Ubuntu,进入安装了Windows的文件夹,只需将该文件复制并粘贴到Ubuntu文件夹中,就完成了,祝好运!

谢谢。我按照你的决定去做了,对我也有效!我会把所有步骤写在这里:
  1. 使用Rescatux创建一个LiveCD。
  2. 将Rescatux系统加载到您的电脑上。
  3. 进入"Boot"部分,点击重新安装Windows MBR按钮 (它会自动在路径中创建实际的引导文件,例如EFI_PRE_RESCATUX_2020-09-01-20-46-59/Microsoft/Boot/bootmgfw.efi
  4. 加载您的Linux系统(如Ubuntu等),并打开文件/boot/grub/grub.cfg
  5. 将字符串/EFI/Microsoft/Boot/bootmgfw.efi更改为/EFI_PRE_RESCATUX_2020-09-01-20-46-59/Microsoft/Boot/bootmgfw.efi
  6. 享受吧!

我在将Linux安装在Windows旁边后遇到了完全相同的错误信息。
当通过自己的UEFI引导项启动Windows时,Windows本身可以正常启动,但是尝试通过GRUB引导进入Windows时,会出现上述错误信息。 在BIOS设置中禁用快速启动对我起到了作用。 注意:我的机器仍然启用了安全启动,并且不会干扰Windows的引导过程,也不会干扰Linux的引导过程。