几天前,我在硬盘上以 EFI 模式安装了 Windows 7 和 Windows 8。今天,引导加载程序丢失/损坏了。
我目前在闪存驱动器上安装了 Windows 8 安装程序,并尝试使用“自动修复”选项修复引导加载程序,但没有任何效果。Windows 8 安装程序中也缺少“启动修复”选项。
如何从命令提示符修复/重新创建 EFI 引导加载程序?
BCDEDIT
返回以下消息:
The requested system device cannot be found.
答案1
我花了很多时间尝试在克隆到新的 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
然后为 EFI 分区分配一个驱动器号:
DISKPART> sel vol 3
Volume 3 is the selected volume.
DISKPART> assign letter=b:
DiskPart successfully assigned the drive letter or mount point.
exit
通过输入并在命令提示符下运行以下命令退出 DiskPart 工具:
cd /d b:\EFI\Microsoft\Boot\
bootrec /fixboot
删除或者重命名BCD文件:
ren BCD BCD.bak
用于bcdboot.exe
重新创建 BCD 存储:
bcdboot c:\Windows /l en-gb /s b: /f ALL
该/f ALL
参数更新 BIOS 设置(包括 UEFI 固件/NVRAM),/l en-gb
用于针对 UK/GB 语言环境进行本地化。本地化默认为美国英语,或使用 en-US。
重新启动并祈祷。
这让我很头疼。我陷入了很长一段时间的困境。在撰写本文时,没有太多关于修复 UEFI/Windows 8 的可靠信息。
[编辑]
要重新启用 Hyper-V,我还必须在重新启动后从 Windows 中的管理员命令提示符运行以下命令:
bcdedit /set {default} hypervisorlaunchtype Auto
bcdedit /set {default} nx OptIn
答案2
其他答案也很有帮助,但这是我必须做的事情来解决我的问题。
我有一块 1.5 TB 的硬盘,上面安装了 Windows 7。然后我将 Windows 8 安装在我买的 150 GB SSD 上。1.5 TB 的硬盘坏了,我听到它发出噪音,我的电脑无法启动,提示“请插入系统盘”。我以为是引导加载程序丢失了,因为它一定在 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
这些命令将创建 EFI 分区。输入 仔细检查所有内容list vol
。您应该会看到一个 200 MB 的分区。现在您需要为其分配一个字母。输入assign
,然后list vol
再次输入 ,查看已分配的字母。
现在完成了,您需要将启动文件复制到这个新创建的分区:
bcdboot C:\Windows /l en-gb /s B: /f ALL
笔记:您必须将其替换C:
为包含 Windows 的分区的驱动器号,以及B:
分配给您刚刚创建的 EFI 分区的字母。
我还输入了以下命令:
bootrec /fix
bootrec /fixmbr
这两个都成功恢复了,不知道它们是否真的做了什么,但谁在乎呢。Windows 现已完全恢复。
答案3
好的,我终于有时间整理一下大纲了。大纲很长,但很完整,应该能帮你了解情况。
首先,发生这种情况的一种方式是:
- 您的 BIOS 丢失其设置。
- 没问题,所有这些东西都存储在 EFI 分区中。
- ...除了 SATA IDE 与 AHCI 设置,原因很明显。
- 您使用的是 SATA-AHCI 吗?您现在可能正在使用 SATA-IDE。
- 在弄清楚这一点之前,您是否尝试过启动?
- 如果这样做,则失败。您是否让 Windows 尝试修复它?
- 如果你这样做了,砰,它很可能已经破坏了启动配置数据库。
- 确保您使用的是上次使用的正确 SATA 设置。
以下是您现在可能已经完成的操作。如果其中任何一项不匹配,请仔细评估这是否确实是您的问题,并阅读本文以获取想法,但不要不加思索地遵循它。
- 希望您忽略所有有关修复主引导记录 (MBR)、分区表、分区标志以及其他不适用于 EFI 启动场景的垃圾的废话。 完全最好的情况是,你可以完全重建一个新的,无关,非 EFI 启动解决方案。然而,这可能并不简单,因为:
- 您已经发现 Windows 确信它没有启动配置数据库,但不幸的是,它要么完全不知道它去了哪里,要么非常确定它去了哪里 - 您无法完全分辨是哪一种。
- 您知道引导存储处于正常状态
(somewhere)\Boot\BCD
并且文件是隐藏的;请使用 查看它dir /a:hs
。 - 您已经熟悉了一点,
BCDedit.exe
并且发现它将允许您使用/CreateStore
(请不要将其命名为“BCD”)在暂存文件中“模拟”启动配置数据库,您可以使用选项明确使用暂存文件/Store
,您可以使用为 Windows 启动管理器添加菜单项/Create {bootmgr}
,并且您应该能够使用/Import
...导入它。 - ...但是当您尝试这样做时,您却做不到。您查看了选项
/SysStore
,这听起来是对的,但是您无法让它使用另一家商店,因为它“不明确”。您有预感它知道商店在哪里——或者应该在哪里——但是您找不到它。 - 您已尝试使用它
MountVol
来挂载 EFI 分区,但它甚至没有显示在列表中,所以您无法做到。
如果以上所有情况都与您非常相似,则可能发生以下情况:
- Windows 可以告诉您已设置 EFI(您已通过 UEFI 启动启动了 DVD,您有一个 EFI 分区等)。
- 因此,它知道在哪里查找 BCD 文件——但是,要么是位置错误(不是这个问题,但类似),要么是 BCD 已被删除。
- 显然,因为它知道它应该在哪里,所以这会中断
/SysStore
——实际上,这可能是正确的行为,因为否则你会把它放在错误的地方。 - 据我所知,
MountVol
故意隐藏 EFI 分区(或无法注意到它)。这会阻止挂载文件系统,从而阻止找到正确的子目录、验证数据库是否存在等。
所以,最后,这就是你需要做的事情。好消息是,这可能比你现在希望的要简单得多。
- 你确实需要挂载 EFI 分区。
实际上,我有一种预感,这不是严格正确——我强烈怀疑 EFI 分区是已经由某个内部子系统挂载,这就是为什么BCDedit
它会变得很古怪——它看不到数据库,但它知道它应该去哪里。然而,它没有驱动器号。那么——该怎么办?
嗯……你的 DOS 根目录可以追溯到多远?你还记得命令吗Assign
?猜猜是什么。 - 开始
DiskPart
。 - 如果您不熟悉
DiskPart
,它的基本工作原理是集合的层次结构;您必须在一个级别上选择一个元素才能继续下一个级别。因此,List Disk
,然后是适合您的任何值Select Disk n
。n
- 使用
List Partition
和List Volume
(注意不是复数)来获取一些见解并识别您的 EFI 分区。
它通常是一个标记为 的 100MB FAT32 分区System
。请记住,您的磁盘现在应该使用 GPT 分区表,因此您可能会看到相当多的分区。其中一些用于紧急恢复 - 它们对 EFI 问题没什么用,是吗?哦,算了。
请注意,EFI 分区和其他几个分区没有驱动器号。如果您愿意,您还可以查看 GPT 分区属性,这也可能给您带来一些切线相关的“啊哈”时刻。 Select Partition n
其中 n 是 EFI 分区。(我希望您可以在需要时选择卷。)Assign
。就是这样。不要指定驱动器号;只需Assign
。List Volume
。您现在应该看到分配给 EFI 分区的驱动器号。Exit
DiskPart。
现在...一个很大的警告。您可能会直接转到 S:(或从 获得的任何内容Assign
)并注意到 Boot 分区。“啊哈!”您会说。“这里没有BCD
文件!”首先...请记住该文件是隐藏的。其次...再挖掘一下,您会注意到虽然有S:\EFI\Boot
并且S:\EFI\Microsoft\Boot
您还需要检查这两个问题。S:\EFI\Boot
是母板,并包含 Windows 启动加载器(也可能是其他操作系统的其他内容)。之所以有这个名字,是因为主板不知道您是否要安装 Windows,并且需要一个有意义的固定路径。- 检查
S:\EFI\Boot
。对于 64 位 Windows 7 Professional,您应该会看到:bootx64.efi
如果您已经安装了 EFI shell(这始终是个好主意),您可能还会看到shellx64.efi
。
注意:使用双启动 Linux 的用户chainloader+1
将不会在此处看到额外的条目。 - 检查
S:\EFI\Microsoft\Boot
使用两个都dir
和dir a:h
。对于 64 位 Windows 7 Professional,您应该会看到一堆语言模板(en_US
等)和以下文件:
...除了你可能没看到bootmgr.efi bootmgfw.efi memtest.efi BCD BCD.Backup.001 BCD.Backup.002
BCD
,对吧?但这些备份文件看起来确实很诱人。 - 确定要使用哪个备份文件。无论它缺少什么最近的更改,都远不如您启动系统的能力重要,因此请选择最完整的文件。您可能会看到一个大文件和一个相当小的文件。小文件已经损坏,是修复过程失败的产物——不要使用它。如果它们都很大,请使用较旧的那个。无论如何,请制作额外的备份副本备份别的地方。
- 将您决定使用的备份复制到
BCD
。 - 退出 shell,干净关闭,然后重新启动。
- 告诉 Windows 正常启动。此时,它应该可以启动。
问:如果您没有备用 BCD 怎么办?
A: 嗯,那真的不应该发生这种情况。这可能意味着您处于错误的目录中,支持 EFI 但实际上并未使用它,或者以某种方式重建了整个 EFI 分区而没有所有必需的 Windows 材料(可能,尤其是在使用多个版本的 Windows 时)。在这种情况下,您需要从 DVD 复制 EFI 材料,然后使用 修改或重建引导配置数据库BCDedit
。
BCDedit /SysStore
问:您能给我举一个可以在 EFI 系统上做任何事情 的场景的例子吗?
答:到目前为止还没有。
无论如何,希望这能帮助人们解决一些问题,或者至少让他们思考。作为最后一点,请注意,您可以挂载和检查您的 EFI 分区在 Windows 下通常使用上面的DiskPart
:Assign
技术。你应该至少执行一次,以获得 EFI 分区的完整备份,前你会遇到这种麻烦。我建议将一份备份放在C:
驱动器上的子目录中,另一份备份放在 USB 闪存驱动器上。
抱歉说了这么多。我需要在某个时候把这个变成一篇正式的文章,但是有太多人非常沮丧,所以我觉得有必要尽可能完整、快速地记录我的经历。
答案4
最简单的方法:
按照上面帖子中的步骤找到 BCD 文件并转到其目录。
如果 BCD 文件是隐藏的,请键入
attrib bcd -s -h -r
并按Enter。这将允许您修改和覆盖该文件。输入
ren bcd bcd.old
并按下Enter。这将重命名当前的 BCD 文件。键入
Bootrec /RebuildBCD
并按下Enter以强制 Windows 8 从头开始重建启动菜单。退出命令提示符并关闭。删除 Windows 恢复介质并重新启动。您已完成!