在没有外部介质的情况下重新安装引导加载程序(systemd-boot 或 GRUB)?

在没有外部介质的情况下重新安装引导加载程序(systemd-boot 或 GRUB)?

我最近更新了 Lenovo Miix-700 上的 BIOS,但立即就后悔了。我希望在 Windows 更新后修复网络摄像头的问题,但不出所料,BIOS 更新覆盖了 EFI 分区并且没有修复网络摄像头。我尝试制作一个新的 Arch 可启动 USB,这样我就可以 chroot 并重新安装,但事实证明更新也破坏了单个 USB 端口(集线器故障?)。现在我的整个数字生活都在我无法访问的分区上*。我想在 Arch 论坛上问,但是注册问题要求你能够在 Arch 下运行一行代码,所以我们就来了。有什么建议么?

*从技术上讲,我可以使用 Windows 中的程序访问这些文件,但我无法访问使用这些文件所需的各种程序。

编辑:按照 telcoM 的建议。没有什么与 Arch 相关的。

C:\WINDOWS\system32>bcdedit /enum firmware

Firmware Boot Manager
---------------------
identifier              {fwbootmgr}
displayorder            {bootmgr}
                        {d7ec5199-eb30-11e9-bd4c-806e6f6e6963}
                        {d7ec519a-eb30-11e9-bd4c-806e6f6e6963}
                        {d7ec519b-eb30-11e9-bd4c-806e6f6e6963}
                        {d7ec519c-eb30-11e9-bd4c-806e6f6e6963}
                        {d7ec519d-eb30-11e9-bd4c-806e6f6e6963}
timeout                 0

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
default                 {current}
resumeobject            {86dba24d-a094-11e9-9adb-bd1dd03f5338}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec5196-eb30-11e9-bd4c-806e6f6e6963}
description             Setup

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec5197-eb30-11e9-bd4c-806e6f6e6963}
description             Boot Menu

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec5198-eb30-11e9-bd4c-806e6f6e6963}
description             Diagnostic Splash

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec5199-eb30-11e9-bd4c-806e6f6e6963}
description             ATA HDD: RTHMB128VBM4EWDL

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec519a-eb30-11e9-bd4c-806e6f6e6963}
description             USB FDD:

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec519b-eb30-11e9-bd4c-806e6f6e6963}
description             USB CD:

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec519c-eb30-11e9-bd4c-806e6f6e6963}
description             USB HDD:

Firmware Application (101fffff)
-------------------------------
identifier              {d7ec519d-eb30-11e9-bd4c-806e6f6e6963}
description             PCI LAN:

答案1

看起来 BIOS 更新确实清除了您现有的 EFI NVRAM 引导变量。 Windows 已借助内置固件支持或通过“自我修复”进行了恢复:Windows 将其 UEFI 引导加载程序也放置在\EFI\BOOT\BOOTx64.efiESP 分区上,这是后备 UEFI 引导加载程序,以防没有 NVRAM 引导变量明确标识磁盘的引导加载程序。这允许 Windows 加载,然后如果发现 NVRAM 启动变量丢失,它将自动恢复。

由于原始 UEFI NVRAM 内容已在 BIOS 更新中丢失,因此如果您自定义了系统的安全启动密钥,这些设置也可能已恢复为出厂默认设置。您可能必须暂时禁用安全启动,直到您重新获得对 Arch 的访问权限并可以通过再次遵循原始安全启动密钥自定义过程来恢复这些自定义设置。

对于 Arch 来说,NVRAM 启动变量的恢复很复杂,因为可以通过多种方式设置 Arch UEFI 启动。它可能使用 EFISTUB、GRUB 或 rEFInd。因此,第一步是访问 EFI 系统分区并找出其中的实际内容。


在 Windows 中,您可以通过启动命令提示符来访问 EFI 系统分区作为管理员,然后运行这些命令:

mountvol X: /S
X:
dir

您现在应该看到 EFI 系统分区的根目录列表。如果您想要 GUI 访问,您可以运行start explorer以管理员身份运行标准文件资源管理器窗口。使用该窗口时要非常小心,因为在使用该特定窗口时,您将不会受到标准 UAC 提示的保护。

如果您使用 EFISTUB 来启动 Arch,则EFI 系统分区的根目录中可能有vmlinuz.efivmlinuz-linuz和 initramfs 文件。initramfs-linux.img记下它们的确切路径名。它们也可能位于\EFI\Arch子目录中,具体取决于您最初遵循的安装说明的版本。

如果您使用 GRUB 或 rEFInd 等引导加载程序,它们将位于该目录的子目录中\EFI。进入其中并查看目录列表(使用“文件资源管理器”窗口,或再次cd EFIdir。您应该看到至少两个名为Microsoft和 的目录boot。该Microsoft目录包含 Windows UEFI 引导加载程序,并且该boot目录仅包含启动它的必要部分,以防 NVRAM 引导变量丢失。

对于您的 Arch 安装,可能会有一个子目录\EFI\Arch(如果使用 GRUB),或者\EFI\refind(如果使用 rEFInd)。进入该目录并确认实际引导加载程序文件的名称:它可能是\EFI\Arch\grubx64.efi\EFI\refind\refind_x64.efi

一旦您知道 ESP 上 Arch 引导加载程序的路径名,您就可以为其创建一个 NVRAM 引导变量。在 Windows 中,您可以使用以下命令执行此bcdedit操作:

bcdedit /create /d "Arch Linux" {fwbootmgr}

此命令将输出一个 GUID 字符串,您在任何后续命令中都需要该字符串bcdedit{GUID}为了简洁起见,我将其称为。

bcdedit /set {GUID} device partition=X:
bcdedit /set {GUID} path <your bootloader pathname here>
bcdedit /set {fwbootmgr} default {GUID}

根据您的 Windows 版本,最后一个命令可能会返回错误。在这种情况下,请使用替代形式:

bcdedit /set {fwbootmgr} displayorder {GUID} /addfirst

最后,断开对 ESP 的访问。如果您启动了以管理员身份运行的文件资源管理器窗口,请关闭该窗口,然后在命令提示符中运行以下命令:

c:
mountvol X: /D

如果您可以将系统引导到某种 Linux(以本机 UEFI 风格,以便内核可以使用 UEFI 运行时服务),则可以使用该efibootmgr命令以相当简单的命令重新创建 NVRAM 变量:

efibootmgr --create --disk /dev/sda --loader <your bootloader pathname here> --label "Arch Linux Bootloader" --verbose

如有必要,调整该选项的值--disk以匹配包含 ESP 分区的实际磁盘。

笔记:由于 Linux shell 使用反斜杠作为特殊转义字符,因此您必须将引导加载程序路径名中的 Windows 样式反斜杠转换为 Linux 样式正斜杠,或者在输入 的引导加载程序路径名时将反斜杠加倍efibootmgr,以便您的引导加载程序路径名可能如下所示在efibootmgr命令行上:

efibootmgr [...] --loader \\EFI\\Arch\\grubx64.efi [...]

如果您使用 EFISTUB,则该efibootmgr命令将需要额外的参数来指定 Linux 内核引导参数,包括 initramfs 文件的名称:

efibootmgr --disk /dev/sdX --part Y --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' --verbose

使用 Windowsbcdedit命令指定这些额外参数可能可行,也可能不可能 - 不幸的是我现在找不到它的 Windows 语法。

相关内容