什么是UEFI
Unified Extensible Firmware Interface (UEFI)统一可扩展固件接口,是一种标准的、开放统一和开源的、被烧录在主板ROM内的一套程序,是几乎所有计算机硬件厂商都遵守的一套标准,由于UEFI将硬件初始化后抽象成统一的接口给操作系统,它不关心上层系统是什么,因此硬件厂商不必再为不同的系统提供不同的兼容接口,被广泛应用于现代计算机初始化硬件和提供硬件抽象和启动操作系统,已于近几年取代了我们所熟知的BIOS了,它提供的主板配置更易用更友好,功能更强。如欲了解更多相关知识,请移步知乎老狼的文章https://www.zhihu.com/question/21672895
什么是GPT
Globally Unique Identifier Partition Table(GPT) 又称GUID分区表,是UEFI标准的一部分,用于解决MBR最大磁盘控制容量不能超过2T的问题。其结构图如下
- PMBR 不支持GPT的分区工具试图对硬盘进行操作时(例如MS-DOS和linux的fdisk),可以借助于PMBR以传统方式启动,过程等同于MBR+BIOS,提高了兼容性。当使用支持GPT的系统在检测到PMBR时会直接跳到GPT表头读取分区表
- GPT HDR GPT表头定义了分区表中项目数以及每项大小,硬盘容量信息,磁盘对的GUID,分区表头位置(总是LBA1)和大小,备份分区表头和分区表的位置和大小信息(LBA-1 ~LBA-34)和大小,分区表头和分区表的CRC32校验码,固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否正常,如不正常可使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT校验同样错误,磁盘将不可再用,表头内容见下图
- Partition Table 分区表,包含分区的类型GUID(如:EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}),名称,起始终止位置,该分区的GUID以及分区属性,见下图
- GPT特性
- 得益于LBA提升至64位,以及分区表中每项128位设定,GPT可管理的空间近乎无限大,假设一个扇区大小仍为512字节,可表示扇区数为,算下来,可管理的硬盘容量=18EB(1EB=1024PB=1,048,576TB)
- 分区数量几乎没有限制,由于可在表头中设置分区数量的大小,如果愿意,设置更多分区也可以(有人愿意管理这么多分区吗),不过,目前windows仅支持最大128个分区,
- 磁盘首尾都存有GPT表头,一方损坏可以通过另一份恢复
- 循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率。
- 提供了16字节的GUID标识分区类型,不容易产生冲突
- 分区名字长度位72字节,支持长命名
- 完美支持UEFI,是UEFI规范衍生品
欲了解更多GPT相关知识,请移步知乎老狼文章
https://zhuanlan.zhihu.com/p/26098509
修复EFI/GPT Bootloader
引导损坏的原因
系统引导可能由下列某种原因导致:
- 当安装第二个个系统版本时(双系统配置),windows Bootloader可能在安装过程中被损坏;
- 系统恢复时数据恢异常
- 删除隐藏分区数据
- 恶意软件破坏以及其它原因
The boot configuration data for your PC is missing: EFI\Microsoft\Boot\BCD
如果EFI bootloader 损坏,以UEFI模式安装的windows就会启动失败,尝试启动时会出现蓝屏报错,信息如下:
The boot configuration data for your PC is missing or contains errors.
File :\EFI\Microsoft\Boot\BCD
Error code: 0xc000000f
或
Error code: 0xc000014c
上面的报错信息表明Boot Configuration Data (BCD)文件已经损坏或被意外删除,此时如果尝试使用bcdedit工具修复 UEFI bootloader,将会收到类似如下报错:
The boot configuration data store could not be found.
The requested system device cannot be found.
事实上,windows系统(Windows 10)以UEFI模式安装在GPT 磁盘上时, Windows EFI bootloader (Windows Boot Manager) 把boot manager和 BCD文件存储在隐藏EFI分区中,(一般是一个100MB的FAT32 分区),bcedit的命令不能发现并管理在这个分区上面的配置文件
使用BCDBoot 手动修复EFI Bootloader
- 使用windows安装镜像进入windows修复环境并打开CMD命令行界面(此处请自行百度或者参考https://www.jianshu.com/p/0f8878f6eadb)
- 确定是否当前系统为UEFI模式安装
diskpart
- cmd下运行该命令
list disk
-列出当前计算机已由磁盘信息
如下图,如果GPT列标有*字样则表明当前行磁盘为GPT磁盘,系统安装为UEFI模式
- 修复引导
- diskpart交互命令下,列出当前选中磁盘的卷
select disk 0
- 选择0号磁盘
list volume
- 列出卷
如下图
EFI 引导分区很好区分,他是一个100M大小的FAT32分区,大多数情况下还会拥有System EFI的标签,本例中的Volume 1即是EFI引导分区;通常还有各MSR(**Microsoft System Reserved)分区存在。是NTFS格式,是微软的系统预留分区。
- 为EFI卷分配盘符
select vomume
- 选中EFI卷
assign letter=k:
-为EFI卷分配盘符K
exit
-退出diskpart命令- 尝试修复EFI引导
cd /d K:\efi\microsoft\boot\
- 进入EFI 卷(这个卷是隐藏的)
如果提示目录不存在尝试下面命令
cd /d K:\boot\ 或
cd /d K:\ESD\Windows\EFI\Microsoft\Boot
随后,在其它的修复教程中,可能会提到用下面的命令重写引导记录以及查找已安装系统并添加到BCD(引导数据信息)中
bootrec /fixboot
bootrec /scanos
bootrec /rebuildbcd
更甚者还有如下命令
bootrec /fixmbr
(重GPT磁盘上恢复MBR看起来是不是很奇怪呢?)
以上命令是MBR磁盘所用的,因此不能再当前情景下使用,如果你的电脑是以UEFI模式安装在GPT磁盘上,那么就应该使用
BCDBoot
命令,BCDBoot
命令允许你使用%WINDIR%\System32\Config\BCD-Template
文件从windows系统分区中的system目录恢复引导至EFI引导;如果强制使用Bootrec
命令,将会收到:Access is denied
的报错信息。
使用attrib 命令移除BCD文件的隐藏、只读和系统属性
attrib BCD -s -h -r
重命名旧的BCD配置文件
ren BCD BCD.bak
使用bcdboot.exe工具重从windows 目录复制UEFI引导信息到引导分区中用以重建BCD store
bcdboot C:\Windows /l /en-us /s k: /f ALL
- C:\Windows - windows系统安装目录
- /f /ALL 复制系统引导变量文件,包括UEFI和BIOS,如果只想复制EFI bootloader,可以使用 /f UEFI
- /l en-us 表示使用国家位置代码 en-us - English(USA)
For UK
bcdboot c:\Windows /l en-uk /s K: /f ALL
For DUtch
bcdboot c:\Windows /l nl-NL /s K: /f ALL
For German
bcdboot c:\Windows /l de-DE /s K: /f ALL
For CN
bcdboot c:\Windows /l cn-ZH /s K: /f ALL
- /c 忽略现有的引导信息,并创建一份新的BCD 配置信息
- 开启详细日志模式
使用
bcdedit
查看新建的引导项
可能出现的报错:
- BFSVC Error: Could not open the BCD template store. status – [c000000f] - 查看命令拼写是否正确,尤其是国家代码,如果检查无误,就有可能从\Windows\System32\Config复制的EFI 引导环境文件不完整或已经破坏,使用sfc检查(假设加载的系统安装镜像d:
sfc /scanow /OFFBOOTDIR=C:\ /OFFWINDIR=D:\WINDOWS
- BFSVC Error: Error copying boot files from Last Error = 0x570 - 检查磁盘
CHKDSK K: /F
- BFSVC Error: Failed to set element application device. Status = [c000000bb] - 使用
chkdsk.exe检查EFI引导和windows安装分区
- Failure when initializing library system volume 检查EFI引导分区的文件系统类型是否为FAT32
最后,重启计算机尝试引导进入系统。