hyde777 发表于 2015-3-19 22:58:26

UEFI普及贴

本帖最后由 hyde777 于 2015-3-20 10:28 编辑

浅谈GPT

对于GPT的基本概念,我就不叙述了,都在这里。下面主要讲讲GPT的实际应用。

由于目前的磁盘容量越来越大,传统的MBR分区表已经不能满足大容量磁盘的需求。传统的MBR分区表只能识别磁盘前面的2.2TB左右的空间,对于后面的多余空间只能浪费掉了,而目前希捷等磁盘厂商甚至早早就推出了单盘3TB的磁盘,因此,及早迁移到GPT非常有必要。除此以外,MBR分区表只能支持4个主分区或者3主分区+1扩展分区(包含随意数目的逻辑分区),而GPT在Windows下面可以支持多达128个主分区(在Linux或者Unix类不是很清楚,听说是没有限制……基于Itanium和其他架构的Windows或者Unix很早就已经使用了GPT)。

下面先介绍点MBR和GPT的区别。

MBR分区表:

在传统硬盘分区模式中,引导扇区是每个分区(Partition)的第一扇区,而主引导扇区是硬盘的第一扇区。它由三个部分组成,主引导记录MBR、硬盘分区表DPT和硬盘有效标志。在总共512字节的主引导扇区里MBR占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic number,占2个字节,固定为55AA。

一个扇区的硬盘主引导记录MBR由4个部分组成。

•主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。

•出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。

•分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。

•结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。

GPT:

GPT的分区信息是在分区中,而不象MBR一样在主引导扇区,为保护GPT不受MBR类磁盘管理软件的危害,GPT在主引导扇区建立了一个保护分区(Protective MBR)的MBR分区表(此分区并不必要),这种分区的类型标识为0xEE,这个保护分区的大小在Windows下为128MB,Mac OS X下为200MB,在Window磁盘管理器里名为GPT保护分区,可让MBR类磁盘管理软件把GPT看成一个未知格式的分区,而不是错误地当成一个未分区的磁盘。

另外,为了保护分区表,GPT的分区信息在每个分区的头部和尾部各保存了一份,以便分区表丢失以后进行恢复。目前而言,对GPT支持比较好的磁盘管理软件推荐DiskGenius(似乎甚至支持GPT的分区表恢复),在Linux下面则有gparted和gdisk。

对于基于x86的Windows(这里指的是支持从GPT启动的Windows,见开头的链接),想要从GPT磁盘启动,主板的芯片组必须支持UEFI(这是强制性的,但是如果仅把GPT用作数据盘则无此限制)。至于如何判断主板芯片组是否支持UEFI,一般可以查阅主板说明书或者厂商的网址,也可以通过查看BIOS设置里面是否有UEFI字样。我自己的机器是AMD的970芯片组,可以支持UEFI。总体来说,在UEFI的支持方面,Intel芯片组更好一点。关于从GPT磁盘启动的Windows安装,后面会有涉及。

而对于Linux来说,可以选择两种GPT方案:

若芯片组不支持UEFI,那么可以使用普通的BIOS兼容分区+GPT的方案。这里说明一下,所谓的BIOS兼容分区,可以通过DiskGenius进行预先分区,分区类型是BIOS boot partition,大小一般1MB左右就足够了。这个分区的作用是存放引导管理器(一般是Grub2,Grub legacy默认不支持GPT,需要额外打补丁)的引导代码。我个人理解,这个分区应该是“伪装”的MBR,以便保证引导管理器和GPT的兼容。除了BIOS兼容分区之外,其他的分区就和正常的GPT一样了,可以随意分配。

若芯片组支持UEFI,那么推荐就使用UEFI+GPT的方案。只需要分出一个128MB的ESP分区就行了,这也可以通过DiskGenius完成。把磁盘分区类型转换成GPT时,DiskGenius会提示创建ESP分区。如果不打算和Windows组双系统,那么就不需要分配MSR分区,只要ESP分区就行了。

ESP的作用就是存放操作系统的引导管理器以及efi文件。在UEFI+GPT的磁盘上面,这个分区存放着操作系统引导的关键数据,虽然可以通过一定的手段在操作系统里面读取和写入数据,但是不推荐随便去动。

