没有 USB 就无法启动,grub-install 和 boot-repair 都失败了

没有 USB 就无法启动,grub-install 和 boot-repair 都失败了

更新#4:正如所预料的,重置启动顺序不起作用:sudo efibootmgr -o 4,0,1,2什么也没做。

更新 #3:见底部

更新 #2:可能是因为 HP 的问题。请参阅 Rod 的回答。这个问题仍未解决。

更新:我进行了 Boot-Repair,但没有成功。有关详细信息,请参阅底部部分。


我刚刚在一台新的 2017 HP EliteBook 上安装了 Ubuntu 16.04.2 LTS,并配备了 Ubuntu 启动 USB。我删除了上面的 Windows,只保留了 Ubuntu。但是,除非我插入 USB,否则启动(请参阅下面有关 UEFI 的更多信息)无法找到操作系统。

因此基于这个答案我试过:

sudo grub-install /dev/sda

但是我收到了错误:

为 i386-pc 平台安装。grub
-install:错误:无法获取“aufs”的规范路径。

然后我尝试来自此答案的建议这给出了同样的错误。

sudo grub-install /dev/sda2

因为我想将它实际安装在我的硬盘上,其标识为:

sudo fdisk -l

Device      ... Size       Type
/dev/sda1       512M       EFI System
/dev/sda2       208.1G     Linux filesystem
/dev/sda3       15G        Linux swap

但我无法在 中找到 boot 的 grep sudo fdisk -l

我认为问题可能是我的根目录,/位于aufs,基于以下命令:

> df
Filesystem   .. ... Mounted on

udev                /dev
aufs                /

更多信息:

  • 该笔记本电脑配有 200 GB SSD
  • 当我安装 Ubuntu 时,它向我发出警告,说 UEFI 可能会损坏 BIOS 操作系统。我将启动设置为混合启动而不是传统启动,因为如果我使用传统启动,它甚至无法识别 Ubuntu USB 驱动器。然后我在 Ubuntu 安装过程中强制安装了 UEFI。(当它仍然有 Windows 10 时,它可能正在使用 BIOS,我无法得到明确的答案。)

更新:我试过了启动修复使用“在 Ubuntu 中安装启动修复”选项,得到这个粘贴2,关机,拔出 USB,打开,然后得到:

BootDevice Not Found

Please install an operating system on your hard disk.

我现在应该怎么做?


更新 #3:

以下是插入 USB 后试用 Ubuntusudo efibootmgr的结果。df

<code>sudo efibootmgr</code> 和 <code>df</code> 在 Try Ubuntu

问题:

  1. 显然我应该进行更改,以便启动顺序不会先是 USB,最后是 Ubuntu。我该如何将其上调?

  2. 如果 .efi 文件可能有问题。我不知道我到底应该重命名什么以及如何重命名。目前,我的启动 USB 安装在 /cdrom 上。但在 /cdrom/EFI 中只有 BOOT。在 /cdrom/EFI/BOOT 中有这些文件:

    BOOTx64.efi 
    grubx64.efi
    

    2a. 我是否应该以某种方式将 SUB 挂载从 /cdrom 更改为 /mnt?

    2b. 我应该重命名哪个文件并重命名为哪个?因为...

    ubfan1 说“将 /EFI/ubuntu/shimx64.efi 重命名为 /EFI/ubuntu/bootmgfw.efi

    “作为我推荐的后备方案,将磁盘引导程序 /EFI/Boot/bootx64.efi 设置为 /EFI/ubuntu/shimx64.efi 的副本。由于 shimx64.efi 需要同一目录中的 grubx64.efi,因此将 /EFI/ubuntu/grubx64.efi 复制到 /EFI/Boot/grubx64.efi

    “您确实找到了与安装介质上完全相同的设置 - /cdrom/EFI/BOOT/BOOTx64.efi 实际上是 shimx64.efi 的副本。这就是安装介质在 UEFI 模式下使用其默认引导加载程序进行引导的方式。

    Rod Smith 说评论“您必须研究将主引导加载程序或引导管理器文件重命名为 EFI/BOOT/bootx64.efi 的解决方法”。

    我很困惑

答案1

sudo grub-install /dev/sda

但是我收到了错误:

