不久前,我在我的 Dell XPS15 上安装了 Arch Linux 和 Windows 10,一切似乎运行良好,但是最近我的笔记本电脑突然直接启动到 Windows 并跳过 systemd-boot 菜单。
我创建了一个可启动的 Arch USB,并查看了 EFI 和 Arch 分区,一切似乎都没有变化,我尝试在 BIOS 设置中查找启动顺序选项,唯一的选项是整个 SSD,我无法选择要启动的特定分区。
有人知道是什么原因导致了这种突然的变化吗?有没有人遇到过类似的问题?有谁知道我该如何解决这个问题?
这是我的 Windows 磁盘管理器的屏幕截图,我注意到 Windows 分区设置了 Boot 标志,我不确定它是否应该这样?这有帮助吗?
答案1
背景信息
我尝试在 BIOS 设置中查找启动顺序选项,唯一的选项是整个 SSD,我无法选择要启动的特定分区。
你误解了——你似乎认为 EFI 会引导到分区,但事实并非如此。在 EFI 下,引导条目存储在 NVRAM 中,这些条目指向文件。你可以在一个计算机上安装一个、两个、十个、一百个或更多的启动程序单身的分区,或分散到任意多个分区。如果您将 EFI 视为启动磁盘或分区,则可能会得出错误的结论并尝试以完全不合适的方式修复问题。
这条规则的一个例外是后备文件名, EFI/BOOT/bootx64.efi
(或其他 CPU 类型的变体)。这是 EFI 在没有其他可用文件时尝试引导的文件名。它最初是用于可移动媒体的,但现代 EFI(几乎?)也总是在硬盘的 ESP 上识别它。这可以成为解决引导问题的有用工具,例如,如果您的固件忘记了其常规引导条目——似乎您就遇到过这种情况。还请注意,许多 EFI 将 Windows 引导加载程序EFI/Microsoft/Boot/bootmgfw.efi
视为后备文件名。这可以让 Windows 保持引导,即使计算机的固件设置混乱——但这当然对 Linux 用户没有任何帮助。
我注意到 Windows 分区设置了 Boot 标志,我不确定它是否应该是这样的?
据我所知,Windows 会忽略 GPT 磁盘上的“启动标志”。另外,请注意,您显示的屏幕截图的 Windows 工具报告的“启动标志”和parted
Linux 中的 GParted 报告的“启动标志”是完全不同的事情!(在 Linux 工具中,此“标志”与 GPT 磁盘上的 ESP 类型代码同义。)
更直接的答案
简而言之,你正在经历我所说的靴子政变。看我的这个页面有关此主题的更多信息。您可能能够在 Windows 中通过使用简易UEFI工具将您的 Arch Linux 条目恢复到启动顺序的顶部;但是,您说固件的启动管理器没有显示任何特定于操作系统的条目。(您提到的整个磁盘条目可能会启动后备引导加载程序,也可能会在 BIOS/CSM/传统模式下启动系统;如果不查看条目并尝试查看使用它时会发生什么,我无法确定是哪种情况。)这对我来说意味着您的启动失败是由固件完全“忘记”其 NVRAM 条目引起的。这可能是由于操作系统中的错误、固件中的错误、用户错误、硬件故障等原因造成的。最好的解决方案是使用创建一个新的 EFI NVRAM 条目efibootmgr
。请参阅efibootmgr
Arch wiki 中的条目有关此主题的更多信息。简而言之,您可以使用如下命令(取自 Arch wiki):
# efibootmgr --create --disk /dev/sda --part 1 --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager"
您需要更改自己系统的磁盘 ID、分区号、文件名和标签。您可以在任何紧急 Linux 系统中输入此命令以 EFI 模式启动;或者如果你能让你的主安装启动(例如,通过使用我的rEFInd 启动管理器在可移动磁盘上),您可以从主安装中输入它。或者,您可以使用 EasyUEFI 创建等效条目。
如果您的系统经常忘记其 NVRAM 条目,最好使用后备文件名;但是,由于您是双启动 Linux 和 Windows,这可能会很尴尬——如果您的固件更喜欢 Windows 引导加载程序条目而不是官方后备文件名,那么让它可靠工作的唯一方法就是“劫持”Windows 引导加载程序,将您的 Linux 引导加载程序或引导管理器放在它的位置,然后从另一个位置启动 Windows 工具。Windows 最终可能会将其自己的引导加载程序重新安装到该位置,让您回到现在的位置。这就是我强烈建议人们将忘记或忽略其 NVRAM 引导条目的有缺陷的计算机退回商店以获得退款的原因之一,只要有可能。不幸的是,这通常是不可能的,因为这个缺陷通常是在购买计算机几个月后才被发现的。
答案2
我找到了问题所在,我在 systemd-boot 菜单中选择了默认的 EFI 加载程序,但由于某种原因,它改变了启动到我的 SSD 时加载的 efi 文件。我按照以下步骤修复了它:
- 在可启动 USB 上启动到 Arch
- 挂载我的 EFI 分区
- 使用 bootctl 查看当前每个启动项
- 这证实了我的想法:我的 SSD 有一个条目被设置为加载我的 Windows EFI 文件
- 启动回可启动 Arch USB 上的菜单
- 选择 UEFI Shell v2
- 使用 bcfg 添加指向我的 systemd-boot efi 文件的新启动项
- (有关如何执行此操作的详细信息,请参见此处:https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface)
- 将新的启动项设置为我的 BIOS 中启动顺序的顶部。
完毕。