如何让我的HP笔记本电脑从新的EFI文件启动到GRUB界面?

我有一台安装了Ubuntu 12.10双系统的HP Pavilion Sleekbook 14笔记本电脑,原装有Windows 8。我使用了boot-repair来设置启动到grub。
我的问题是,我无法直接从新创建的EFI文件启动。我在BIOS屏幕的引导选项中查找了一下,但没有选择Ubuntu的选项。我唯一能够启动Ubuntu的方法是在系统开机时按下F9,然后手动导航到Ubuntu的EFI文件。这样可以工作,但如果我不注意的话,它会启动到Windows。
在运行完成boot-repair之后,它告诉我要从sda2/EFI/ubuntu/shimx64.efi启动。我看到一些建议说我应该将这个文件移到windows的bootmgfw.efi的位置,但我担心这样会出问题,无法启动Windows 8安装。虽然我已经比win7更不喜欢win8,但是有时候我确实需要它来完成一些任务...
关于我的boot-repair的详细信息,请参考这里:http://paste.ubuntu.com/1418009/

shimx64.efi 对我有用,尽管在我的情况下,Ubuntu Gnome 在安装后无法启动,必须通过在 BIOS 中创建新的启动选项来选择该文件。 - belteshazzar
这里有很多关于Windows的答案,你是想要启动Linux还是Windows? - Evan Carroll
很多错误答案不必要地复杂,因为涉及到Windows的问题。只需执行以下操作来重命名grub的efi文件:sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi,参考@Vitor Abella的回答。 - Evan Carroll
从启动键(可能是F9)启动Ubuntu,打开文件夹>文件系统>引导>efi>EFI>Ubuntu>grubx64.efi,并将文件复制到boot/efi/EFI/Microsoft/Boot目录中,在同一目录下,您可以看到名为bootmgfw.efi的Win引导文件,请右键单击并获取权限,允许所有用户和组进行写入和读取,然后将bootmgfw.efi剪切/移动到/boot/efi/EFI/Microsoft/目录中。之后,转到应用程序->系统工具->管理->Grub自定义器,然后选择Windows引导管理器->右键单击或常规设置->(您将获得条目编辑器),将Windows加载路径更改为/boot/efi/EFI/Microsoft/bootmgfw.efi - JWC May
还要将grubx64.efi重命名为bootmgfw.efi,并永久关闭Windows 10的更新。 - JWC May
19个回答

我在尝试双启动Ubuntu 12.04.3 LTS和Windows 8时,遇到了与我的HP Pavilion g6相同的问题。即使在“成功”运行Boot-Repair之后,笔记本仍然直接启动到Windows 8。如果在HP标志出现之前按下F9键,我可以进入引导菜单(HP的菜单?我不确定),然后选择“Ubuntu”条目,这将带我进入GRUB 2,最终进入我的Ubuntu安装。
尽管如此,我仍然希望能够让计算机直接启动到Linux,而无需任何用户干预。
最后,Rod Smith在上面提供的答案以及我在另一个论坛上找到的信息对我起到了作用。我已经禁用了安全启动和传统启动。
以下是我所做的:
我使用启动时按下F9键的技巧,进入了我的Ubuntu安装,以便能够选择引导加载程序。 一旦进入Ubuntu,我打开了一个终端。 使用下面的命令,我检查了Windows引导加载程序的位置: $ sudo efibootmgr -v 在我的情况下,原始的引导加载程序位于这里:/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi。请注意,在您的计算机上可能位于不同的位置。如果是这样,您需要调整下面的命令。 根据Rod在他的答案中的建议(关于如何手动修复引导加载程序的那个答案),我通过将该文件移动到上一级来备份它: $ sudo cp /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi /boot/efi/EFI/Microsoft/bootmgfw.efi 最后,我将GRUB2的引导加载程序复制到那个位置,"欺骗"系统加载我想要的引导加载程序,而不是Windows的原始引导加载程序。 $ sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
终于,我成功地让我的双系统启动工作正常了,使用的是GRUB2引导程序。万一Windows在更新后再次覆盖引导加载程序(就像它对我做的那样),我已经知道如何将grub恢复到原位。
希望这对其他人有所帮助。如果对我的解决方案有任何问题,请告诉我。