Installing for i386-pc platform.
grub-install: error: failed to get canonical path of `aufs'.

无论您是否知道,将/dev/sda设备传递给 都grub-install意味着安装 BIOS 模式版本的 GRUB。(当然,您可能错误地传递了该选项。)同样,GRUB 尝试安装的响应i386-pc platform也意味着 BIOS 模式 GRUB 安装。我不知道failed to get canonical path ofaufs'` 消息是什么意思。但是,GRUB 的 BIOS 模式版本至关重要,因为……

sudo fdisk -l

Device      ... Size       Type
/dev/sda1       512M       EFI System
/dev/sda2       208.1G     Linux filesystem
/dev/sda3       15G        Linux swap

存在EFI 系统分区 (ESP)意味着磁盘设置为以 EFI 模式启动,而不是 BIOS 模式。(顺便提一下,您显然从您的fdisk。在寻求帮助时,您不应该这样做。这些行可能有助于诊断您的问题,尽管它们大概在这种特定情况下是多余的。)

如今,绝大多数新电脑出厂时都默认配置为以 EFI 模式启动。您可以在固件中启用 BIOS/CSM/传统模式支持,一些 Ubuntu 和 Linux 安装说明也建议这样做;然而,在大多数情况下,这不是一个好建议。请参阅我关于这个主题的页面了解原因。目前还不清楚您是否自己进行了这些更改;Ubuntu 安装中明显存在 BIOS 模式版本的 GRUB,这表明您是在 BIOS 模式下安装的;但是,磁盘分区表明您是在 EFI 模式下安装的。

由于这是新安装,我建议配置您的固件以启动仅有的在 EFI 模式下,然后安装 EFI 模式引导加载程序。有很多方法可以做到这一点。最简单的三种是:

  • 使用启动修复-- 如果您可以获得 Ubuntu 应急磁盘以在 EFI 模式下启动,它应该能够重新安装 GRUB(在 EFI 模式下),然后您就可以开始了。引导修复工具可以半自动地完成此操作;但是,您必须从 EFI 模式启动运行它才能成功。如果您切换到 BIOS 模式启动来解决启动 Ubuntu 安装介质的问题,您可能需要重新创建 Ubuntu 安装介质或以其他方式先解决该启动问题。有关此主题的更多信息,请参阅我之前提到的 CSM 页面。
  • 使用 rEFInd-- 您可以使用我的 CD-R 或 USB 闪存驱动器版本启动计算机rEFInd 启动管理器。(这两个的下载链接都在这个页面上。)启动后,您可以安装 rEFInd Debian 包或 PPA。然后,您应该能够重新启动并使用 rEFInd(而不是 GRUB)来控制启动过程。
  • 重新安装 Ubuntu-- 如果您重新配置(如有必要)固件以在 EFI 模式下启动,并能让安装程序在该模式下启动,则重新安装 Ubuntu 是另一种选择。这有点过分,但考虑到它是新的,它可能比尝试修复当前安装更容易。

编辑:

从你的 Boot Repair 输出中,可以找到一些问题原因的线索:

File system:       vfat
Boot sector type:  FAT32
Boot sector info:  No errors found in the Boot Parameter Block.
Operating System:  
Boot files:        /EFI/Boot/bootx64.efi /EFI/ubuntu/MokManager.efi 
                   /EFI/ubuntu/fwupx64.efi /EFI/ubuntu/grubx64.efi 
                   /EFI/ubuntu/shimx64.efi 
                   /EFI/Microsoft/Boot/bootmgfw.efi 
                   /EFI/Microsoft/Boot/bootx64.efi

请特别注意 Microsoft 启动文件(/EFI/Microsoft/Boot/bootmgfw.efi/EFI/Microsoft/Boot/bootx64.efi)的存在。这些文件表明您没有删除 ESP,因此 Windows 启动加载程序文件似乎潜伏在您的 Ubuntu 安装旁边。另外,检查输出efibootmgr