MSR分区即 Microsoft 保留 (MSR) 分区。是每个 GUID 分区表 (GPT)磁盘都要求的分区。系统组件可以将 MSR 分区的部分分配到新的分区以供它们使用。例如,将基本 GPT 磁盘转换为动态磁盘后,系统分配的 MSR 分区将被用作“逻辑磁盘管理器”(LDM) 元数据分区。MSR 分区的大小会因 GPT 磁盘的大小不同而发生变化。对于小于 16 GB 的磁盘,MSR 分区为 32 MB。对于大于 16 GB 的磁盘,MSR 分区为 128 MB。MSR 分区在“磁盘管理”中不可见,用户也无法在 MSR 分区上存储或删除数据。

关于这部分,后面会有进一步介绍。

上面基本上把GPT的各方面基本知识都进行了介绍,下面就讲具体的操作系统安装。注意:无论何种操作系统,都只有64位的系统能从GPT启动。

在UEFI+GPT全新安装Windows 7 x64:

首先,要保证所用的安装介质是原版Windows 7 x64的安装光盘(根据本人经验,很多重新封装的Windows 7 x64光盘会把EFI的启动程序去掉),U盘不保证一定可以(这要看具体的芯片组支持情况而定)。另外,记得要在BIOS设置里面打开UEFI的支持,具体的可以参阅主板说明书。

放入安装光盘,可以按快捷键选择启动介质,选择以UEFI模式启动安装光盘。通常,UEFI模式会列出单独的一个启动选项,举个例子,比如按快捷键之后,列出如下几个启动介质:1、P0:ST9320325AS,2、ASUS 20B1S(光驱),3、UEFI:ASUS 20B1S(UEFI模式的光盘启动),这时候,就应该选择第三项,那么安装光盘就会以UEFI模式进行启动,可以把Windows安装到GPT了。

在进入安装界面以后,如果想手动指定ESP和MSR分区的大小,可以先不要急着进行安装,按Shift+F10调出cmd,用diskpart命令行程序进行分区,因为Windows安装程序里面的分区软件不能手动指定ESP和MSR分区的大小。在cmd输入diskpart,就进入了diskpart分区软件。对于4KB的高级格式磁盘,无需担心对齐问题,GPT似乎本身就是以4KB的扇区进行分区的。然后就按照以下步骤分区吧,当然嫌麻烦的话,可以直接用PE里面的DiskGenius进行预先分区(推荐)。

DISKPART>list disk
//显示硬盘列表。用空间区分硬盘,记下前面的序号,假设目前是disk 0

DISKPART>select disk 0
//如果这个时候再list一遍可以看到disk 0前面有一星号。用clean清除分区表(记得备份数据)

DISKPART>clean
//我们可以在这里完成分区工作,也可以让安装程序去做。不过先要把分区转成GPT

DISKPART>convert gpt
//这一步之后,磁盘就是GPT分区表了。可以用图形界面安装去了。下面是手动分区。

//现在新建EFI分区。通常128M就够了,Windows默认是100M
DISKPART>create partition efi size=128
//这个分区是用来存放EFI引导文件的,默认是看不到里面的文件的。分区格式为FAT32。细心的同学应该注意到了,在MBR分区表让Windows 7给新硬盘分区并装系统的话,C盘前面会有100M多出来的空间。这里大同小异。

//然后是Microsoft System Recovery分区,默认是128M。
DISKPART>create partition msr size=128
//微软保留分区创建完毕。

DISKPART>create partition primary size=40963
//这就是C盘,大小随便指定,后面的剩余空间可以先空着,装完系统再分。

如此,基本的分区结构就创建完毕了,可以回到Windows安装程序继续进行安装了,以后的过程就和正常的MBR安装Windows 7一样了。

注意:对于想要通过模拟BIOS激活的同学,最好不要轻易尝试,因为模拟BIOS激活一般是通过替换MBR代码来达到激活的效果,在GPT里面,由于不存在MBR,这种方法可能会破坏分区表,导致无法引导。推荐自己购买正版密钥。

在UEFI+GPT全新安装Linux:

目前的Linux发行版中,很多都还没有加入UEFI支持,推荐使用最新版Fedora,对UEFI支持比较全面一点。安装过程就不赘述了,和UEFI+GPT的Windows 7安装差不多,都是以UEFI模式启动光盘进行安装,也要分100MB以上的ESP分区。其他安装过程并无特别。

在BIOS兼容分区+GPT全新安装Linux:

这个也没什么可以多说的,和正常的MBR分区安装Linux一样,安装程序会自动识别GPT和BIOS兼容分区并且把引导管理器安装到BIOS兼容分区里面(推荐使用Ubuntu,OpenSUSE等广泛采用Grub2的发行版)。