11谢谢,这很有帮助,但是我无法启动Windows。在启动时,它会启动GRUB,在GRUB中,“Windows引导管理器”选项再次返回到GRUB菜单(这是可以预料的,因为它链接到相同的.efi文件)。看起来像是这个问题,尽管我在使用boot-repair时没有成功。我通过进入Ubuntu,在/etc/grub.d/中填写40_custom文件,将我在Ubuntu粘贴板中拥有的Windows引导项复制并编辑.efi文件的URL,使其指向bootmgfw.efi的备份。所以menuentry包含chainloader /EFI/Microsoft/bootmgfw.efi - Vince
2那个菜单选项对我来说不起作用。 - Pierre
@Pierre May:也许使用以下菜单项对你有用: menuentry '真正的Windows' { set root=(hd0,gpt2) chainloader /EFI/Microsoft/bootmgfw.efi } (假设你的EFI分区位于第一块硬盘上,即sda2。为了确保,你可以在grub中输入"c",然后输入"ls"来查看可用的分区。) - tobiasBora
sudo efibootmgr -v对我没有帮助。但是你给我的路径是正确的。 - Dinuka Thilanga
1问题是Vince所描述的,以这种方式无法启动进入Windows,所以Windows引导程序是必需的。我认为目前最好的解决方案就是对于惠普笔记本按F9键。第二个最佳答案是michael_za的,但我的BIOS没有提供创建自定义启动选项的选项。 - Stardust

