注意:这与许多看似相似的现有问题有微妙的不同。
我在笔记本电脑的内置驱动器上安装了 Windows 10,在外置 USB 硬盘上安装了 Ubuntu 17.04。在 Windows 10 Creators Update 发布之前,一切都运行良好。所谓运行良好,是指如果插入硬盘,它将启动 Ubuntu,如果没有,grub 会抱怨找不到 Ubuntu。我可以输入“exit”,最终进入 EFI 菜单,从那里我可以选择 Windows 启动管理器并启动 Windows。
自 W10 Creators Update 以来,它始终直接启动到 Windows,即使已连接 USB HDD,即使 EFI 启动顺序菜单仍将“Ubuntu”显示为第一项。我尝试将 USB HDD 移至第一项,但它仍直接启动到 Windows。
我想借此机会正确地修复这个问题,因此如果插入了 USB HDD,它将启动到 Ubuntu,如果没有,它将启动到 Windows 而无需任何交互。
我启动了 Ubuntu Live 16.04,因为这是我在 USB 上已有的。使用gparted
,我看到 Ubuntu USB HDD 驱动器有
/dev/sdc1 ext4 139.70 GiB boot
/dev/sdc2 extended 11.17 GiB
/dev/sdc5 unknown 11.17 GiB
unallocated unallocated 314.89 GiB
我正在查看Windows 10 升级会杀死 grub,并且启动修复也无济于事尝试根据我的情况进行修改,并有以下问题:
包含 17.04 的根分区是
/dev/sdc1
。说明建议/dev/sd*1
将其作为 EFI 分区,并将/dev/sd*2
其作为根分区。如何确定是否需要 EFI 分区?我考虑过
sudo grub_install /dev/sdc
按照上面链接的说明尝试,但在尝试之前,我希望确信它不会让情况变得更糟。这样做明智吗?在这种情况下我还需要 Grub 吗?由于磁盘上只有一个操作系统,因此我不需要在开机时选择操作系统。
附录
拔出 USB 硬盘后无法启动的原因是grub-install
错误 1173457。这也解释了 Windows 更新如何能够破坏 Ubuntu 启动 - 它使用了错误安装在内部磁盘上的 grub,并解释了为什么 USB HDD 无法自行“启动”。
答案在在外部 USB 驱动器上安装 Ubuntu 17.04,无需修改内部硬盘有关于如何修复有问题的 grub 安装的建议。我无法直接应用这些建议,因为我没有好的 grub.cfg,而且我的 USB HDD 没有使用 EFI。/boot/efi 是空的。此外,在考虑是否安装grub
到 USB HDD 之前,我需要问题 3 的答案。
boot-repair
发现
报告boot-repair
网址为http://paste.ubuntu.com/25148428/。
/dev/sda 是 Windows 的内部磁盘,/dev/sdb 是启动 Ubuntu Live 的 USB 记忆棒,/dev/sdc 是安装 17.04 的 USB 硬盘。从我对启动的有限了解来看,/dev/sdc 上确实没有启动文件,Windows 在 /dev/sda 上安装了 EFI/Boot/bootx64.efi,我猜它优先于 EFI/ubuntu/grubx64.efi。
所以我需要知道如何在 /dev/sdc 上安装启动文件,而无需将内容写入 /dev/sda。
顺便问一下,为什么它不是boot-repair
Ubuntu Live 的标准部分?
首次尝试修复
我在 /dev/sdc 上未分配空间的末尾创建了一个新的 550MiB fat32 分区。gparted
我的 Ubuntu Live USB 驱动器不支持 ESP 标志,因此我只设置了启动标志并添加了标签“ESP”。然后我尝试从内部磁盘复制启动文件,但复制时出现错误:例如
cp: error reading '/boot/efi/EFI/ubuntu/shimx64.efi’: Input/output error
cp: failed to extend ‘/mnt/EFI/ubuntu/shimx64.efi’: Input/output error`
考虑到 ESP 文件系统可能损坏,我启动 Windows 禁用快速启动并关闭 Windows。我再次启动 Ubuntu Live 并再次尝试复制。还是一样。
于是我按照第二个答案中的说明进行操作Windows 10 升级会杀死 grub,并且启动修复也无济于事,用于/dev/sdc1
我的 USB HDD 上的 linux 分区并安装/dev/sdc3
ESP。这些指令的核心是运行grub-install /dev/sdc
。
当我尝试重新启动时,出现了安全启动错误。当我忽略此错误时,Windows 启动了,并在过程中运行了一些磁盘检查。我将其关闭,进入 EFI,关闭安全启动,这次 Ubuntu 启动了。
我关机,拔下 USB 硬盘并重新启动。它无需我进行任何交互就启动了 Windows。然后我重复上述操作,重新插入 USB 硬盘,Ubuntu 启动了。
确实有进步。
然而我发现两件奇怪的事情:
/dev/sda3
(内部磁盘 ESP)安装在/boot/efi
。/dev/sdb3
(USB HDD)安装为/media/mark/ESP
。/media/mark/ESP/EFI/ubuntu
有一个子目录,也称为,其中ubuntu
的文件与父目录中的文件同名(grub.cfg
,,,加上一个目录和一个文件。 ,simx64.efi`的内容有所不同。grubx64.efi
mmx64.efi
shimx64.efi
fw
fwupx64
grub.cfg
grubx64.efi &
我还没有完成第 5 步和第 6 步罗德·史密斯答案。第 6 步看起来应该可以修复第 1 点。
更新 1我已完成第 6 步,编辑了 /etc/fstab,现在/dev/sdb3
已挂载到 /boot/efi。当然,我仍然可以看到那些额外的文件。
更新2我现在已经完成第 5 步,将 ubuntu 文件复制到 EFI/boot,并将复制的 shimx64.cfg 重命名为 bootx64.cfg。这使其与现在已重新启用的安全启动兼容。
删除 /dev/sdb ESP 中的多余文件可以吗?什么是fw
和fwupx64
?我需要它们吗?
答案1
最初的问题
从根本上来说,你的最初的问题是由几个问题交叉引起的:
- 您的计算机正在启动 Windows,并且正在以 EFI 模式启动 Ubuntu;但是,
/dev/sdc
安装 Ubuntu 的 是 MBR 磁盘。最好从 GPT 磁盘进行 EFI 模式启动。(可以从 MBR 磁盘以 EFI 模式启动,但您的磁盘未设置 MBREFI 系统分区 [ESP],这对于该操作是必需的。)这并不是一个真正关键的问题,因为您的 GRUB 安装到了/dev/sda
,也就是 GPT;但如果您需要从 更直接地启动,这可能会变得复杂/dev/sdc
。 - 在 EFI 模式下安装到具有多个磁盘的计算机时,Ubuntu 安装程序会将 GRUB 安装到它找到的第一个 ESP。这通常是 ESP 开启的
/dev/sda
情况/dev/sda3
。由于您的计算机/dev/sdc
没有 ESP,因此它实际上没有其他办法。 - 在 EFI 模式下安装时,Ubuntu 将 GRUB 安装为 ,
EFI/ubuntu/grubx64.efi
将 Shim 安装为EFI/ubuntu/shimx64.efi
。要从可移动介质启动,最好将引导加载程序(通常为 Shim)安装为EFI/BOOT/bootx64.efi
。由于您/dev/sdc
没有 ESP,这是不可能的。我提到它是因为重命名 GRUB 可能是解决初始问题的一部分——但可能不是最简单的解决方案,如后所述。 - GRUB,至少在 Ubuntu 的配置中,依赖于两个分区上的文件:ESP 和保存 Linux 内核的分区。就您而言,这些分区位于两个物理磁盘上——
/dev/sda
和/dev/sdc
。因此,当您拔下外部磁盘时,GRUB 会从菜单切换到提示符grub>
,因为它无法再在外部磁盘上找到其配置文件。将 GRUB 的两个部分放在一个物理磁盘上是解决此问题的一种方式——但还有其他修复方法……
这些问题的最终结果是,计算机按照您描述的方式运行,只有插入外部磁盘后才能通过 GRUB 进行启动。还有其他方法可以使其工作,但需要一些知识来设置。(稍后会详细介绍……)
Windows 更新可能造成什么问题以及如何修复它
我不确定 Windows 更新发生了什么。通常,我猜它改变了启动顺序,使 Windows 成为默认启动顺序;但您的efibootmgr
输出(Boot Repair 输出的第 1000-1024 行)显示它仍然是启动顺序中的第一位(在您通常可能不使用的 USB 驱动器之后)。这个启动顺序更改假设也无法解释即使选择启动菜单中的选项ubuntu
也无法让系统启动的事实。ubuntu
因此,我只能提出第二个假设:您的 ESP 文件系统可能已损坏。如果您启用 Windows 快速启动和/或休眠功能,则可能会发生这种情况。这些功能将关机操作转变为挂起到磁盘的操作,这会导致磁盘文件系统处于不一致的状态,从而阻止 EFI 读取其中的某些文件。因此,我建议您禁用这两个功能,如所述这里和这里。请注意,您可能需要至少重新启动一次才能使此更改生效。
另一种可能性是,您遇到了某种安全启动问题。除非微软决定将 Ubuntu 列入黑名单,否则我认为 Windows 更新不会影响此问题,而且我还没有听说他们这样做。尽管如此,安全启动也可能出现故障。如果是这种情况,禁用它应该可以解决问题。不幸的是,具体如何执行此操作因系统而异,因此我无法提供简洁的说明。请参阅我的这个页面不过,举几个例子。
解决原始问题
最好的情况下,禁用快速启动、休眠和/或安全启动将使系统像以前一样启动。但这不是最佳选择。有几种可能的方法可以改进配置。最简单的方法可能是安装我的rEFInd 启动管理器。鉴于您当前的配置,rEFInd 应该会安装到 ESP 并在您第一次启动时启动。但是,如果您保持安全启动处于启用状态,这实际上会绕过 MokManager,这是一个用于管理机器所有者密钥 (MOK) 的实用程序,这些密钥是 Shim 用于授权启动的安全启动密钥。您需要使用原始的 MokManager 用户界面来找到refind.cer
和/或refind_local.cer
密钥(可能在目录中)EFI/refind/keys
,并将它们添加到 MOK 列表中。请参阅rEFInd 安全启动文档了解更多详情。
一旦启动 rEFInd,它就会显示启动 Windows 和 Ubuntu 的选项。由于 rEFInd 不依赖外部磁盘上的配置文件,因此grub>
当您拔下外部磁盘时,它不会执行相当于进入提示符的操作;它只会停止显示直接启动 Linux 内核的选项。(它可能仍会显示通过 GRUB 启动 Ubuntu 的选项,但该选项只会生成提示符grub>
。)
解决问题的另一种方法是/boot
在内部磁盘上创建一个单独的分区。还有一种方法是在外部磁盘上创建一个 ESP,并使用文件名将 GRUB 移动到那里EFI/BOOT/bootx64.efi
。这两个选项可能比安装 rEFInd 更麻烦——尽管如果您不熟悉操作,安装 MOK 可能会令人沮丧。
编辑:
回复您的评论:
- 许多 EFI 具有非常精细的 FAT 驱动程序,它们会阻止不会影响 Windows 或 Linux 的文件系统损坏。另外,请注意,我提到的文件系统损坏对于 Windows 来说是不可见的,因为它是由于以下事实造成的:在快速启动打开的情况下,Windows 在休眠(“关闭”——但实际上不是关机)。如果没有其他操作触及文件系统,Windows 再次启动时它将处于预期状态——但 EFI 和任何其他操作系统都会将其视为不一致状态。这是双启动场景中非常现实和非常严重的问题。我强烈建议您认真对待这个问题!如上所述,禁用快速启动和休眠是一种要求当一个操作系统是 Windows 8 或更高版本时,可以安全地进行双启动。您遇到的问题只是禁用此功能失败的一个可能症状;您现在或将来可能会遇到其他问题,这些问题可能会影响 ESP 以外的分区。
- 问题的第二段提到了启动菜单。我假设你指的是大多数 EFI 提供的启动菜单,通常是通过按功能键、Esc 或 Enter(但具体哪个键因计算机而异)。在某些情况下,退出 GRUB 后也可能会显示此启动菜单。此菜单应使你能够选择要运行的启动程序。可以使用实用程序在 Ubuntu 中对其进行操作
efibootmgr
,并且你的 Boot Repair 输出会显示系统上第 1000-1024 行的内容列表。 - 如果您在 上创建 ESP
/dev/sdc
,则它在该磁盘上的位置并不重要。一些文档建议将其放在磁盘的开头,但那只是为了避免后续分区更改。磁盘的末尾也同样适用,并且可能更适合您的情况,因为从分区末尾调整大小比通过更改分区的开头调整大小更快、更安全。 - 在 MBR 磁盘上,最近的和 GParted 的最新版本
parted
可以通过设置“esp”标志来设置 ESP 类型代码 (0xEF)。旧版本的parted
和 GParted 无法在 MBR 磁盘上设置此类型代码;您需要使用fdisk
将类型代码设置为 0xEF。如果您使用 转换为 GPTgdisk
,您可以在该工具中将其类型代码设置为 EF00,或者在parted
或 GParted 中设置“boot/esp”标志。(旧版本没有“esp”标志,因此您需要使用“boot”。)请注意,和 GParted 中的“boot”标志parted
对于 MBR 和 GPT 磁盘具有完全不同的含义。 - 我建议将 ESP 设置为 550 MiB(或更大,但这通常足够大)。原因很复杂,与某些计算机上不稳定的 EFI FAT 文件系统驱动程序有关。
- 如果你坚持要安装 ESP
/dev/sdc
,你可能需要考虑将其从 MBR 转换为 GPT。这是大概不是必需的,但有可能。(这取决于您的 EFI 实现。)请参阅我的这个页面了解有关如何执行此操作的详细信息。 - 如果您创建了 ESP
/dev/sdc
并将 GRUB 移至那里,则应将 Shim 复制到EFI/BOOT/bootx64.efi
ESP 上的 fallback filename ( )。即:- 将 ESP安装
/dev/sdc
在某处。假设它是/mnt
。 - 准备一个目录树:
sudo mkdir -p /mnt/EFI/ubuntu
。 - 从 ESP 复制 GRUB
sudo cp -r /boot/efi/EFI/ubuntu/* /mnt/EFI/ubuntu/
:。 - 复制新
ubuntu
目录:sudo cp -r /mnt/EFI/ubuntu /mnt/EFI/BOOT
。 - 重命名 Shim:
sudo mv /mnt/EFI/BOOT/shimx64.efi /mnt/EFI/BOOT/bootx64.efi
。 - 编辑
/etc/fstab
以将 ESP 从/dev/sdc
而非 上安装/dev/sda
到/boot/efi
。这将简化后续的软件更新和维护。 - 重启时,您需要
/dev/sdc
在计算机内置的启动管理器菜单中选择启动选项。从长远来看,这可能很繁琐。
- 将 ESP安装
综上所述,我认为我推荐安装 rEFInd 的原因应该很清楚了——通过这种方式,无需重新分区/dev/sdc
或手动复制文件。这些操作非常繁琐,而且很容易出错。此外,如果您依赖EFI/BOOT/bootx64.efi
外部磁盘上的后备文件名 () 上的 GRUB,您还需要使用计算机的内置启动管理器来启动 Ubuntu。这可能很繁琐。您可能能够使用 明确注册EFI/ubuntu/shimx64.efi
外部磁盘上的引导加载程序efibootmgr
,但许多 EFI 会在您拔出磁盘时删除该条目,因此这可能无法按预期工作。另一方面,如果您保持安全启动处于活动状态,使用 rEFInd 确实需要注册 MOK,这很麻烦;但风险较小,而且,恕我直言,轻微地比处理所有文件更容易。每次启动时,您还将拥有一个简单、一致的启动菜单,而无需在启动时恰好按下功能键。
答案2
Microsoft Windows Creator's Update 再次犯了同样的错误。Windows Anniversary Update 也出现了同样的错误。它用自己的加载程序覆盖了 GRUB,而且似乎想要清除 Linux(Ubuntu)分区。
查看你的 /dev/sdc 驱动器,它看起来像:
/dev/sdc1 may have been your / (root)
/dev/sdc5 may have been your swap partition
then there's 314GB of unallocated space which may have been your /home
这种配置听起来熟悉吗?如果是的话,那么:
- 启动至 Ubuntu Live DVD/USB
- 安装
testdisk
- 看http://www.cgsecurity.org/wiki/TestDisk_Step_By_Step有关如何恢复丢失分区的信息。
- 你可能还有一个损坏的交换分区 /dev/sdc5