需要说明的是:很多人可能会有一种错误的观念,甚至有点排斥GPT,认为2.2TB以上的单块磁盘才有必要采用GPT,而对于容量相对较小的磁盘,GPT就不是必须的了。事实上,这种观念有一定道理,但并不完全正确。

首先,GPT和硬盘容量并不存在依赖或者因果关系,两者是独立的部分。

其次,即使目前主流的硬盘容量达不到,GPT也依然应当被认可。当然,由于目前XP尚有很大的份额,可能迁移到GPT的条件还不成熟。

第三,别看我上面洋洋洒洒介绍那么多,使得GPT看上去貌似很复杂的样子。实际上,对于用户来说,我们完全不用了解GPT的分区结构是如何的,GPT上面的操作系统是如何引导的。这些全都是不需要理会的内容,我们只管应用就行了。

当然,尽管GPT的历史已经算是悠久了,但是并没有大规模普及,相应的磁盘和分区管理工具可能还不成熟。但是本人相信,随着硬件的发展,GPT的普及并不会太遥远。如前面所说,尽管GPT在PC机并不普及,但是在Macintosh和大型的Unix机器,GPT很早就已经进入应用。

以上就是对GPT应用的基本介绍,总的来说,GPT的好处还是很多的。而为了以后的大容量磁盘考虑,本人也推荐尽快升级到GPT(当然,Windows用户比较悲催,必须要主板芯片组支持UEFI)。

PS:关于UEFI的介绍,我可能会另外开帖,这又是另一个需要长篇介绍的东西……本帖主体内容就是以上了,具体问题可以慢慢探讨。

static/image/hrline/line3.png

挑战传统BIOS的UEFI固件