=================== efibootmgr -v
BootCurrent: 0000
Timeout: 0 seconds
No BootOrder is set; firmware will attempt recovery
Boot0000* USB Hard Drive 1 - Generic Mass Storage   BBS(HD,,0x900).......................................................................
Boot0001* Notebook Hard Drive   BBS(HD,,0x0).......................................................................
Boot0002* Notebook Ethernet BBS(128,,0x0).......................................................................
Boot0003* Windows Boot Manager  HD(1,GPT,2c19863f-1ed0-476e-a8e9-6d316ca2c4bb,0x800,0x32000)/File(EFIMicrosoftBootbootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...a................
Boot0004* ubuntu    HD(1,GPT,17667422-8dfe-45ba-9baa-5458a67b71db,0x800,0x100000)/File(EFIubuntushimx64.efi)

Windows 启动项仍然存在,这并不奇怪;然而,真正混乱的部分是报告No BootOrder is set; firmware will attempt recovery。正常工作的 EFI 依赖于一个名为的变量BootOrder来标识引导加载程序的运行顺序。您的计算机上没有此变量。我在一台相当旧的 HP 6470b 笔记本电脑上也看到了同样的问题,无论我怎么尝试,都无法创建这个变量。无论如何,可能的结果是计算机试图启动后备引导加载程序 ( EFI/BOOT/bootx64.efi) 或 Microsoft 引导加载程序 ( EFI/Microsoft/Boot/bootmgfw.efi)。如果启动的引导加载程序是原始的 Microsoft 引导加载程序,那么它在此时就会失败,因为 Windows 尚未安装。如果您已将其他内容复制到这些文件中(有意或无意),如果其支持文件也不存在,它可能会失败。

既然你说你的电脑是新的,我的第一个建议是将电脑退回商店退款并购买其他产品。问题可能是样本缺陷(NVRAM 芯片损坏等),也可能是 HP 固件中的错误。如果是前者,同一台电脑的新版本可能会正常工作;但如果是错误的固件,新电脑将无济于事。(另一方面,如果是错误的固件,固件更新解决问题的可能性很小。将固件选项重置为默认值也可能会有所帮助。)如果你将电脑退回商店退款,请务必告诉 HP 你这样做了,以及原因。制造商将继续销售有缺陷的产品,除非他们意识到他们这样做,并且他们为此承受一些痛苦(以退货的形式)。

如果您不想得到一台完好无损的计算机,那么您必须处理它。最好的方法是从 ESP 中删除那些 Windows 引导加载程序文件,并将 GRUB 复制到后备文件名EFI/BOOT/bootx64.efi。(该位置已经有一个文件,但不清楚它是 GRUB 的另一个副本、Windows 引导加载程序的另一个副本还是其他文件。)您还需要将grub.cfg和其他文件从EFI/ubuntu复制到EFI/BOOT。如果您使用 Boot Repair,其高级页面上有一个选项可以半自动执行此操作。


编辑2:

-o您可以使用选项更改启动顺序efibootmgr,例如:

sudo efibootmgr -o 4,0,1,2

此示例应保留显示的现有启动项,但将项添加ubuntu到前面。理论上,这将使 GRUB 成为默认启动程序,然后一切都将开始工作。您可以efibootmgr通过键入 来了解更多信息man efibootmgr。(同样的技巧也适用于其他命令;例如,man ls将告诉您有关该ls命令的信息。)

话虽如此,但事实上你没有BootOrder话虽如此,但一开始应该有将条目添加ubuntu到变量的开头BootOrder,假设它们在 EFI 模式下运行 - 并且您显示的 Boot Repair 输出显示您的磁盘上没有 BIOS 模式引导加载程序,这意味着它们在 EFI 模式下运行。)

EFI 系统分区,或者系统上用于实现此目的的分区,我认为您对它们感到困惑:

  • 在硬盘上/dev/sda1--根据 Boot Repair 输出,硬盘上的 ESP 是。/boot/efi当您在硬盘上启动 Ubuntu 时,此分区应安装在;但是当您在“安装前尝试”模式下使用 Ubuntu 安装介质时,它要么不会自动安装,要么会安装在其他地方,在 的子目录中,如果我没记错的话/media
  • 在安装介质上- 它不是技术上ESP,但/dev/sdb1在您的安装介质上起着相同的作用。它包含一个EFI/BOOT包含各种启动文件的目录。调整这些文件充其量是毫无意义的,至少在您的情况下是如此,因为您希望在不使用安装介质的情况下让系统启动到已安装的操作系统。

如果您使用安装盘启动,则修改硬盘 ESP 上的文件需要安装 ESP,然后修改这些文件。您可以执行以下操作:

sudo mkdir -p /mnt/foo
sudo mount /dev/sda1 /mnt/foo
cd /mnt/foo/EFI
sudo mv Boot Boot-old
sudo cp -r ubuntu BOOT
sudo mv BOOT/shimx64.efi BOOT/bootx64.efi

请注意,输入错误(无论是我输入的还是您的输入)都可能导致这些命令无法按预期工作,这样的错误甚至可能使情况变得更糟。如果成功,此命令序列将把 Shim(处理安全启动身份验证)复制到后备文件名EFI/BOOT/bootx64.efi。Shim 随后将启动 GRUB(grubx64.efi),从而继续启动过程。如果efibootmgr -o我之前介绍的命令不起作用,此序列应该可以让系统启动。

