标签归档:GPT

移除 BCD 与 NVRAM 中重复的固件对象

在有些使用统一可扩展固件接口 (UEFI) 的计算机上,固件会在计算机开机时为本机装置 (如 CD-ROM 或硬盘) 建立静态随机存取内存 (NVRAM) 项目。Bcdedit 会同步处理 NVRAM 中的固件命名空间对象与系统开机设定数据 (BCD)。Bcdedit 会在您执行 bcdedit /set 或 /enum 命令时,开启系统 BCD 存放区。bcdedit 开启 BCD 时,会比较 NVRAM 中的项目与 BCD 中的项目。固件在 NVRAM 中建立的项目若未存在于 BCD 中,即会新增至系统 BCD。当 bcdedit 关闭系统 BCD 时,BCD 中任何不在 NVRAM 内的开机管理程序项目皆会新增至 NVRAM 中。bcdedit
/import 命令会将系统 BCD 中的所有固件命名空间对象复制到 NVRAM 中。

若您执行多项 bcdedit /import 操作,NVRAM 即可能包含系统上之装置 (如 CD ROM 与硬盘) 的多个项目。多项 /import 操作可能会导致许多重复项目。下列命令可用以列举 BCD 中的固件命名空间对象:

Bcdedit /enum firmware

下列范例类似于 bcdedit /enum 固件命令所产生的输出:

固件开机管理程序

---------------------

identifier              {fwbootmgr}

displayorder            {bootmgr}

{93cee840-f524-11db-af62-aa767141e6b3}

{93cee841-f524-11db-af62-aa767141e6b3}

{93cee842-f524-11db-af62-aa767141e6b3}

{93cee844-f524-11db-af62-aa767141e6b3}

{93cee843-f524-11db-af62-aa767141e6b3}

timeout                 2

 

Windows 开机管理程序

--------------------

identifier              {bootmgr}

device 
                partition=\Device\HarddiskVolume1

path                   
\EFI\Microsoft\Boot\bootmgfw.efi

description             Windows Boot Manager

locale                  en-US

inherit                 {globalsettings}

default                 {current}

displayorder            {current}

toolsdisplayorder       {memdiag}

timeout                 30

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee840-f524-11db-af62-aa767141e6b3}

description             Primary Master CDROM

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee841-f524-11db-af62-aa767141e6b3}

description             Harddisk 4

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee842-f524-11db-af62-aa767141e6b3}

description             Internal EFI Shell

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee843-f524-11db-af62-aa767141e6b3}

description             Floppy

 

固件应用程序 (101fffff)

-------------------------------

identifier 
            {93cee844-f524-11db-af62-aa767141e6b3}

description             Acpi(PNP0A03,0)/Pci(1F|1)/Ata(Primary,Master)/CDROM(Entry1)

若您重复使用 bcdedit /import,NVRAM 与系统 BCD 中即可能会有多个固件对象。若您将主计算机中的 BCD 存放区汇入到目标计算机,则相同的装置可能会有多个固件项目。若有多个固件项目存在,您所看见的 bcdedit /enum 固件输出将包含类似下列范例所示的固件项目:

固件开机管理程序

---------------------

identifier              {fwbootmgr}

displayorder            {bootmgr}

{93cee840-f524-11db-af62-aa767141e6b3}

{93cee841-f524-11db-af62-aa767141e6b3}

{93cee842-f524-11db-af62-aa767141e6b3}

{93cee844-f524-11db-af62-aa767141e6b3}

{93cee843-f524-11db-af62-aa767141e6b3}

{8b87c5a0-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a1-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a2-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a3-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a4-f2f2-11db-9717-f87ee6ea6002}

timeout                 2

每个装置可能会有两个或更多具有不同 GUID 的项目。例如,主服务器 CDROM 可能包含多个项目:

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee840-f524-11db-af62-aa767141e6b3}

description             Primary Master CDROM

 

固件应用程序 (101fffff)

-------------------------------

identifier              {8b87c5a0-f2f2-11db-9717-f87ee6ea6002}

description             Primary Master CDROM

您可以使用多个 Bcdedit 命令,将 NVRAM 与 BCD 系统存放区中的多个或重复项目移除。若要对您想要移除的多个对象项目使用正确的对象 GUID,则可能必须手动建立命令脚本。

移除重复项目

1.      
使用下列 Bcdedit 命令为目前的系统存放区储存复本。

Bcdedit /export savebcd

您也可以于日后使用此档案进行复原。

2.      
复制要用于 Bcdedit 删除操作的 SaveBCD 档案。

Copy savebcd newbcd

3.      
列举系统 BCD 存放区中的固件命名空间对象,并将输出结果储存到文本文件中:

Bcdedit /enum firmware > enumfw.txt

4.      
使用 Notepad.exe 开启 Enumfw.txt,检视要删除之重复 GUID 项目的列表。检视计算机上的 GUID 项目列表。

5.      
使用 [记事本] 建立新的命令档案。将档案储存为 RemoveDups.cmd。

