无效的EFI文件路径

我刚在我的新笔记本上安装了Ubuntu 12.04(预装有Win7 64位),并以EFI模式启动,现在无法再加载Win7了(Ubuntu从grub引导正常)。 当我在grub菜单中选择Windows 7条目时,会出现以下错误:
Invalid EFI file path

grub.cfg的条目(由boot-repair生成)是:
menuentry "Windows 7 (loader) (on /dev/sda3)" --class windows --class os {
    insmod part_gpt
    insmod ntfs
    set root='(hd0,gpt3)'
    search --no-floppy --fs-uuid --set=root B8449665449625E2
    chainloader +1
}

这是分段输出的结果:
GNU Parted 2.3
Viene usato /dev/sda
Benvenuti in GNU Parted. Digitare "help" per l'elenco dei comandi.
(parted) print list
Modello: ATA ST9500325AS (scsi)
Disco /dev/sda: 500GB
Dimensione del settore (logica/fisica): 512B/512B
Tabella delle partizioni: gpt

Numero  Inizio  Fine   Dimensione  File system  Nome                  Flag
 5      1049kB  106MB  105MB       fat32                              avvio
 3      345MB   200GB  200GB       ntfs         Basic data partition
 1      200GB   200GB  1049kB                                         bios_grub
 2      200GB   496GB  296GB       ext4
 4      496GB   500GB  4172MB

引导EFI分区,挂载为
/dev/sda5 on /boot/efi type vfat (rw) ) 

以下是以下文件(不包括grub文件夹和引导根目录上的其他文件):
./efi
./efi/efi
./efi/efi/boot
./efi/efi/boot/bootx64.efi
./efi/efi/ubuntu
./efi/efi/ubuntu/grubx64.efi
./efi/efi/Microsoft
./efi/efi/Microsoft/Boot
./efi/efi/Microsoft/Boot/bootmgfw.efi.grb
./efi/efi/Microsoft/Boot/bootmgfw.efi
./efi/efi/Microsoft/Boot/bootx64.efi.grb
./efi/efi/Microsoft/Boot/bootx64.efi

怎么修复这个问题?
谢谢。
4个回答

你的GRUB引导项适用于BIOS模式启动,但不适用于EFI模式启动。这是一个GRUB的错误。你可以尝试将该项替换为以下内容:
menuentry "Windows 7" {
    insmod part_gpt
    insmod chain
    set root='(hd0,gpt5)'
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

我不能保证这个方法一定有效,但是可能会有用。如果有效的话,请将该条目添加到/etc/grub.d/40_custom中,这样每当Ubuntu更新其GRUB配置时,它就会再次创建。
另一个选择是在GRUB之外或者替代GRUB使用其他引导管理器。例如,rEFInd可以自动检测Windows和GRUB;如果你使用的是3.3.0或更高版本的内核(如Ubuntu 12.10所附带的,但不包括Ubuntu 12.04),你可以直接使用rEFInd引导Linux,完全绕过GRUB。gummiboot是另一个具有类似引导功能的选项,但如果你想直接使用gummiboot引导Linux,则需要更多手动维护工作。

使用那个菜单选项,会将我从grub引导到一个黑屏,然后又回到grub界面 :( - Simone Margaritelli
refind 给我提供了 Windows 选项,但是如果我选择它,grub 菜单会打开 O.o - Simone Margaritelli
1这听起来像是Ubuntu将Windows引导加载程序重命名并安装到其位置!我猜测ESP上的EFI/Microsoft/Boot/bootmgfw.efi.grb文件才是真正的Windows引导加载程序,所以将bootmgfw.efi重命名为其他名称,然后将bootmgfw.efi.grb重新重命名为bootmgfw.efi就可以解决问题。您可以检查这些文件和EFI/ubuntu/grubx64.efi的文件大小来验证,或者使用diff进行比较。顺便说一句,如果是这样,Ubuntu的开发人员可能这样做是为了解决一些EFI实现中的错误,但这样做有点不好! - Rod Smith
1在我的笔记本电脑上,我不得不将set root=(hd0,gpt1)设置为根目录,因为那是我的戴尔电脑存放EFI分区的位置。 - Mutant Bob
不要被愚弄以为因为选项卡自动完成可以看到gpt标签等,它就会使用它们来启动。需要“insmod part_gpt”。如果你在这里是为了解决非Windows GRUB链加载问题,并且你的路径正确,那么这就是你的答案。 - SleighBoy

终于,我解决了格式化并从头重新安装所有东西的问题...基本上(不知道为什么),grub覆盖了Windows 7的引导程序,这就是问题所在。

1Ubuntu以前有一个bug,会擦除ESP,但我以为那个问题已经修复了。也许在某些情况下仍然存在。:-( 提示:备份整个ESP。这样,如果发生奇怪的事情,您可以在将来恢复它。(EFI不依赖于引导扇区代码,因此文件级别的备份完全可行。) - Rod Smith

截至今天,在Xubuntu 22.04中,我一直在使用上面提供的信息来配置我的笔记本电脑的UEFI。然而现在,我不得不将ESP分区的位置添加到chainloader行中。
这是我目前的工作配置:
menuentry "Windows 10" {
insmod part_gpt
insmod chain
set root='(hd0,gpt4)'
chainloader (hd0,gpt2)/EFI/Microsoft/Boot/bootmgfw.efi

}

此外,我不得不将其插入到文件“custom”中才能使其正常工作,该文件位于/etc/grub.d/proxifiedScripts下。
同时还出现了一个烦恼:在Grub引导项中,同一台Xubuntu安装出现了多组条目。我使用从PPA安装的grub-customizer来修复它。
我觉得这些不同的条目可能是通过位于/etc/grub.d下的几个代理文件生成的,可能是10_linux_proxy、31_linux_proxy和41_linux_proxy。
当然,我不敢手动更改默认设置。

我忘了解释为什么我必须在chainloader行中添加ESP分区的路径:启动失败并显示找不到该文件的错误。我尝试这个方法,就像其他猜测一样,结果成功了。 - meylodie

这是对这个问题答案的更新 - Ubuntu 22.04 MATE 要么忽略了,要么覆盖了我的 Win 10 Pro 引导... 快速切换到 Ventoy 并加载 Win10 ISO 安装程序,然后选择修复引导可以解决这个问题... 是否在内核更新后会再次出现尚不清楚 :P
谢谢/祝好