如何修复 Windows 8 EFI 引导加载程序?

Elm*_*lmo 129 windows-7 bootloader uefi windows-8

几天前,我在硬盘上以 EFI 模式安装了 Windows 7 和 Windows 8。今天,引导加载程序丢失/损坏。

我目前在闪存驱动器上安装了 Windows 8 安装程序,并尝试使用自动修复选项来修复引导加载程序,但它没有做任何事情。Windows 8 安装程序中也缺少启动修复选项。

如何从命令提示符修复/重新创建 EFI 引导加载程序?

BCDEDIT 返回以下消息:

The requested system device cannot be found.
Run Code Online (Sandbox Code Playgroud)

小智 187

在克隆到新的 SSD 后,我花了很多时间试图让我的 Windows 8 PC 再次启动,并尝试总结我是如何最终让它全部工作的 -

首先,从 UEFI Windows 8 恢复磁盘 (CD/DVD/USB) 启动 - 我发现自动恢复过程没有找到正确的 Windows 分区,而且当我设法将它添加到 BCD 设置时,它会使其可靠地启动例如,使用 BCDEDIT 我让它找到并启动 Windows 分区,但它拒绝冷启动或在第二次重新启动或关闭电源后不会“保留”设置。

进入高级选项并运行命令提示符。

输入diskpart以使用 DiskPart 工具以确保您拥有所有正确的分区并识别您的 EFI 分区 - 这里的关键是您的 EFI 分区格式为 FAT32:

DISKPART> sel disk 0

Disk 0 is now the selected disk.

DISKPART> list vol

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     E                       DVD-ROM         0 B  No Media
  Volume 1     C                NTFS   Partition    195 GB  Healthy    Boot
  Volume 2         WINRE        NTFS   Partition    400 MB  Healthy    Hidden
  Volume 3                      FAT32  Partition    260 MB  Healthy    System
Run Code Online (Sandbox Code Playgroud)

然后为 EFI 分区分配一个驱动器号:

DISKPART> sel vol 3

Volume 3 is the selected volume.

DISKPART> assign letter=b:

DiskPart successfully assigned the drive letter or mount point.
Run Code Online (Sandbox Code Playgroud)

通过输入exit并在命令提示符下运行以下命令来退出 DiskPart 工具:

cd /d b:\EFI\Microsoft\Boot\

bootrec /fixboot
Run Code Online (Sandbox Code Playgroud)

删除或重命名 BCD 文件:

ren BCD BCD.bak
Run Code Online (Sandbox Code Playgroud)

使用bcdboot.exe重新创建BCD存储:

bcdboot c:\Windows /l en-gb /s b: /f ALL
Run Code Online (Sandbox Code Playgroud)

/f ALL参数更新包括 UEFI 固件/NVRAM 在内的 BIOS 设置,/l en-gb用于针对英国/GB 语言环境进行本地化。本地化默认为美国英语,或使用 en-US。

重新启动并交叉手指。

这让我很头疼。我在圈子里转了很长时间。在撰写本文时,关于修复 UEFI/Windows 8 的可靠信息并不多。

[编辑]

要重新启用 Hyper-V,我还必须在重新启动后从 Windows 中的管理员命令提示符运行以下命令:

bcdedit /set {default} hypervisorlaunchtype Auto
bcdedit /set {default} nx OptIn
Run Code Online (Sandbox Code Playgroud)


小智 22

其他答案很有帮助,但这是我必须做的来修复我的。

我有一个装有 Windows 7 的 1.5 TB 硬盘。然后我将 Windows 8 安装到我购买的 150 GB SSD 上。1.5TB硬盘坏了,我能听到它的声音,我的电脑不再启动,说“请插入系统盘”。我认为引导加载程序丢失了,因为它一定在 1.5 TB 磁盘上。事实证明是这样,但问题是我遵循的指南不会重建引导加载程序或它的任何名称,因为我在较小的 150 GB 磁盘上没有 EFI 分区(这可能存在于故障磁盘上),它只有 1 个分区填满了整个磁盘。

我不想丢失所有数据,所以我通过从我的 Windows 8 安装 USB 驱动器启动来输入命令提示符(请注意,如果出现此问题,您无法启动 UEFI 版本,请选择仅从 USB 驱动器启动而没有UEFI 出现在它之前)。

一旦进入命令提示符(有关说明,请参阅其他答案),您需要缩小分区。为此,请输入以下命令,并Enter在每个命令后按:

diskpart

list disk

select disk 0

list partition

select partition 1

shrink desired=200 minimum=200

create partition efi

list partition

select partition 2

format fs=fat32
Run Code Online (Sandbox Code Playgroud)

这些命令将创建 EFI 分区。输入list vol.仔细检查所有内容。您应该会看到一个 200 MB 的分区。您现在需要为其分配一个字母。通过键入assign,然后list vol再次查看已分配的字母来执行此操作。

