修复EFI引导文件

修复win10 EFI系统引导文件

问题描述

一句话描述:拆除“非系统盘”的硬盘后,系统盘内系统无法正常启动。

本计算机包括一个固态硬盘0,一个机械硬盘1,以及机械硬盘2。该固态盘为系统盘,但是其EFI引导文件存储在机械硬盘1中。而机械硬盘1损坏,无法读取文件内容。于是,将机械硬盘拆除,而计算机将无法正常机动。

目标:希望修复EFI系统引导文件,正常启动系统盘中的系统。

方式:在机械硬盘2中开辟一个EFI系统分区,并将正确的引导文件拷贝到其中。

0,一些科普

硬盘分区类型

硬盘分区表有两种类型:

  • GPT(GUID分区表)

    新型分区表类型,需对应UEFI启动,支持快速启动,支持2TB以上硬盘,目前的计算机普遍是该种类型。

  • MBR(Master Boot Record)

    传统分区表类型,需对应Legacy(BIOS)启动,旧机器上比较常见。

可以cmd键入diskmgmt.msc,在磁盘管理中查看硬盘的分区表类型。

BIOS类型

BIOS有两种模式,传统的legacy模式和UEFI模式。

  • 传统BIOS只认识设备,不认识分区、不认识文件。
  • UEFI认识设备,还认识设备ROM,还认识分区表、认识文件系统以及文件。

可以cmd输入msinfo32查看系统摘要获取BIOS类型。

EFI系统分区(ESP)

UEFI模式在GPT分区表的基础上,规定了一个EFI系统分区(EFI System Partition,ESP),ESP要格式化成FAT32。

EFI启动文件要放在\EFI\<厂商>文件夹下面。

  • 比如Windows的UEFI启动文件,都在\EFI\Microsoft下面

  • 比如Ubuntu的UEFI启动文件,都在\EFI\ubuntu下面

    \EFI\Boot文件夹中存放要启动的efi文件,无论是\EFI\Microsoft\Boot\Bootmgfw.efi,还是\EFI\ubuntu\grubx64.efi,只要放到\EFI\Boot下并且改名bootX64.efi,就能在没添加文件启动项的情况下,默认加载对应的系统。
    UEFI固件可从ESP加载EFI启动程式或者EFI应用程序。

UEFI引导原理

引导过程:上电–>UEFI–>GPT分区表–>EFI系统分区(esp)–>\EFI\Microsoft\Boot\bootmgfw.efi–>\EFI\Microsoft\Boot\BCD\Windows\system32\winload.efi

1,制作winPE启动盘

PE是windows预装环境,在电脑无法开机时,可以通过PE系统修复电脑里的各种问题。这里我们选择IT天空的优启通这一PE。

  • 1)下载优启通PE,链接,

  • 2)解压缩,点击EXE,选择U盘模式,选择U盘路径,开始制作启动盘;

    20200622191720-image.png

2,准备EFI引导文件

这里,我从正常的笔记本电脑中,利用DiskGenius工具将EFI引导文件拷贝出来。

但是,我们有个问题,从电脑A中提取出来的EFI引导文件,是否能够直接在电脑B中使用?若都是Windows10系统,是否能够直接使用?
若想启动windows,需要经过UEFI找GPT分区表,找EFI分区,载入bootmgfw.efi文件,载入BCD文件,最后加载winload.efi文件的过程。其中的BCD文件记录着Windows在“某某GUID的分区上”,如果换了一个电脑,windows的GUID位置可能不一样。如果直接使用,那么就可能找不到对应的GUID了,也就会启动失败,出现类似的启动错误:

20200622192407-image.png

3,修改BCD文件

为了获得正确的适用于损伤电脑的BCD文件,我们需要读取该电脑的文件。这里,我们利用之前制作好的U盘启动工具,进入PE小系统。

1)首先是要获得BCD文件所在盘的盘符,如果该盘符已存在则跳过这一步,若不存在,则:

打开cmd,输入diskpart,进如diskpart命令模式

查看硬盘(disk)信息:输入list disk
查看分卷(vol)信息: 输入list vol
找到EFI分区所在的disk和vol,假设为disk 0,vol 2
选择对应的disk和vol: sel disk 0sel vol 2
给EFI分区分配一个唯一的盘符: assign letter=G:
退出diskpart模式:输入exit

2)生成新的BCD文件

回到cmd,cd到BCD所在的目录,比如:
cd /d G:\EFI\Microsoft\Boot\
备份先前的BCD文件
ren BCD BCD.bak
生成新的BCD文件,其中,C盘对应位置为windows安装路径,/s表示目标系统分区的盘符,/f指定目标系统分区的固件类型(UEFI’, ‘BIOS’, or ‘ALL)
bcdboot C:\Windows /s G: /f ALL
于是,我们得到了更新后的引导文件。

4,新建EFI系统分区并拷贝引导文件

在PE系统中,打开DiskGenius,首先在新的硬盘中开辟中一块EPS,而后将前一步得到的引导文件拷贝到该EPS的根目录中。

到这一步为止,我们已经将正确的EFI引导文件考入到指定的ESP中,接下来,我们只需要重启计算机,引入BIOS,修改引导项,即可顺利进入win10~

一些小想法

  • Windows安装盘和EFI启动盘,可以是一个硬盘,也可以是不同的硬盘。UEFI启动模式下,EFI引导文件和windows系统文件可以在不同的分区。这就给后期的拔出硬盘操作带来了”系统崩溃“风险。如果拔出了一个硬盘里刚好有EFI启动文件,那就会导致系统无法正常启动。因此,一个明智的做法是,将引导盘存在一个比较稳定的磁盘里,该磁盘拔出概率小。
  • 我们在安装第一个系统时,需要由系统自动或手动建立一个EFI分区,用来存放启动文件,之后在其它分区安装系统时,会在之前的EFI分区存在对应的启动文件。这也就是为什么在多个磁盘中各装系统,结果引导文件仅存在于某单个盘中。这给我们的提示是,新电脑装备第一个系统时,最好将引导分区建立在某个稳定的磁盘上(SSD),以减少“磁盘损坏,引导文件丢失,而无法进入各个系统”的情况发生。
  • 我发现,在ntfs格式下的分区中,保存EFI引导文件,我的电脑也可以从利用该分区中的引导文件启动系统盘。(不道该方法的适用性如何,也许与主板有关。涉及到主板UEFI固件能够识别ntfs格式的引导文件)。在这种情况下,该分区在windows中是可见并可以编辑的,而FAT32格式的EFI分区不可见。
  • 可以在u盘中建立一个esp分区,引导正常的系统盘启动。
  • 在经常性断电的使用环境下,机械硬盘相对于固态硬盘更容易受损。我们需要留意机械硬盘的状态,减少硬盘损坏带来数据丢失的发现。当硬盘读取声音很大,或者出现拷贝硬盘数据十分缓慢的情况时,我们需要排查硬盘是否故障。磁盘的磁头很可能损坏,如果继续使用,会造成磁道不可逆的伤害。

参考

https://zhuanlan.zhihu.com/p/31365115

https://blog.csdn.net/liao20081228/article/details/82591728

https://neosmart.net/wiki/fix-uefi-boot/#Fix_UEFI_Boot_in_Windows_8_81_or_10