6.      
在 RemoveDups.cmd 档案中新增命令行,以删除依照 [固件开机管理程序] 显示顺序列出的重复固件 GUID:

Bcdedit /store newbcd /delete
{93cee840-f524-11db-af62-aa767141e6b3}

对每个要移除的 GUID 重复此命令。就上面的范例而言,在 RemoveDups.cmd 中加入下列命令:

Bcdedit /store newbcd /delete
{93cee841-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{93cee842-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{93cee843-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{93cee844-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{8b87c5a1-f2f2-11db-9717-f87ee6ea6002}

Bcdedit /store newbcd /delete {8b87c5a2-f2f2-11db-9717-f87ee6ea6002}

Bcdedit /store newbcd /delete
{8b87c5a3-f2f2-11db-9717-f87ee6ea6002}

Bcdedit /store newbcd /delete
{8b87c5a4-f2f2-11db-9717-f87ee6ea6002}

在 EFI 固件已初始化其本机装置之 NVRAM 项目标计算机上,您即可在必要时删除所有 GUID 项目。请不要删除 {bootmgr} 的项目

7.      
使用 /clean 选项在汇入操作的过程中移除所有 NVRAM 项目,并将最终命令新增至 RemoveDups.cmd,以汇入新的 BCD 档案:

Bcdedit /import newbcd /clean

8.      
储存档案,并于命令提示字符中执行 RemoveDups.cmd,即可移除 newbcd 存放区中所有的重复项目,并将 newbcd 存放区汇入系统 BCD 中。

9.      
重新开启系统。在重新启动期间,EFI 固件会重新初始化固件对象 GUID 对应于系统连接装置的 NVRAM。使用 bcdedit /enum 固件命令,确认所有重复的固件项目均已移除。

 

UEFI系统安装U盘的制作方式

使用Windows7 USB download Tool利用Windows7 Ultimate x64 SP1的iso制作了启动用的U盘, 并删除source/ei.cfg文件, 这样安装的时候就会询问需要安装的系统版本了.
但是这样做完的U盘不支持EFI启动, 无法安装在GPT分区上. 所以需要处理一下.
首先, 把U盘上的所有文件复制出来, 放到硬盘上.
然后格式化U盘, 选FAT32.
之后把文件全部复制回去.
然后使用7z或者好压, 打开U盘\sources\install.wim文件, 注意不要修改此文件! 打開压缩文件中的 \1\Windows\Boot\EFI\ 这个目录, 找到bootmgfw.efi, 复制出来, 并重命名为bootx64.efi.
之后在U盘里找到\efi\Microsoft这个目录, 把boot文件夹复制到上一级目录去, 也就是\efi\boot, 并把bootx64.efi也放进这个boot文件夹.
完成了, 现在这个U盘就可以被主板认为是UEFI启动设备了. 
安装过程中系统会自动创建MSR-GPT保护分区, 这就没问题了. 

Linux下大于2TB设备分区工具 -- parted介绍

随着单块硬盘容量的增大和硬盘价格的下降,2TB的磁盘使用将很快会普及,由于传统的MBR方式存储分区表的方 式缺陷,将可能导致很多分区工具不能正确地读取大于2TB容量的硬盘而无法正常分区大容量硬盘。其实linux在很早就已经有相关的工具来化解这个困境 了,那就是parted。
parted是类似fdisk的命令行分区软件,假设我们在linux系统中有一块未分区的硬盘挂载为/dev/hdd,下面以实例的方式来讲解如何使用 parted:
注意:parted的操作都是实时的,也就是说你执行了一个分区的命令,他就实实在在地分区了,而不是像fdisk那样,需要执行w命令写入所做的修改, 所以进行parted的测试千万注意不能在生产环境中!!
标记:#开始表示在shell的root下输入的命令,(parted)表示在parted中输入的命令,其他为自动打印的信息

1、首先类似fdisk一样,先选择要分区的硬盘,此处为/dev/hdd:
# parted /dev/hdd
GNU Parted 1.8.1
Using /dev/hdd
Welcome to GNU Parted! Type 'help' to view a list of commands.

2、现在我们已经选择了/dev/hdd作为我们操作的磁盘,接下来需要创建一个分区表(在parted中可以 使用help命令打印帮助信息):
(parted) mklabel
Warning: The existing disk label on /dev/hdd will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No?(警告用户磁盘上的数据将会被销毁,询问是否继续,我们这里是新的磁盘,输入yes后回车) yes
New disk label type? [msdos]? (默认为msdos形式的分区,我们要正确分区大于2TB的磁盘,应该使用gpt方式的分区表,输入gpt后回车)gpt

3、创建好分区表以后,接下来就可以进行分区操作了,执行mkpart命令,分别输入分区名称,文件系统和分区 的起止位置
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB

4、分好区后可以使用print命令打印分区信息,下面是一个print的样例
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1

5、如果分区错了,可以使用rm命令删除分区,比如我们要删除上面的分区,然后打印删除后的结果
(parted)rm 1 #rm后面使用分区的号码
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags

6、按照上面的方法把整个硬盘都分好区,下面是一个分完后的样例
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB
(parted) mkpart
Partition name? []? dp2
File system type? [ext2]? ext3
Start? 500GB
End? 2199GB
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1
2 500GB 2199GB 1699GB dp2

7、由于parted内建的mkfs还不够完善,所以完成以后我们可以使用quit命令退出parted并使用 系统的mkfs命令对分区进行格式化了,此时如果使用fdisk -l命令打印分区表会出现警告信息,这是正常的
#fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/hdd'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/hdd: 2199.0 GB, 2199022206976 bytes
255 heads, 63 sectors/track, 267349 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 267350 2147482623+ ee EFI GPT #mkfs.ext3 /dev/hdd1
#mkfs.ext3 /dev/hdd2
#mkdir /dp1 /dp2
#mount /dev/hdd1 /dp1
#mount /dev/hdd2 /dp2

如何配置UEFI/GPT-基于硬盘分区

磁盘分区规则
当您将 Windows ® 部署到UEFI-基于计算机,您必须设置格式硬磁盘驱动器或其他持久性存储设备,包括 Windows 分区使用 GUID 分区表 (GPT) 文件系统。 额外的驱动器可能使用GPT或主启动记录 (MBR) 文件格式。

GPT-基于的驱动器可能包括下列分区:

        系统分区

        每个可引导驱动器必须包含一个系统分区。 在可扩展固件接口 (EFI) 和UEFI系统上,这也称为是 EFI 系统分区或在 ESP。 计算机启动时,此分区。

        先进的格式生成一个 (4-KB-每个扇区) 驱动器,此分区的最小大小为 260 MB。 对于较早的每个扇区 512 字节驱动器,此分区的最小大小为 100 MB。

        Microsoft ® 保留分区 (MSR)

        我们建议您将 MSR 添加到每个驱动器的磁盘管理。 MSR 是一个保留的分区,不会收到一个分区 id。 它不能存储用户数据。

        MSR 的大小为 128 MB。

        多达 128 个主分区

        您可以使用主分区存储文件和实用程序。

        每个可引导驱动器必须包含操作系统如 Windows。

        每个分区可以有 18 eb (~18.8 万 tb) 的空间最多。

 

分区配置
本部分介绍了默认分区配置和建议的分区配置。

默认配置: Windows RE工具、 系统、 MSR,和 Windows 分区
默认配置包含 Windows 恢复环境 (Windows RE) 工具分区、 系统分区、 MSR 和 Windows 的分区。 下面的关系图显示了此配置。

点击查看原图

通过使用此配置,您可以添加自定义 Windows 安装的系统工具如 Windows ® BitLocker ® 驱动器加密和 Windows RE。

建议配置: Windows RE工具、 系统、 MSR、 窗口和恢复镜像分区
建议的配置包括 Windows RE 工具分区,系统分区、 MSR、 Windows 的分区和恢复镜像分区。 下面的关系图显示了此配置。

点击查看原图 

 
添加 Windows 分区之前添加Windows RE工具分区和系统分区。 添加包含结束时恢复镜像的分区。 此分区顺序有助于保持系统和Windows RE工具分区安全期间操作,如删除恢复镜像分区或更改 Windows 分区的大小。

系统和实用程序分区
默认情况下,系统分区不会出现在 Windows 资源管理器中。 这有助于保护最终用户免受意外修改分区。

您可以帮助保护最终用户免受意外修改其他分区相同的方式,通过识别它们作为实用程序分区。

要设置为实用程序分区的分区
        当您正在部署 Windows 使用Windows Setup时,请使用应答文件来配置您的分区。 实用程序分区中,请将微软-Windows-Setup\DiskConfiguration\Disk\ModifyPartition\TypeID 值设置为de94bba4-06d1-4d40-a16a-bfd50179d6ac。

        当您正在部署 Windows 使用DiskPart工具时,使用集的 id = de94bba4-06d14d40-a16a-bfd50179d6ac命令后您创建分区。

要验证系统和实用程序分区存在
        1.单击开始,右键单击计算机,然后单击管理。 打开计算机管理窗口。

        2.单击磁盘管理。 将显示可用的磁盘和分区的列表。

        3.在磁盘和分区列表中,请确认系统和实用程序分区存在和未分配驱动器号。

GPT磁盘介绍

全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个物理硬盘的分区结构。它是可扩展固件接口标准的一部分,用来替代BIOS中的主引导记录分区表。但因为MBR分区表不支持容量大于2TB的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表。GPT分区表支持最多128PB的硬盘和分区。

 

EFI介绍:

 

了解GUID分区表之前我们先要了解一下什么是EFI(Extensible Firmware Interface 可扩展固件接口)

 

含义EFI的产生

 

BIOS技术的兴起源于IBM PC/AT机器的流行以及第一台由康柏公司研制生产的“克隆”PC。在PC启动的过程中,BIOS担负着初始化硬件,检测硬件功能,以及引导操作系统的责任,在早期,BIOS还提供一套运行时的服务程序给操作系统及应用程序使用。BIOS程序存放于一个掉电后内容不会丢失的只读存储器中,系统加电时处理器的第一条指令的地址会被定位到BIOS的存储器中,便于使初始化程序得到执行。

 

众所周知,英特尔在近二十年来引领以x86系列处理器为基础的PC技术潮流,它的产品如CPU,芯片组等在PC生产线中占据绝对领导的位置。因此,不少人认为这一举动显示了英特尔公司欲染指固件产品市场的野心。事实上,EFI技术源于英特尔安腾处理器(Itanium)平台的推出。安腾处理器是英特尔瞄准服务器高端市场投入近十年研发力量设计产生的与x86系列完全不同的64位新架构。在x86系列处理器进入32位的时代,由于兼容性的原因,新的处理器(i80386)保留了16位的运行方式(实模式),此后多次处理器的升级换代都保留了这种运行方式。甚至在含64位扩展技术的至强系列处理器中,处理器加电启动时仍然会切换到16位的实模式下运行。英特尔将这种情况归咎于BIOS技术的发展缓慢。自从PC兼容机厂商通过净室的方式复制出第一套BIOS源程序,BIOS就以16位汇编代码,寄存器参数调用方式,静态链接,以及1MB以下内存固定编址的形式存在了十几年。虽然由于各大BIOS厂商近年来的努力,有许多新元素添加到产品中,如PnP BIOSACPI,传统USB设备支持等等,但BIOS的根本性质没有得到任何改变。这迫使英特尔在开发更新的处理器时,都必须考虑加进使效能大大降低的兼容模式。有人曾打了一个比喻:这就像保时捷新一代的全自动档跑车被人生套上去一个蹩脚的挂档器。

 

然而,安腾处理器并没有这样的顾虑,它是一个新生的处理器架构,系统固件和操作系统之间的接口都可以完全重新定义。并且这一次,英特尔将其定义为一个可扩展的,标准化的固件接口规范,不同于传统BIOS的固定的,缺乏文档的,完全基于经验和晦涩约定的一个事实标准。基于EFI的第一套系统产品的出现至今已经有五年的时间,如今,英特尔试图将成功运用在高端服务器上的技术推广到市场占有率更有优势的PC产品线中,并承诺在2006年间会投入全力的技术支持。

 

比较EFIBIOS

 

一个显著的区别就是EFI是用模块化,C语言风格的参数堆栈传递方式,动态链接的形式构建的系统,较BIOS而言更易于实现,容错和纠错特性更强,缩短了系统研发的时间。它运行于32位或64位模式,乃至未来增强的处理器模式下,突破传统16位代码的寻址能力,达到处理器的最大寻址。它利用加载EFI驱动的形式,识别及操作硬件,不同于BIOS利用挂载实模式中断的方式增加硬件功能。后者必须将一段类似于驱动的16位代码,放置在固定的0x000C00000x000DFFFF之间存储区中,运行这段代码的初始化部分,它将挂载实模式下约定的中断向量向其他程序提供服务。例如,VGA图形及文本输出中断(INT 10h),磁盘存取中断服务(INT 13h)等等。由于这段存储空间有限(128KB)BIOS对于所需放置的驱动代码大小超过空间大小的情况无能为力。另外,BIOS的硬件服务程序都已16位代码的形式存在,这就给运行于增强模式的操作系统访问其服务造成了困难。因此BIOS提供的服务在现实中只能提供给操作系统引导程序或MS-DOS类操作系统使用。而EFI系统下的驱动并不是由可以直接运行在CPU上的代码组成的,而是用EFI Byte Code编写而成的。这是一组专用于EFI驱动的虚拟机器指令,必须在EFI驱动运行环境(Driver Execution Environment,或DXE)下被解释运行。这就保证了充分的向下兼容性,打个比方说,一个带有EFI驱动的扩展设备,既可以将其安装在安腾处理器的系统中,也可以安装于支持EFI的新PC系统中,而它的EFI驱动不需要重新编写。这样就无需对系统升级带来的兼容性因素作任何考虑。另外,由于EFI驱动开发简单,所有的PC部件提供商都可以参与,情形非常类似于现代操作系统的开发模式,这个开发模式曾使Windows在短短的两三年时间内成为功能强大,性能优越的操作系统。基于EFI的驱动模型可以使EFI系统接触到所有的硬件功能,在操作操作系统运行以前浏览万维网站不再是天方夜谭,甚至实现起来也非常简单。这对基于传统BIOS的系统来说是件不可能的任务,在BIOS中添加几个简单的USB设备支持都曾使很多BIOS设计师痛苦万分,更何况除了添加对无数网络硬件的支持外,还得凭空构建一个16位模式下的TCP/IP协议栈。

 

一些人认为BIOS只不过是由于兼容性问题遗留下来的无足轻重的部分,不值得为它花费太大的升级努力。而反对者认为,当BIOS的出现制约了PC技术的发展时,必须有人对它作必要的改变。

 

EFI和操作系统

 

EFI在概念上非常类似于一个低阶的操作系统,并且具有操控所有硬件资源的能力。不少人感觉它的不断发展将有可能代替现代的操作系统。事实上,EFI的缔造者们在第一版规范出台时就将EFI的能力限制于不足以威胁操作系统的统治地位。首先,它只是硬件和预启动软件间的接口规范;其次,EFI环境下不提供中断的访问机制,也就是说每个EFI驱动程序必须用轮询的方式来检查硬件状态,并且需要以解释的方式运行,较操作系统下的驱动效率更低;再则,EFI系统不提供复杂的存储器保护功能,它只具备简单的存储器管理机制,具体来说就是指运行在x86处理器的段保护模式下,以最大寻址能力为限把存储器分为一个平坦的段,所有的程序都有权限存取任何一段位置,并不提供真实的保护服务。当EFI所有组件加载完毕时,系统可以开启一个类似于操作系统Shell的命令解释环境,在这里,用户可以调入执行任何EFI应用程序,这些程序可以是硬件检测及除错软件,引导管理,设置软件,操作系统引导软件等等。理论上来说,对于EFI应用程序的功能并没有任何限制,任何人都可以编写这类软件,并且效果较以前MS-DOS下的软件更华丽,功能更强大。一旦引导软件将控制权交给操作系统,所有用于引导的服务代码将全部停止工作,部分运行时代服务程序还可以继续工作,以便于操作系统一时无法找到特定设备的驱动程序时,该设备还可以继续被使用。

 

EFI的组成

 

一般认为,EFI由以下几个部分组成:

1. Pre-EFI初始化模块

2. EFI驱动执行环境

3. EFI驱动程序

4. 兼容性支持模块(CSM)

5. EFI高层应用

6. GUID 磁盘分区

 

各部分功能

 

在实现中,EFI初始化模块和驱动执行环境通常被集成在一个只读存储器中。Pre-EFI初始化程序在系统开机的时候最先得到执行,它负责最初的CPU,主桥及存储器的初始化工作,紧接着载入EFI驱动执行环境(DXE)。当DXE被载入运行时,系统便具有了枚举并加载其他EFI驱动的能力。在基于PCI架构的系统中,各PCI桥及PCI适配器的EFI驱动会被相继加载及初始化;这时,系统进而枚举并加载各桥接器及适配器后面的各种总线及设备驱动程序,周而复始,直到最后一个设备的驱动程序被成功加载。正因如此,EFI驱动程序可以放置于系统的任何位置,只要能保证它可以按顺序被正确枚举。例如一个具PCI总线接口的ATAPI大容量存储适配器,其EFI驱动程序一般会放置在这个设备的符合PCI规范的扩展只读存储器(PCI Expansion ROM)中,当PCI总线驱动被加载完毕,并开始枚举其子设备时,这个存储适配器旋即被正确识别并加载它的驱动程序。部分EFI驱动程序还可以放置在某个磁盘的EFI专用分区中,只要这些驱动不是用于加载这个磁盘的驱动的必要部件。在EFI规范中,一种突破传统MBR磁盘分区结构限制的GUID磁盘分区系统(GPT)被引入,新结构中,磁盘的分区数不再受限制(MBR结构下,只能存在4个主分区),并且分区类型将由GUID来表示。在众多的分区类型中,EFI系统分区可以被EFI系统存取,用于存放部分驱动和应用程序。很多人担心这将会导致新的安全性因素,因为EFI系统比传统的BIOS更易于受到计算机病毒的攻击,当一部分EFI驱动程序被破坏时,系统有可能面临无法引导的情况。实际上,系统引导所依赖的EFI驱动部分通常都不会存放在EFIGUID分区中,即使分区中的驱动程序遭到破坏,也可以用简单的方法得到恢复,这与操作系统下的驱动程序的存储习惯是一致的。CSM是在x86平台EFI系统中的一个特殊的模块,它将为不具备EFI引导能力的操作系统提供类似于传统BIOS的系统服务。

 

EFI的发展

 

英特尔无疑是推广EFI的积极因素,近年来由于业界对其认识的不断深入,更多的厂商正投入这方面的研究。包括英特尔,AMD在内的一些PC生产厂家联合成立了联合可扩展固件接口论坛,它将在近期推出第一版规范。这个组织将接手规划EFI发展的重任,并将英特尔的EFI框架解释为这个规范的一个具体实现。另外,各大BIOS提供商如Phoenix, AMI等,原先被认为是EFI发展的阻碍力量,现在也不断的推出各自的解决方案。分析人士指出,这是由于BIOS厂商在EFI架构中重新找到了诸如Pre-EFI启动环境之类的市场位置,然而,随着EFIPC系统上的成功运用,以及英特尔新一代芯片组的推出,这一部分市场份额将会不出意料的在英特尔的掌控之中。

 

引入主题开始了解GPT分区表,首先简要的介绍一下GPT分区的一些特点:

 

MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

 

跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。传统MBR信息存储于LBA 0GPT头存储于LBA 1,接下来才是分区表本身。64Windows操作系统使用16,384字节(或32扇区)作为GPT分区表,接下来的LBA 34是硬盘上第一个分区的开始。

 

苹果公司曾经警告说:“不要假定所有设备的块大小都是512字节。”一些现代的存储设备如固态硬盘可能使用1024字节的块,一些磁光盘(MO)可能使用2048字节的扇区(但是磁光盘通常是不进行分区的)。一些硬盘生产商在计划生产4096字节一个扇区的硬盘(目前市面上西部数据就有4096字节的一个扇区),但截至2010年初,这种新硬盘使用固件对操作系统伪装成512字节一个扇区。

 

使用英特尔架构的苹果机也使用GPT

 

为了减少分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。

 

点击查看原图

传统MBR (LBA 0)

 

点击查看原图

 

点击查看原图 

 

GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。不能识别GPT硬盘的操作系统通常会识别出一个未知类型的分区,并且拒绝对硬盘进行操作,除非用户特别要求删除这些分区。这就避免了意外删除分区的危险。另外,能够识别GPT分区表的操作系统会检查保护MBR中的分区表,如果分区类型不是0xEE或者MBR分区表中有多个项,也会拒绝对硬盘进行操作。

 

在使用MBR/GPT混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。如Boot Camp就是使用这种方式启动Windows

 

分区表头 (LBA 1)

 

点击查看原图

 

点击查看原图  

 

偏移

字节长度

说明

0x00

8

签名,固定为ASCII "EFI PART",16进制表示0x5452415020494645

0x08

4

版本号,目前的版本为V1.016进制表示0x00010000

0x0C

4

分区表头的大小(单位是字节,通常是92字节,即 5C 00 00 00

0x10

4

GPT头中字节的CRC32校验

0x14

4

固定值00 00 00 00

0x18

8

当前LBA(这个分区表头的位置)

0x20

8

备份LBA(另一个分区表头的位置)

0x28

8

第一个可用于分区的LBA(主分区表的最后一个LBA + 1

0x30

8

最后一个可用于分区的LBA(备份分区表的最后一个LBA 1

0x38

16

磁盘GUID

0x48

8

分区表项的起始LBA

0x50

4

分区表项的数量

0x54

4

一个分区表项的大小(通常是128

0x58

4

分区表CRC32校验

0x5C

420

保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420个字节)

 

分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。在使用64Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。(EFI标准要求分区表最小要有16,384字节,即128个分区项的大小)分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小(位置总是在LBA 1)以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。所以GPT硬盘的分区表不可以直接使用16进制编辑器修改。

 

分区表项 (LBA 233)

 

点击查看原图

 

点击查看原图  

 

GUID分区表项

偏移

字节长度

说明

0x00

16

分区类型GUID

0x10

16

唯一的分区GUID

0x20

8

开始LBA

0x28

8

结束LBA

0x30

8

分区属性

0x38

72

分区名称 (Unicode)

 

分区属性

说明

Bit 0

 系统分区 00 00 00 00 00 00 00 00

Bit 60

 分区只读 00 00 00 00 00 00 00 10

Bit 62

 隐藏分区 00 00 00 00 00 00 00 40

Bit 63

 不挂载此分区(不分配盘符)00 00 00 00 00 00 00 80

 

分区类型GUID

相关操作系统

分区类型

GUID

(None)

未使用

00000000-0000-0000-0000-000000000000

MBR分区表

024DEE41-33E7-11D3-9D69-0008C781F39F

EFI系统分区

C12A7328-F81F-11D2-BA4B-00A0C93EC93B

BIOS引导分区

21686148-6449-6E6F-744E-656564454649

Windows

微软保留分区

E3C9E316-0B5C-4DB8-817D-F92DF00215AE

基本数据分区

EBD0A0A2-B9E5-4433-87C0-68B6B72699C7

逻辑软盘管理工具元数据分区

5808C8AA-7E8F-42E0-85D2-E1E90434CFB3

逻辑软盘管理工具数据分区

AF9B60A0-1431-4F62-BC68-3311714A69AD

Windows恢复环境

DE94BBA4-06D1-4D40-A16A-BFD50179D6AC

IBM通用并行文件系统(GPFS)分区

37AFFC90-EF7D-4e96-91C3-2D7AE055B174

HP-UX

数据分区

75894C1E-3AEB-11D3-B7C1-7B03A0000000

服务分区

E2A1E728-32E3-11D6-A682-7B03A0000000

Linux

数据分区

EBD0A0A2-B9E5-4433-87C0-68B6B72699C7

RAID分区

A19D880F-05FC-4D3B-A006-743F0F84911E

交换分区

0657FD6D-A4AB-43C4-84E5-0933C84B4F4F

逻辑卷管理器(LVM)分区

E6D6D379-F507-44C2-A23C-238F2A3DF928

保留

8DA63339-0007-60C0-C436-083AC8230908

FreeBSD

启动分区

83BD6B9D-7F41-11DC-BE0B-001560B84F0F

数据分区

516E7CB4-6ECF-11D6-8FF8-00022D09712B

交换分区

516E7CB5-6ECF-11D6-8FF8-00022D09712B

UFS分区

516E7CB6-6ECF-11D6-8FF8-00022D09712B

en:Vinum volume manager分区

516E7CB8-6ECF-11D6-8FF8-00022D09712B

ZFS分区

516E7CBA-6ECF-11D6-8FF8-00022D09712B

Mac OS X

HFS(HFS+)分区

48465300-0000-11AA-AA11-00306543ECAC

苹果公司UFS

55465300-0000-11AA-AA11-00306543ECAC

ZFS

6A898CC3-1DD2-11B2-99A6-080020736631

苹果RAID分区

52414944-0000-11AA-AA11-00306543ECAC

苹果RAID分区,下线

52414944-5F4F-11AA-AA11-00306543ECAC

苹果启动分区

426F6F74-0000-11AA-AA11-00306543ECAC

Apple Label

4C616265-6C00-11AA-AA11-00306543ECAC

Apple TV 恢复分区

5265636F-7665-11AA-AA11-00306543ECAC

Solaris

启动分区

6A82CB45-1DD2-11B2-99A6-080020736631

根分区

6A85CF4D-1DD2-11B2-99A6-080020736631

交换分区

6A87C46F-1DD2-11B2-99A6-080020736631

备份分区

6A8B642B-1DD2-11B2-99A6-080020736631

/usr 分区

6A898CC3-1DD2-11B2-99A6-080020736631

/var 分区

6A8EF2E9-1DD2-11B2-99A6-080020736631

/home 分区

6A90BA39-1DD2-11B2-99A6-080020736631

备用扇区

6A9283A5-1DD2-11B2-99A6-080020736631

保留分区

6A945A3B-1DD2-11B2-99A6-080020736631

6A9630D1-1DD2-11B2-99A6-080020736631

6A980767-1DD2-11B2-99A6-080020736631

6A96237F-1DD2-11B2-99A6-080020736631

6A8D2AC7-1DD2-11B2-99A6-080020736631

NetBSD

交换分区

49F48D32-B10E-11DC-B99B-0019D1879648

FFS分区

49F48D5A-B10E-11DC-B99B-0019D1879648

LFS分区

49F48D82-B10E-11DC-B99B-0019D1879648

RAID分区

49F48DAA-B10E-11DC-B99B-0019D1879648

concatenated分区

2DB519C4-B10F-11DC-B99B-0019D1879648

加密分区

2DB519EC-B10F-11DC-B99B-0019D1879648

 

GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。例如,EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64LBA编号,以及分区的名字和属性。

 

操作系统支持

 

对于不标准的MBR/GPT混合硬盘,不同的系统中的实现有些不一致。除非另加说明,操作系统在处理混合硬盘时优先读取GPT分区表

 

以下表格中的“不支持”应该理解成:不能识别GPT分区的硬盘,系统只能识别保护分区。GPT硬盘的数据可以通过第三方管理工具进行操作。

 

Unix操作系统

操作系统

版本

平台

BIOS/GPT启动

EFI/GPT启动

备注

FreeBSD

7.0以后

x86x86-64

MBR/GPT混合硬盘中,可以同时使用GPTMBR分区标识。

Linux

大多数x86架构的Linux发行版



Fedora 8+Ubuntu 8.04+

x86-64IA-64x86

一些分区工具,如fdisk,不支持GPT

gdiskgrub2之类的新工具支持GPT

Mac OS X

10.4.0以后(一些功能要到10.4.6以后)

x86x86-64

Solaris

Solaris 10 以后

x86x86-64SPARC

No (Work in Progress)

No (Work in Progress)

32Windows

操作系统

版本

平台

BIOS/GPT启动

EFI/GPT启动

备注

Windows XP

(2001-10-25)

x86

不支持

Windows Server 2003

(2003-04-24)

x86

不支持

Windows Server 2003

Service Pack 1 (2005-03-30)

x86

仅支持作为数据盘使用,在MBR/GPT混合硬盘中优先使用MBR

Windows Vista

(2005-07-22)

x86

MBR/GPT混合硬盘中优先使用MBR

Windows Server 2008

(2008-02-27)

x86

MBR/GPT混合硬盘中优先使用MBR

Windows 7

(2009-10-22)

x86

MBR/GPT混合硬盘中优先使用MBR

 

64Windows

 

下表列出了支持GPT64位版Windows。既包括IA-64架构的服务器版本,也包括x86-64EM64T架构。

 

操作系统

版本

平台

BIOS/GPT启动

EFI/GPT启动

备注

Windows XP

64-bit (2001-10-25)

IA-64

MBR/GPT混合硬盘中优先使用MBR。可拆卸磁盘仅支持MBR分区表。

Windows XP

64-bit, Version 2003 (2003-03-28)
(Workstation variant of Windows Server 2003 64-bit)

IA-64

MBR/GPT混合硬盘中优先使用MBR。可拆卸磁盘仅支持MBR分区表。

Windows Server 2003

64-bit (2003-04-24)

IA-64

MBR/GPT混合硬盘中优先使用MBR 默认使用GPTIA-64架构的启动盘必须是GPT硬盘,其余硬盘可以使用MBR也可以使用GPT

Windows Server 2003

x64, Service Pack 1 (2005-03-30)

x86-64

仅支持作为数据盘使用,在MBR/GPT混合硬盘中优先使用MBR

Windows XP

Professional x64 (2005-04-25)
(Workstation variant of Windows Server 2003 x64)

x86-64

仅支持作为数据盘使用,在MBR/GPT混合硬盘中优先使用MBR。可拆卸磁盘仅支持MBR分区表。

Windows Vista

(2005-07-22)

x86-64

MBR/GPT混合硬盘中优先使用MBR

Windows Server 2008

(2008-02-27)

x86-64, IA-64

MBR/GPT混合硬盘中优先使用MBR

Windows 7

(2009-10-22)

x86-64

MBR/GPT混合硬盘中优先使用MBR

Windows Server 2008 R2

(2009-10-22)
(Server variant of Windows 7)

x86-64, IA-64

MBR/GPT混合硬盘中优先使用MBR

  

以下是为了方便读者自行分析GPT磁盘结构,本人做的WinHex模板,包含“GPT头模板”、“分区表项模板” (使用时请将字体加粗部分复制到Windows中的记事本,另存为成*.tpl,放到WinHex所在目录中即可使用)

 

1GPT头模板

 

template "GUID Partition Table Header"

description "GUID Partition Table Header"

applies_to disk

sector-aligned

requires 0x00  "45 46 49 20 50 41 52 54"

 

begin

 

         {

         read-only char [8]   "签名"

         hex 4         "版本 (HEX)"

         uint32 "GPT头大小字节数"

         hex 4         "GPTCRC校验和 (HEX)"

    hex 4         "保留--必须为零 (HEX)"

         int64         "当前GPT头的LBA扇区号"

         int64         "GPT头备份LBA扇区号"

         int64         "GPT分区区域起始LBA"

         int64         "GPT分区区域结束LBA"

         read-only guid "磁盘GUID (GUID)"

         move -16

         hex 16      "磁盘GUID (16Byte HEX)"

         int64         "GPT分区表起始LBA"

         uint32       "分区表项数"

         uint32       "每分区表项占用字节数"

         hex 4         "分区表CRC校验和 (HEX)"        

         hex 420    "保留 (420Byte HEX)"

         }

 

         endsection

 

end

 

 

2、分区表项模板

 

template "GUID Partition Entry"

description "GUID Partition Entry"

applies_to disk

sector-aligned

multiple

begin

 

         {

         read-only guid "分区类型GUID (GUID)"

         move -16

         hex 16      "分区类型GUID (HEX)"

         read-only guid "唯一的分区GUID (GUID)"

         move -16

         hex 16      "唯一的分区GUID (HEX)"

         int64         "开始LBA"

         int64         "结束LBA"

         hex 8         "属性 (HEX)"

         char16[36]       "分区名称 (Unicode)"

         }

 

end

  

在此为广大读者献出一个用于修复GPT磁盘的WinHex脚本,主要用于MBR、主GPT头、主分区表项,损坏的修复,本脚本通过备份的GPT头与备份的分区表项进行修复,使用之前先判断备份部分是否正常,脚本如下(使用时请将字体加粗部分复制到Windows中的记事本,另存为成*.whs,放到WinHex所在目录中即可使用):

 

GPT Header 修复(用备份修复)

 

Assign DiskSize GetSize

 

Goto 0x1B8

Write 0x43C659CF   //磁盘签名

Move 2

Write 0x00000200EEFFFFFF01000000FFFFFFFF

Goto 0x1FE

Write 0x55AA

 

Goto (DiskSize-512)

Move 32

Read Temp1 8

 

Goto (DiskSize-512)

Read Header 512

 

Goto (DiskSize-512-16384)

Read ParBak 16384

 

Goto (Temp1*512)

Write Header

Write ParBak

 

Goto (Temp1*512)

Move 16

Write 0x00000000

Move 4

Write 0x0000000000000000

Write 0x0100000000000000

Move 32

Write 0x0000000000000000

 

Goto (DiskSize-512+32)

Read Temp2 8

Goto (Temp1*512+24)

Write Temp2

 

Goto (DiskSize-512+24)

Read Temp3 8

Goto (Temp1*512+32)

Write Temp3

 

Goto (Temp1*512+72)

Write ((Temp1*512+512)/512)

 

Goto (Temp1*512)

Assign Header CurrentPos

Block Header (Header+91)

CalcHash CRC32 HeaderCRC32

Goto (Temp1*512+16)

Write HeaderCRC32

Save

 

MessageBox "修复成功!"