现在完成了,您需要将引导文件复制到这个新创建的分区:

bcdboot C:\Windows /l en-gb /s B: /f ALL
Run Code Online (Sandbox Code Playgroud)

注意:您必须替换C:为包含 Windows 的分区的驱动器盘符,以及B:分配给您刚刚创建的 EFI 分区的盘符。

我还输入了以下命令:

bootrec /fix

bootrec /fixmbr
Run Code Online (Sandbox Code Playgroud)

这两个人都成功回来了,不知道他们是否真的做了什么,但谁在乎。Windows 现在已完全恢复。

  • bootrec /fix 似乎不是 Windows 8 上的有效命令,但除此之外,这些说明有效并解决了我的所有问题。谢谢! (2认同)

小智 9

好的,我有时间在这里整理一个适当的大纲。它很长,但非常完整,应该可以帮助您了解发生了什么。

首先,这可能发生的一种方式:

  1. 您的 BIOS 会丢失其设置。
  2. 没问题,所有这些东西都存储在 EFI 分区中。
  3. ...出于显而易见的原因,SATA IDE 与 AHCI 设置除外。
  4. 您使用的是 SATA-AHCI 吗?您现在可能正在使用 SATA-IDE。
  5. 在你弄明白之前,你有没有尝试启动?
  6. 如果你这样做了,它就失败了。您是否让 Windows 尝试修复它?
  7. 如果你这样做了,BLAM,它很可能已经破坏了引导配置数据库。
  8. 确保您使用的是上次使用的正确 SATA 设置。


这就是您现在可能已经完成的操作。如果其中任何一项不匹配,请仔细评估这是否确实是您的问题,并阅读本文以获得想法,但不要在没有先思考的情况下遵循它。

  1. 您完全忽略了有关修复主引导记录 (MBR)、分区表、分区标志和其他不适用于 EFI 引导方案的垃圾的所有废话。 在所有。充其量,您将能够完全重建一个新的、不相关的、非 EFI 引导解决方案。然而,这可能不是微不足道的,因为:
  2. 您已经发现 Windows 确定它没有引导配置数据库,但不幸的是,它要么完全不知道它的去向,要么非常确定它的去向——您无法确定是哪个。
  3. 您知道引导存储通常(somewhere)\Boot\BCD是并且文件是隐藏的;使用dir /a:hs.
  4. 您已经熟悉BCDedit.exe并发现它可以让您使用/CreateStore(并且请不要将其命名为“BCD”)在暂存文件中“模拟”启动配置数据库,您可以明确使用暂存文件使用该/Store选项,您可以使用 为 Windows 启动管理器添加菜单项/Create {bootmgr},并且您应该能够使用/Import...
  5. ...但是当你尝试这样做时,你不能。您查看了该/SysStore选项,这听起来不错,但您无法让它使用另一家商店,因为它“模棱两可”。你有一种预感,它知道商店在哪里——或者应该在哪里——但你找不到它。
  6. 您已经尝试使用MountVol挂载 EFI 分区,但它甚至没有显示在列表中,所以您不能。


如果所有这些都非常适合您,那么可能会发生以下情况:

  1. Windows 可以告诉您已设置为 EFI(您已通过 UEFI 引导启动了 DVD,您有一个 EFI 分区等)。
  2. 因此,它知道在哪里查找 BCD 文件——但是,它不知何故位置错误(不是这个问题,但类似)或 BCD 已被删除。
  3. 显然,因为它知道它应该在哪里,所以这会中断/SysStore——实际上,这可能是正确的行为,否则你会把它放在错误的地方。
  4. 据我所知,MountVol故意隐藏 EFI 分区(或不知何故无法注意到它)。这会阻止挂载文件系统,从而阻止找到正确的子目录、验证数据库是否存在等。