之前在《浅谈GPT》已经涉及了一点UEFI的基本知识(http://bbs.icpcw.com/thread-2258756-1-1.html),本帖目的就是要把UEFI和GPT结合起来进行一个全面介绍。

由于电脑教育普及,很多人都知道BIOS就是Basic Input/Output System,翻成中文是“基本输入/输出系统”,是一种所谓的“固件”,负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件时的中介角色。

然而,那些都是过去DOS 时代的事情,自从Windows NT出现,Linux 开始崭露头角后,这些操作系统已将过去需要通过BIOS完成的硬件控制程序放在操作系统中完成,不再需要调用BIOS功能。一般来说,当今所谓的“电脑高手”,多半是利用BIOS来对硬件性能做些超频调校,除了专业人士外,鲜有人再利用 BIOS 进行底层工作。

可扩展固件接口(Extensible Firmware Interface,EFI)是 Intel 为全新类型的 PC 固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在 操作系统加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是有近20多年历史的PC BIOS的继任者。

UEFI是由EFI 1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际组织,贡献者有Intel,Microsoft,AMI,等几个大厂,属于开源项目,目前版本为2.3。与传统BIOS 相比,最大的几个区别在于:

1、编码99%都是由C语言完成;

2、一改之前的中断、硬件端口操作的方法,而采用了Driver/protocol的新方式;

3、将不支持X86实模式,而直接采用Flat mode(也就是不能用DOS了,现在有些 EFI 或 UEFI 能用是因为做了兼容,但实际上这部分不属于UEFI的定义了);

4、输出也不再是单纯的二进制code,改为Removable Binary Drivers;

5、操作系统启动不再是调用Int19,而是直接利用protocol/device Path;

6、对于第三方的开发,前者基本上做不到,除非参与BIOS的设计,但是还要受到ROM的大小限制,而后者就便利多了。

7、弥补BIOS对新硬件的支持不足的毛病。

UEFI的特点:

1.易于实现、容错和纠错特性更强

与BIOS显著不同的是,UEFI是用模块化、C语言风格的参数堆栈传递方式、动态链接的形式构建系统,它比BIOS更易于实现,容错和纠错特性也更强,从而缩短了系统研发的时间。更加重要的是,它运行于32位或64位模式,突破了传统16位代码的寻址能力,达到处理器的最大寻址,此举克服了BIOS代码运行缓慢的弊端。

2.驱动开发简单、兼容性好

与BIOS不同的是,UEFI体系的驱动并不是由直接运行在CPU上的代码组成的,而是用EFI Byte Code(EFI字节代码)编写而成的。对Java有一点了解的朋友,一定知道它的编译代码就是以“Byte Code”形式存在的,正是这种没有一步到位的中间性机制,使Java可以在多种平台上运行。UEFI也借鉴了类似的做法。EFI Byte Code是一组用于UEFI驱动的虚拟机器指令,必须在UEFI驱动运行环境下被解释运行,由此保证了充分的向下兼容性。

一个带有UEFI驱动的扩展设备既可以安装在使用安腾的系统中,也可以安装在支持UEFI的新PC系统中,它的UEFI驱动不必重新编写,这样就无须考虑系统升级后的兼容性问题。基于解释引擎的执行机制,还大大降低了UEFI驱动编写的复杂门槛,所有的PC部件提供商都可以参与。

3.高分辨率的彩色图形环境、支持鼠标操作

UEFI将让枯燥的字符界面成为历史!UEFI内置图形驱动功能,可以提供一个高分辨率的彩色图形环境,用户进入后能用鼠标点击调整配置,一切就像操作Windows系统下的应用软件一样简单。BIOS将不再是高手才能玩转的工具,光这一点就足以让很多菜鸟朋友心仪不已了。

UEFI的图形化设置界面:
20111111180744517191.jpg


4.强大的可扩展性

我们都知道,当电脑出现故障导致无法进入操作系统时,我们往往要借助其他工具才能解决问题,BIOS在诊断系统故障方面的作用实是在太小了。不过,UEFI将不会重蹈BIOS功能单一的覆辙!强大的可扩展性是UEFI的另一大优点。UEFI将使用模块化设计,它在逻辑上分为硬件控制与操作系统软件管理两部分,硬件控制为所有UEFI版本所共有,而操作系统软件管理其实是一个可编程的开放接口。借助这个接口,主板厂商可以实现各种丰富的功能。比如我们熟悉的各种备份及诊断功能可通过UEFI加以实现,主板或固件厂商可以将它们作为自身产品的一大卖点。如果你更习惯让别人来维护机器,UEFI也提供了强大的联网功能,其他用户可以对你的主机进行可靠的远程故障诊断,而这一切并不需要进入操作系统!要知道,如今的BIOS就是添加几个简单的USB设备支持都极其困难,更别说上网浏览网页了。

因此,UEFI可以说是介于固件和操作系统之间的一个中间接口。由于UEFI的这些特性,从理论上来说,可以大大加快操作系统的启动速度。

抛开以上那些专业的文字不谈,对于我们这些普通用户而言,UEFI带来的最大的便利,恐怕就是其图形化的硬件设置界面了。相对于传统的BIOS设置界面,UEFI的图形界面不仅更简洁,更优美,而且对用户更加友好(有简体中文支持,本人也用过不少电脑,BIOS设置基本是清一色的英文界面。印象里面貌似只有HP提供过繁体中文的BIOS设置界面)。

在目前的主板芯片组市场来看,Intel基本已经开始全面部署UEFI固件(从6系列芯片组开始,本人的笔记本是采用了HM65,已采用UEFI BIOS),而AMD的970,990以及A55和A75芯片组也已经部署UEFI(我的台式机是970芯片组,当时就奔着UEFI支持去的)。

以上只是PC机的情况,而在Macintosh平台,更是很早的时候就全面采用了EFI+GPT的组合(苹果这家公司的理念还是很超前的)。当然,和PC平台相比,苹果采用的是EFI 1.x,而目前PC平台普遍开始部署的都已经是EFI 2.0甚至2.1。貌似苹果也有把EFI升级到2.x的打算。

总体而言,UEFI目前已经开始有全面铺设的趋势了,虽然UEFI不算是新事物(印象里面是早在06还是07年就已经被提出了),但是前几年一直处于停滞状态,并没有大范围部署和推广。从2011年开始,Intel才再次在自家的芯片组上面真正开始大规模的部署。相信有很多人其实不知道自己的芯片组早已经内置了UEFI吧?

谈到UEFI,就不得不说到GPT。之前已经介绍过,如果要从GPT启动Windows,除了对Windows版本有要求之外,主板芯片组也必须支持UEFI。下面就来说说这两者的关系。

很多人可能会产生误解,以为UEFI和GPT是密不可分的,要使用GPT就必须要主板芯片组支持UEFI,事实上并非如此。

我在之前也已经说过,如果是打算从GPT启动Windows,那么UEFI就是必要的。但是对于Linux,则完全没有这种限制。当然,如果只是把GPT用作数据盘,则完全不用管芯片组是否支持UEFI,只需要操作系统支持就行了。

因此,UEFI和GPT可以说是独立的两个部分,并不存在一定的依赖关系。

下面就来具体说说UEFI和GPT的结合应用。

在我《浅谈GPT》一文中,我已经介绍过了如何把Windows或者Linux安装到UEFI+GPT的磁盘,这里我就再深入介绍下ESP所扮演的角色。

如下图,神秘的ESP分区结构在这里看得一清二楚。
2.PNG

可以看到,里面的ESP:\EFI\Microsoft\Boot文件夹的内容和结构和Windows 7系统分区(C盘)里面的Boot文件夹(隐藏属性)极其类似。所不同的是,ESP分区的一级目录只有EFI文件夹,下面我们再来看看具体里面有些什么吧。
3.PNG

在ESP:\EFI\Boot里面有一个bootx64.efi文件,这个文件就是基于UEFI+GPT的Windows引导文件。UEFI就是通过这个文件进行操作系统的引导(MBR分区表里面MBR引导程序的作用)。
4.PNG

这就是ESP:\EFI\Microsoft\Boot文件夹的具体内容了,里面也有几个efi的可执行文件,其中memtest.efi就是Windows的内存测试工具了。另外的bootmgfw.efi和bootmgr.efi文件就是微软引导管理器的相关文件了。

如果要在UEFI+GPT的磁盘装多系统,那么操作系统会把各自的EFI引导文件写入这个ESP分区,通过支持UEFI的引导管理器进行。EFI文件本身是个可执行文件,事实上,引导管理器所做的事情就是执行这个EFI文件。

如下图,在我的虚拟机装了Windows 7+Ubuntu以后的情况:
1.PNG

可以看到,在EFI设置菜单的引导管理界面可以直接进行双系统的选择,永远告别各种复杂的双系统甚至多系统引导项管理吧。


这是我安装Ubuntu以后的ESP分区,里面多了个ubuntu文件夹,下面只有一个grubx64.efi文件。不用说,这就是Grub2的efi引导文件了。
5.PNG
2012-5-16 09:47 上传下载附件 (117.99 KB)
再结合上图,相信各位有过双系统甚至多系统安装经验的人都能够明白UEFI+GPT的引导机制和这种结构所带来的便捷性了。有了UEFI+GPT,我们不用再为如何进行双系统或者多系统引导而发愁了,这就是很好的解决方案。

如果配合了图形化的UEFI设置界面,那将是多大的便利啊,只要动动鼠标,就能告诉你的PC机应该引导所安装的哪个操作系统。当然,可能也有存在的问题,那就是每次都要按快捷键选择引导哪个操作系统,否则就会直接进入上一次引导的操作系统。相信以后还会有改进,使得引导选项更便利。

上面提到efi文件的可执行属性,因此,你甚至可以编写个小游戏的efi文件,然后直接在UEFI的设置界面运行这个游戏。另外,ESP分区的efi文件都是可以通过EFI Shell的命令行界面执行的。不过具体的命令操作,恐怕得有点DOS或者Linux命令基础的人才能较快上手了。

尽管介绍了这么多,但是时至今日,UEFI仍然是一项尚未普及的技术。尽管Intel在2011年开始大规模部署,但是真正已经完成图形化EFI BIOS的主板厂商并不多,只有华硕,昂达等寥寥数家。希望随着技术的发展,UEFI以及图形化EFI BIOS能尽快得到普及。

PS:手头有华硕A55和A75板子的同学可以去看看自己的图形化EFI BIOS设置界面,那可是看得我流口水啊。

q8155128 发表于 2015-3-19 23:57:09

图片也要一起转过来啊。。。。
看文章有图的名称呢亲。。。。
俺不好理解头头很疼哦。。。。

lbw2007 发表于 2015-3-20 10:09:31

和百科里面的差不多……感谢分享

sgw888 发表于 2015-3-20 15:59:24

太长了,没看.
我就说一下我的理解,UEFI给我们最大的改变是什么?
UEFI不再需要关注什么引导代码了,就是MBR PBR什么的概念统统扔掉了.
UEFI的引导开始变的非常简单,因为UEFI可以直接识别分区,可以直接从文件进行引导.
就U盘来说,直接在系统里格式化一下,然后拷贝WINDOWS(WINDOWS8 或者 WINDOWS 7 64)安装文件到根目录,插到电脑上,直接就可以引导.

需要注意的是,UEFI 目前不能直接识别NTFS分区,所以分区要弄成FAT格式的.
页: [1]
查看完整版本: UEFI普及贴