我在HP ProBook 4340s上遇到了同样的问题,原装的Windows 8已经被新的Kubuntu 15.04覆盖掉了(我不喜欢双系统启动)。在尝试其他方法之后,我还尝试了Boot-Repair(在安装后从硬盘和通过boot-repair-disk两种方式),但那个操作很可能是多余的。
解决问题的关键是在BIOS设置中进行以下更改(在计算机启动后按下F10键 - 进入系统配置 - 打开引导选项):
  1. 检查 自定义引导

  2. 取消勾选 安全启动

  3. 引导模式:选择 UEFI混合UEFI原生(我选择了 UEFI原生

  4. UEFI引导顺序:将 自定义引导 放在最上面

  5. 定义自定义引导选项:选择 添加 + 输入设置:\EFI\ubuntu\grubx64.efi

我们通过 从EFI文件引导 选项在 快速引导选项(F9)中打开GRUB时找到了正确的路径字符串。一开始,选项列表包括:

  • 操作系统引导管理器
  • 从EFI文件引导

添加自定义引导选项后,它被添加到列表中:

  • 定制启动
  • 操作系统引导管理器
  • 从EFI文件启动

在这里确实尝试了一下,在一台惠普ZBook 15上,但没有成功。 - cmbarbu
1如果您使用的是UEFI系统,并且在Windows 10之后安装了UBUNTU 16.10,那么这个答案是正确的。 - leoredi
1谢谢,我必须这样做:定义自定义启动选项:选择添加+设置为\EFI\ubuntu\grubx64.efi。 - m3asmi
对我也有效,Kubuntu 18.04.4 LTS 在 HP EliteBook 840 上。 - TimSparrow
@m3asmi 输入反斜杠有什么技巧吗?我的HP Zbook G2无法输入反斜杠,只能输入正斜杠。 - Oxidizing2408
我解决了这个问题。一些主板制造商似乎只支持在EFI系统分区(ESP)中的/efi/boot/目录位置上放置.EFI文件。GRUB安装程序可以使用--removable选项自动执行此操作。在运行以下命令之前,请确保已挂载ESP。假设ESP已挂载在/boot目录下(如前所建议),执行grub-install --target=x86_64-efi --efi-directory=/boot --removable。https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Bootloader - Oxidizing2408
谢谢。运作得非常顺利。 - Oddmar Dam
我有一台惠普Pavilion电脑,但我的BIOS甚至没有一个“自定义启动”复选框 :( - Stardust

通常情况下,运行Boot Repair会备份Microsoft的原始引导加载程序文件(bootmgfw.efi)为bootmgfw.efi.bkp,并用GRUB(或shim)的副本替换原始的bootmgfw.efi文件。你发布的Boot Repair输出应该显示这一点;然而,我没有看到这样的备份文件。因此,我建议你做以下三件事之一:
  • 再次运行引导修复,但查找与备份和替换微软引导加载程序相关的选项。激活这些选项以继续进程。GRUB 可能能够启动 Windows,也可能不能;这似乎是随机的——如果保持安全启动激活状态,则结果更倾向于失败。
  • 手动操作:从 Linux,备份 /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi(我建议将其移至下一级目录,即 /boot/efi/EFI/Microsoft/bootmgfw.efi,而不是将其重命名为 bootmgfw.efi.bkp,因为后者是非标准的,会导致除引导修复和 Ubuntu 的 GRUB 外的其他工具无法找到它)。将 /boot/efi/EFI/ubuntu/grubx64.efi 复制到此位置;或者,如果您打算保持安全启动正常工作,请将 /boot/efi/EFI/ubuntu/shimx64.efi 复制到此位置,并使用原始名称将 grubx64.efi 复制到 /boot/efi/EFI/Microsoft/Boot。然后,您需要修改 GRUB 配置以使其能够在新位置或新名称下启动 Windows 引导加载程序。(我听说 GRUB 目前无法在安全启动模式下启动 Windows 引导加载程序,所以如果您想从 GRUB 启动 Windows,则可能需要禁用安全启动。另一方面,我自己从未尝试过这个方法,所以关于 GRUB 在这方面的能力,我的理解可能是错误的。)
  • 禁用安全启动,然后启动 Linux 并使用 Debian 软件包安装 rEFInd 引导管理器。完成后,输入 sudo mvrefind.sh /boot/efi/EFI/refind /boot/efi/EFI/Microsoft/Boot。后一条命令以类似于我刚才描述的手动过程或引导修复执行的方式移动和重命名文件,但它设置 rEFInd 作为默认的引导加载程序,而不是 GRUB。如果要使用安全启动,您可以通过调整文件和安装新版本的 shim(Ubuntu 的 shim 版本太旧,不能与 rEFInd 正常工作)来实现。以这种方式安装 rEFInd 可以在不使用 GRUB 的情况下启动,而安装脚本(在安装 Debian 软件包时由软件系统执行)和 mvrefind.sh 脚本的组合可以解决您遇到的问题。
就事论事,你遇到的问题与HP的EFI实现中已知的错误有关。基本上,固件被硬编码为从Microsoft的启动加载程序引导,并且很难或不可能从其他任何位置引导。我强烈建议你向HP投诉这个问题;除非有人抱怨,否则他们不会修复这样的问题。
在这三个解决方案中,使用引导修复可能是最容易实现的;但正如我所指出的,引导修复使用的非标准命名可能会给将来的其他工具带来问题。手动调整需要更多的努力才能使其正常工作,但从长远来看会更干净。一些人报告了使用GRUB引导Windows启动加载程序时遇到的问题,因此无论选择哪个选项,都可能会给你带来麻烦。rEFInd更有可能在没有问题的情况下引导Linux或Windows,但从步骤中可以看出,让它工作可能需要比再次运行引导修复更多的努力,尽管比进行手动文件操作少。目前,与安全引导一起使用rEFInd需要更多的操作。 (有关详细信息,请参阅rEFInd的文档。)与GRUB相比,rEFInd还提供了更漂亮的用户界面,这可能对你有或没有重要性。
所有三种解决方案都存在风险;EFI实现在各个计算机之间差异太大,这意味着在一个计算机上运行良好的自动化或手动过程可能在另一个计算机上失败。为了保护自己,我建议备份您的ESP(通常在Linux下是/boot/efi);只需将文件打包成tarball或复制到备份目录中。如果出现严重问题,您可以使用紧急光盘启动并恢复文件。这样很有可能使计算机重新启动。

非常感谢!我还没有尝试过你的任何选项,但我会在这个周末尝试。 - maddentim
你的rEFInd启动管理器看起来很有趣。所以,你是在说我可以禁用安全启动并仍然使用Win8吗? 我有一个问题,当我尝试对/boot/efi进行tar打包时,tar会出现一些与ubuntu文件夹中的一些文件有关的错误。它们有一些奇怪的名称,比如'ame="App.lic'。请参考http://paste.ubuntu.com/1418009/中的809到817行。 这最后一次安装实际上是我第三次尝试。我认为它们可能是垃圾文件,可以删除。你觉得呢?我将在完成你的步骤之后再回复。 - maddentim
我看到过几份报告,说有人禁用了安全启动功能,但在启动Windows时没有遇到任何问题,所以这不是一个问题。如果你想保持它开启以获得安全性的好处,那是可以理解的,但你不必担心Windows无法启动。至于你的tar错误,听起来像是一个脚本出现了bug,并创建了一些奇怪命名的文件。我之前没有注意到你输出中的这些文件,但有可能是造成你启动问题的bug也同时导致了这些文件的产生。如果是这样的话,使用rEFInd可能能解决这个问题,但其他解决方案可能会失败。 - Rod Smith
rEFInd 安装失败。我认为 LovinBuntu 已经确定了问题所在。/boot/EFI 是只读的。以下是部分输出:mkdir:无法创建目录 /boot/efi//EFI/refind':只读文件系统 cp:无法创建常规文件 /boot/efi//EFI/refind/refind_x64.efi':没有那个文件或目录 正在安装 ext4 驱动程序 (ext4_x64.efi) mkdir:无法创建目录 `/boot/efi//EFI/refind':只读文件系统 已复制 rEFInd 二进制文件 - maddentim

惠普的UEFI让我头疼了一段时间。你的修复方法帮助我重新启动了我的惠普笔记本,而无需先按F9键。
但是我遇到了一个问题:在你的修复后,我可以在GRUB中选择Windows 8,但是Windows 8拒绝启动,然后再次显示GRUB菜单。
我的解决方法如下:
1. 将原始的Microsoft efi文件复制到`/boot/efi/EFI/Microsoft/Boot/bootmgf2.efi` 2. 编辑`/boot/grub/grub.cfg`以识别重命名后的Microsoft efi文件
现在笔记本可以从GRUB引导,Ubuntu和Windows 8也可以正常从GRUB启动。

我花了一天时间解决了同一个问题。以下是确切的解决方案。解决该问题的完整文章可在此处找到,其作者是Rod Smith

有用信息

为了使用GPT分区表和EFI引导加载程序引导启动,操作系统在安装时会创建efi文件,必须将这些文件提供给计算机的UEFI BIOS,以使其能够启动相应的操作系统。

为了保存EFI文件,我们需要有一个EFI分区。通常,这是一个小于200MB、格式为fat32、标签为EFI system的分区。它包括.efi文件及其依赖项(以.dll.efi的形式),用于启动任何可引导分区(通常是操作系统)。在我的计算机上,此分区的结构如下所示:

\EFI
   |_Boot
     |_fw
   |_Microsoft
     |_Boot
     |_Recovery
   |_Ubuntu
     |_fw

通常,.efi文件可以具有任何名称,但似乎一些计算机正在寻找特定的名称。因此,我也提到了标准名称。
  1. Boot文件夹:被识别为默认的引导选项,如果 NVRAM 被擦除,这将被默认使用。EFI 引导加载程序的名称是 "bootx64.efi"。当您想选择默认的 EFI 引导加载程序时,将您的 EFI 文件和其周围的所有文件复制到 boot 文件夹,并将源文件的 EFI 文件重命名为 "bootx64.efi"。

  2. Microsoft文件夹:它包含 Windows 的 EFI 引导文件。有几个 EFI 文件,但主要的是 "efibootmgfw.efi"。我确定这是 Windows 用于引导的。

  3. Ubuntu文件夹:它包含 Ubuntu 或 Mint 的 EFI 文件。有几个 .efi 文件,但主要的是 grubx64.efi

怎么做?

在操作系统安装的时候,已经有一些引导选项被安装了。然而,由于不同原因,比如移除和重新安装硬盘驱动器、安装新的操作系统或者更换主板电池,这些引导选项可能会从BIOS的引导选项中消失。有两种解决方案来恢复引导选项。

  1. (不推荐) 如一些答案所述,我们可以用一个无法工作的引导选项替换一个正常工作的引导选项。但问题仍然存在。

  2. 手动注册缺失的EFI引导加载程序文件。

如何操作?

  1. 从Linux可启动的闪存驱动器引导(我使用Linux Mint的可启动闪存驱动器)。这必须是一个EFI USB(可以通过像rufus这样的程序创建的GPT USB)。
  2. 挂载EFI分区,你的发行版可能会自动执行此操作。如果/boot可用并显示类似上面的结构,则跳过此步骤。现代的Ubuntu应该会为您执行此操作。
    1. 找到EFI分区的地址。可以使用parted命令或Disks程序来完成此操作。它通常是可启动磁盘中的第一或第二个分区(/dev/sda1或/dev/sda2)。该分区通常在100MB-200MB之间,具有FAT32文件系统和EFI系统分区类型。
    2. 挂载EFI分区。 您可以使用df命令检查分区是否已挂载。 df /boot/efi 如果分区以前没有挂载(不在上一个命令中显示),则使用mount命令挂载分区: mount /dev/sda1 /boot/efi
  3. 现在,如果您浏览/boot/efi,您将看到与我上面解释的类似的文件结构。检查是否可以在那里找到您丢失的操作系统的文件夹。在我的情况下,计算机的BIOS只能看到Windows的启动选项,但我也有Linux Mint的Grub启动选项。
    • (不推荐)我的Windows启动选项正常工作,所以为了测试目的,我首先备份了包含一堆文件和Windows引导efi文件(bootmgfw.efi)的Microsoft文件夹。然后,我将ubuntu文件夹重命名为Microsoft,接下来将grubx64.efi重命名为bootmgfw.efi。重新启动后,加载grub菜单而不是启动Windows,但这次只能通过grub启动Windows,无法直接启动Windows。
    • sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
    • (推荐方式)只需写入您希望其相关操作系统在BIOS的启动选项中显示的efi文件的地址。在我的情况下,Linux Mint在计算机BIOS的启动列表中缺失。它的efi文件的地址是相对于EFI分区根目录的/efi/ubuntu/grubx64.efi。然后,我使用efibootmgr命令将其注册到NVRAM中。 efibootmgr -c -d /dev/sda -p 1 -l \\efi\\ubuntu\\grubx64.efi -L nameForBootOption 在命令的p 1部分,1定义了给定磁盘上efi分区的分区号。 nameForBootOption是给启动选项指定的自定义名称。
*注意写正确的地址。当您在Linux中挂载分区时,它会将分区挂载到根目录下的某个文件夹中,将真实地址扩展为类似于/media/mint/CC1F-9708/EFI/ubuntu,但我们只需要给出/EFI/ubuntu部分。
*Disks程序是Linux Mint默认启动闪存上的一个很棒的图形工具。它可以用于检查和查找EFI分区,也可以用于挂载EFI分区,而无需使用任何mount或parted命令。您只需要在菜单中搜索它,选择“首选项”,然后选择“磁盘”。

1走了不推荐的路线。结果完美无缺。 - Evan Carroll
1我找不到推荐的方法能够正常工作。愚蠢的 BIOS 在启动过程中把操作系统引导管理程序添加到了顶部。只好选择非推荐的途径,但结果却非常成功。 - Hemil

在我的HP笔记本上,我按照以下步骤进行操作:
1 - 使用F9键启动Ubuntu
2 - 检查Windows引导加载程序的位置
sudo efibootmgr -v

在我的情况下,/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi 3 - 备份 .efi 文件:
sudo cp /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi /boot/efi/EFI/Microsoft/bootmgfw.efi

4 - 用Ubuntu的.efi文件替换原始文件(技巧):

sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi

5 - 在grub上添加Windows 10菜单项。打开/etc/grub.d/40_custom,并在文件末尾添加此菜单项:

menuentry "Windows 10 click here!" {
    search --set=root --file /EFI/Microsoft/bootmgfw.efi
    chainloader /EFI/Microsoft/bootmgfw.efi
}

6 - 保存40_custom并:

sudo update-grub

7 - 在BIOS中禁用安全启动(我不确定是否需要)
8 - 如果一切顺利,它将默认启动Ubuntu,并且Windows 10将成为GRUB菜单上的另一个选项。
这比我想象的要简单。

sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi 的操作非常顺利。 - Evan Carroll
@EvanCarroll,你觉得我应该改进我的回答吗?这真的是我所采取的步骤。 - Vitor Abella
嗯,老实说,我不确定是否真的需要这个答案。虽然有很多文字,但你的方法与Tekin在“不推荐使用”部分中的方法是一样的。但对于那些只使用Linux的用户来说,这种方法的简单性确实很棒。 - Evan Carroll

我在将Cent-OS 7安装在Windows 10上后遇到了类似的问题。以下是我遵循的步骤:
- 初始操作系统是Windows 10 - 使用Rufus创建的UEFI USB安装了Cent-OS 7
问题:Windows 10正在加载,但Cent OS引导菜单甚至没有显示出来。
解决方法: 1. 进入BIOS设置 2. 启用传统引导(只是为了以防万一) 3. 进入启动选项 4. 点击OS引导管理器 5. 将CentOS UEFI移动到Windows之上:按下F10保存 6. 再次点击OD引导管理器并进行验证 7. 按下F10保存并退出 现在您的系统将以CentOS UEFI引导。
由于我们启用了传统引导,我们可以选择按ESC键进入BIOS或其他启动选项。

我找到了一种方法,可以让我的HP Pavilion g7-2269wm(UEFI)启动rEFInd(也可能是GRUB),而无需替换bootmgfw.efi为rEFInd或GRUB。
我安装了rEFInd,并使用sudo efibootmgr -c -d /dev/sda -p 2 -L "rEFInd" -l "\EFI\refind\shimx64.efi"将rEFInd添加到引导管理器列表中。
重新启动,使用F9选择rEFInd,然后选择Ubuntu。
然后,使用bootmgfw.efi重命名为bootmgfwms.efi。
sudo mv /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi /boot/efi/EFI/Microsoft/Boot/bootmgfwms.efi

然后我重新启动了电脑,它自动进入了rEFInd引导界面,而无需按F9键。但是Windows 10的选项消失了,所以我选择了Ubuntu系统。
为了恢复Windows 10的选项,我运行了以下命令:
sudo mv /boot/efi/EFI/Microsoft/Boot/bootmgfwms.efi /boot/EFI/EFI/Microsoft/Boot/bootmgfw.efi

然后我重新启动了电脑,rEFInd在不按F9的情况下出现了,Windows 10也作为一个选项显示出来。

我有一台2018年的惠普笔记本,14英寸,配有Windows 10和Ubuntu双系统。我过去通常按下F9来选择我想要的操作系统,已经这样做了几周了。

解决方案:

  • 关机并按下F10进入BIOS

  • 导航到列出启动顺序的BIOS部分

  • 在OS引导管理器上按Enter

  • 使用F5或F6切换Ubuntu和Windows

  • 保存并退出


你受到这个错误的影响:https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1091477 解决方案:
  1. 通过Gparted创建另一个EFI分区(FAT32,200MB,在磁盘的前100GB内)
  2. 将'boot'标志移到该分区上
  3. 让Ubuntu使用这个新的ESP(例如通过Boot-Repair --> 推荐修复)。

好的,在第一个100GB内创建另一个ESP意味着需要将win8分区移动超过200MB...我认为需要小心。可能会破坏Windows的引导。也许我应该把它删掉。反正我也不喜欢它。我只是真的需要它来看Netflix! - maddentim
请更新Boot-Repair('boot-sav'和'boot-repair'软件包),然后运行建议修复,并指示新的URL出现。 - LovinBuntu
完成。 - maddentim