所以,最后,这就是你需要做的事情。好消息是它可能比您现在希望的要简单得多。

  1. 您确实必须挂载 EFI 分区。

    实际上,我有一个不完全正确的预感——我强烈怀疑 EFI 分区已经被某个内部子系统挂载了,这就是为什么BCDedit变得古怪——它没有看到数据库,但它知道它应该去哪里。但是,它没有的任何东西都是驱动器号。那么该怎么办?

    嗯...你的 DOS 根可以追溯到多远?你还记得Assign命令吗?你猜怎么着。
  2. 开始DiskPart
  3. 如果您不熟悉DiskPart,它的基本工作方式是集合的层次结构;您必须在一个级别中选择一个元素才能继续下一个级别。所以,,List Disk然后Select Disk n哪里n适合你。
  4. 使用List PartitionList Volume(注意非复数)来获得一些见解并识别您的 EFI 分区。

    它通常是一个 100MB 的 FAT32 分区标记System。请记住,您的磁盘现在应该使用 GPT 分区表,因此您可能会看到很多分区。其中一些用于紧急恢复——它们对 EFI 问题大有裨益,嗯?那好吧。

    请注意,EFI 分区和其他一些分区没有驱动器号。如果您愿意,还可以查看 GPT 分区属性,这也可能会给您一些切线相关的“啊哈”时刻。
  5. Select Partition n其中 n 是 EFI 分区。(我希望您可以根据需要选择音量。)
  6. Assign. 就是这样。不要指定驱动器号;只是Assign
  7. List Volume. 您现在应该看到分配给 EFI 分区的驱动器号。
  8. Exit磁盘部分。

    现在......一个很大的警告。您可能会直接转到 S:(或您从 中获得的任何内容Assign)并注意到一个 Boot 分区。“啊哈!” 你会说。“这里没有BCD文件!” 首先...记住该文件是隐藏的。其次...再深入研究一下,您会注意到虽然存在S:\EFI\Boot并且S:\EFI\Microsoft\Boot

    您还需要检查这两个问题是否存在问题。 S:\EFI\Boot用于主板,并包含 Windows 引导加载程序(以及其他操作系统的其他内容)。之所以有这个名字,是因为主板不知道您是否要安装 Windows,并且需要一个有意义的固定路径。
  9. 检查S:\EFI\Boot。对于 64 位 Windows 7 Professional,您应该看到:bootx64.efi
    如果您安装了 EFI shell(总是一个好主意),您可能还会看到shellx64.efi.

    注意:使用双引导 Linux 用户chainloader+1将不会在此处看到额外的条目。
  10. 检查S:\EFI\Microsoft\Boot使用 dirdir a:h。对于 64 位 Windows 7 Professional,您应该会看到一堆语言模板(en_US等)和以下文件:
    bootmgr.efi
    bootmgfw.efi
    memtest.efi
    BCD
    BCD.Backup.001
    BCD.Backup.002
    
    Run Code Online (Sandbox Code Playgroud) ...除了你可能没有看到BCD,是吗?但那些备份文件确实看起来很诱人。
  11. 确定要使用的备份文件。无论它缺少什么最近的更改,都远不及您启动系统的能力那么重要,因此请选择最完整的更改。可能你会看到一个大的和一个相当小的。小的已经损坏了,是修复过程失败的产物——不要使用它。如果它们都很大,请使用旧的。在任何情况下,使额外的备份副本备份的其他地方。
  12. 将您决定使用的备份复制到BCD.
  13. 退出外壳,干净地关闭,然后重新启动。
  14. 告诉 Windows 正常启动。此时,它应该开始。


问:如果您没有备份 BCD 怎么办?

A:嗯,那真的不应该发生。这可能意味着您要么位于错误的目录中,支持 EFI 但实际上并未使用它,要么以某种方式在没有所有必需的 Windows 材料的情况下重建整个 EFI 分区(可能,尤其是在使用多个版本的 Windows 时)。在这种情况下,您需要从 DVD 复制 EFI 材料,然后使用BCDedit.


问:您能否举一个BCDedit /SysStore可用于在 EFI 系统上执行任何操作的场景示例?

答:到目前为止,没有。

无论如何,希望这有助于解决人们的一些问题,或者至少让他们思考。最后一点非常重要,请注意,您可以使用上面的:技术在 Windows 下正常挂载和检查 EFI 分区。在遇到此类麻烦之前,您应该至少执行一次此操作,以获得 EFI 分区的完整备份。我建议一份备份到您驱动器上的子目录中,另一份备份到USB 闪存驱动器上。DiskPartAssignC:

抱歉,啰嗦了这么多。我需要在某个时候把它变成一篇合适的文章,但是有太多人感到非常沮丧,我觉得有必要尽可能完整和迅速地记录我的经历。


har*_*ymc 5

Windows 8 还没有最终版本,所以问题是可以预料的。对于我们大多数人来说,您处于一个新领域,我们过去使用的命令可能不再适用。对于@soandos 列出的命令,我添加了一个完全重建 BCD 的命令:

bootrec /rebuildbcd
Run Code Online (Sandbox Code Playgroud)

还尝试使用 Windows 8 的高级启动菜单,让我们知道会发生什么。

如果没有任何效果,文章在启动失败时修复 Windows 7有一些关于使用bcdedit 的建议纠正启动错误的建议。无论如何,看看您的计算机上 bcdedit 的输出是什么会很有趣。

[编辑]

这些链接可能包含一些有用的想法:

从 DVD 恢复 Windows 引导加载程序
Windows 7 引导管理器恢复问题
Windows 7 突然无法引导 – 修复 Windows 7 引导加载程序