除此之外,你还问了很多相当基本的问题,这使得这个问题和它的答案变得错综复杂。我建议你做一些课外阅读:

一旦你理解了这些基础知识,你可能会从这里的答案中得到更多——但请注意,由于初始信息不完整和猜测不正确,我们已经走进了几个死胡同。如果你在阅读了至少部分上述内容后仍然有问题,我建议你提出新的问题,或者将讨论带到Ubuntu 论坛,更适合于来回讨论。(本网站旨在回答相对简单的问题,而不是进行长时间的讨论。)

答案2

看起来 boot-repair 确实在 efibootmgr 的最后一次运行中将 ubuntu shimx64 启动项添加为项目 0004(在您的粘贴链接中)。在 efibootmgr 的早期运行中缺少 0004(在您的粘贴中)。
编辑 VVVV
您最近手动运行的 efibootmgr 在启动顺序中没有 0004,即使列出了该项目。自己添加:

sudo efibootmgr --bootorder 0004,0000,0001,0003,0002

前导零是可选的,但上面使用显示的条目。
编辑^^^^

但是,这是 HP,对 UEFI 进行了一些供应商特定的调整,这打破了标准设置——基本上添加了引导加载程序必须具有的特定批准名称(Windows Boot Loader)。此外,引导加载程序的文件名必须是 bootmgfw.efi。efibootmgr 可用于重命名引导加载程序条目:

sudo efibootmgr -b 0004 -l /EFI/ubuntu/bootmgfw.efi -L "Windows Boot Loader"

只需将 /EFI/ubuntu/shimx64.efi 重命名为 /EFI/ubuntu/bootmgfw.efi 即可
编辑 VVVV
重命名是硬盘上的文件。您的 df 显示硬盘的 EFI,sda1,未安装在任何地方,因此在您安装它之前,您甚至看不到将出现在您安装它的位置的 /EFI 目录。不要触碰 /cdrom 目录下的任何内容。
编辑 ^^^^

这应该可行(在此站点搜索 HP UEFI 问题,但我认为这总结了解决方案)。

编辑VVV将硬盘的EFI分区挂载在/mnt

sudo mount -tvfat /dev/sda1 /mnt

现在在 /mnt 下,您应该会看到硬盘 sda1 分区的 EFI 目录。所有修改都针对这些文件 /mnt/EFI/ubuntu/... 和 /mnt/EFI/Boot/...
进行编辑 ^^^

作为我推荐的备用方案,将磁盘引导程序 /mnt/EFI/Boot/bootx64.efi 设置为 /mnt/EFI/ubuntu/shimx64.efi 的副本。由于 shimx64.efi 需要同一目录中的 grubx64.efi,因此将 /mnt/EFI/ubuntu/grubx64.efi 复制到 /mnt/EFI/Boot/grubx64.efi

该后备引导加载程序可以独立于 nvram 启动项工作,并且如果某些程序决定更改 nvram 启动列表,它将保持您的启动正常工作。


不久前,我有一个双启动、启用安全启动的主机,其中 ubuntu/shim 是第一个 nvram 条目,在 USB 上创建安装介质后,shimx64 条目更改为 grubx64.efi(当然,在启用安全启动的情况下无法成功启动)。创建 USB 安装介质时,UEFI 存在其他更严重的问题,因此我最终将默认系统更改为以传统模式运行。
您在安装介质上找到的 /cdrom/EFI/BOOT/BOOTx64.efi 实际上是 USB 的启动文件。不要更改它,因为它可以工作。请注意,BOOTx64.efi 只是 shimx64.efi 的副本。这就是安装介质在 UEFI 模式下使用其默认引导加载程序进行启动的方式。这个确切的设置(嗯,不区分大小写)就是您作为后备放在硬盘上的内容。


如果 sudo mount /dev/sda1 /mnt 失败,因为“它已经挂载”,则使用 df 查看位置,但如果您没有这样做,那就很奇怪了。它不是 /cdrom/EFI,那是一个目录(但 bootx64.efi 和 grubx64.efi 放到硬盘上的另一个来源)。可能磁盘被重新枚举,硬盘变成 sdb,而 sda 则留在 USB 上。查看 df 的内容,如果是这种情况,则将挂载更改为 /dev/sdb1。

相关内容