近期一同学新购置了一笔记本,因为学软件的么,想弄个双系统玩耍一下。谁知,安装完CentOS之后,在GRUB下,引导不进去Win8.1了。然后我尝试使用PE修复引导,进去后,发现不识盘,也没细想,直接装系统,装完竟然进不了系统0.0.

看了下主板BIOS设置,默认是UEFI启动的,也就是说并不是BOIS + MBR启动的。修复BBR自然没有用,不识盘是因为分区模式是GPT。

EFI BIOS模式简介及与Legacy BIOS区别

一个显著的区别就是EFI BIOS是用模块化,C语言风格的参数堆栈传递方式,动态链接的形式构建的系统,较Legacy BIOS而言更易于实现,容错和纠错特性更强,缩短了系统研发的时间。它运行于32位或64位模式,乃至未来增强的处理器模式下,突破传统16位代码的寻址能力,达到处理器的最大寻址。它利用加载EFI驱动的形式,识别及操作硬件,不同于BIOS利用挂载实模式中断的方式增加硬件功能。后者必须将一段类似于驱动的16位代码,放置在固定的0x000C0000至0x000DFFFF之间存储区中,运行这段代码的初始化部分,它将挂载实模式下约定的中断向量向其他程序提供服务。例如,VGA图形及文本输出中断(INT 10h),磁盘存取中断服务(INT 13h)等等。由于这段存储空间有限(128KB),Legacy BIOS对于所需放置的驱动代码大小超过空间大小的情况无能为力。另外,Legacy BIOS的硬件服务程序都以16位代码的形式存在,这就给运行于增强模式的操作系统访问其服务造成了困难。因此Legacy BIOS提供的服务在现实中只能提供给操作系统引导程序或MS-DOS类操作系统使用。而EFI系统下的驱动并不是由可以直接运行在CPU上的代码组成的,而是用EFI Byte Code(EBC)编写而成的。这是一组专用于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技术的发展时,必须有人对它作必要的改变。
UEFI是新一代起到BIOS的作用的全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface), 是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。它是由UEFI初始化模块、UEFI驱动执行环境、UEFI驱动程序、兼容性支持模块、UEFI高层应用和GUID磁盘分区组成。他的强大的构造以至于他支持鼠标驱动和图像驱动,可以支持图像界面的设置。

而MBR早起用于Win平台,GPT多用于苹果的系统。但是随着时间的发展硬盘越来越大,好多分区硬盘超过2.2G,而MBR它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主分区(Primary?partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR)。

在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。

在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。?在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT。

至于GPT,全局唯一标识分区表(GUID?Partition?Table,缩写:GPT)是一个实体硬盘的分区结构。它是EFI(可扩展固件接口标准)的一部分,用来替代BIOS中的主引导记录分区表。但因为MBR分区表不支持容量大于2.2TB(2.2?×?1012字节)的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表。

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

与支持最大卷为2?TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为18?EB(Exabytes)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性。

至于UEFI,也可以引导MBR,但是我相信很少人会这么做的。

UEFI引导的Win8或Win8.1 有两个很小的分区(几百MB),一个叫ESP(EFI系统分区),另一个MSR(Microsoft保留分区,通常为128MB)。MSR是windows要求的。ESP对UEFI启动很重要,以前的老电脑启动时(俗称legacy boot)引导程序会从MBR中读取,而UEFI的引导程序是以后缀名为.efi的文件存放在ESP分区中的,ESP分区采用的是fat32文件系统。所以千万不要手贱把这两个分区删了。此外,可能还存在一个小分区叫WinRE,这个是win8的恢复分区,体积也很小。windows下想访问ESP分区必须用分区工具给它分配盘符取消隐藏。

UEFI引导修复

我们时常碰到uefi文件损坏,或者你使用Ghost直接将硬盘数据还原后,因为不是MBR模式,所以还是要加入uefi的引导。UEFI它并没有存储到分区表之前的扇区,而是单独弄一个硬盘,存储分区表。它起名esp,esp磁盘分区是gpt格式硬盘放efi引导文件的磁盘,在mbr格式硬盘中也可以由任一fat格式磁盘分区代替。而里面存储的efi文件结构是。

efi\boot\bootx64.efi

efi\microsoft\boot\bcd

efi的启动过程是uefi bios启动时,自动查找硬盘下esp分区的bootx64.efi,然后由bootx64.efi引导
efi下的bcd文件,由bcd引导指定系统文件(一般为c:\windows\system32\winload.efi)。

现在用两个工具,一个是微软WIn8安装盘自带的bcdboot,另一个是bootice(很有名的武器)。

bcdboot修复制定esp分区 c:\windows /s o: /f uefi /l zh-cn
其中:c:\windows??硬盘系统目录,根据实际情况修改
/s o:? ???指定esp分区所在磁盘,根据实际情况修改
/f uefi? ?指定启动方式为uefi
/l zh-cn??指定uefi启动界面语言为简体中文
在64位7PE不带/s参数,故7PE不支持bios启动下修复

bcdboot不指定分区修复bcdboot c:\windows /l zh-cn
其中 c:\windows??硬盘系统目录,根据实际情况修改
/l zh-cn??指定uefi启动界面语言为简体中文。

注意在PE下应当指定esp分区!

从efi引导启动过程来看,虽然它的文件很多,但主要用到的就是两文件,我们完全可以在
各pe下挂载esp分区,从硬盘系统中复制bootx64.efi文件,然后用用bootice制作好bcd,就
完成efi引导修复。
1.启动任一pe,用esp分区挂载器或diskgenuis挂载esp分区
2.查看esp分区是否可正常读写,如不正常可重新格式化为fat16分区格式。
3.在esp分区中建立如下空文件夹结构
\efi\boot\? ?(bootx64.efi等复制)
\efi\microsoft\boot\ (bcd等建立)
4.复制硬盘系统中的bootmgfw.efi(一般在c:\windows\boot\efi下)到esp分区的\efi\boot\
下,并重命名为bootx64.efi
5.打开bootice软件,有esp分区的\efi\microsoft\boot\下新建立一bcd文件,
打开并编辑bcd文件,添加“windows vista\7\8启动项,
指定磁盘为硬盘系统盘在的盘,
指定启动分区为硬盘系统分区(一般为c:)
指定启动文件为:\Windows\system32\winload.efi, 是*.efi,不是*.exe,要手工改过来
最后保存当前系统设置并退出。

如果xp精简出的PE不能识别gpt格式的硬盘分区,用2003PE中的disk.sys替换xpPE内核中的相应文件,就可以让xp精简出的PE也能识别gpt磁盘格式分区。指定启动分区不是esp分区所在分区,就是硬盘64位7、8 系统所在分区。

Linux支持UEFI引导

微软为Windows 8硬件设备设计了UEFI(统一可扩展固件接口)安全启动(Secure Boot),这也给Linux系统的安装和启动造成了大麻烦。包括Fedora、openSUSE、Ubuntu在内的不少Linux开发商都采用了这样或那样的办法来解决这个问题,2012年10月,Linux基金会宣布找到了一种通用办法,可以让所有Linux发行版在采用UEFI安全启动的PC上顺利安装运行,就像Windows 8一样。
具体来说就是,在nutshell中,Linux基金会利用微软密钥签署一个小的预引导装载程序(pre-bootloader),然后链式加载(无需任何形式的签名许可)一个预先指示的引导装载程序,从而启动Linux(或其它操作系统)。这种预引导装载程序能够采用一种“当前用户”测试来确保它不会用来引导恶意程序。这种预引导装载程序可以被用在CD/DVD安装或LiveCD发行版本中,甚至能够用来在安全模式下启动任一款预装操作系统。

而且安装Win7 也需要关掉Secure Boot模式,否则不可引导。只能引导Win8 和 Win 8.1。

一般安装完Win8或Win8.1之后,ESP分区有/EFI/Microsoft/Boot/文件夹,里面是其启动器,bootmgr.efi,bootmgfw.efi等。

我们可以用CentOS里面的第三方启动管理器来代替bootmgfw.efi的位置,让后由这个管理器提供链式加载bootmgfw.efi和grub.efi。

把refind.efi改名为微软的bootmgfw.efi的方式。而微软的bootmgfw.efi则修改到其他位置。具体步骤:
(1)通过CentOS光盘recue模式,把/EFI/Microsft/Boot文件夹改名为 /EFI/weiruan;
(2)把refind文件夹拷贝到/EFI/Microsoft/,并改名为Boot;
(3)把refind_x64.efi改名为bootmgfw.efi;修改refind.conf.smaple文件名为refind.conf,并根据需要修改其中的内容,我修改后的内容如下:
timeout 20
showtools shell, mok_tool, about, reboot, exit, firmware
scanfor internal,external,optical,manual
dont_scan_files shim.efi,MokManager.efi,memtest.efi,bootmgr.efi
scan_all_linux_kernels
default_selection weiruan
至此,文件夹布局为:
EFI/weiruan (里面是Windows8的启动器)
EFI/Microsoft/Boot(里面是refind的文件)
EFI/redhat ?(里面是grub启动器)

有新闻报道说,Linux内核维护者James Bottomley日前正式发布了这一解决方案:Linux基金会UEFI安全启动系统(Linux Foundation Secure Boot System),安装文件如下:
PreLoader.efi (md5sum 4f7a4f566781869d252a09dc84923a82)
HashTool.efi (md5sum 45639d23aa5f2a394b03a65fc732acf2)
Bootomley表示,为了方便携带,他还将这两个文件制成了一个可启动mini-USB镜像,你可以到这里下载:http://blog.hansenpartnership.com/wp-uploads/2013/sb-usb.img(md5sum (7971231d133e41dd667a184c255b599f)。使用时,你必须为loader.efi(在\EFI\BOOT目录)和shell.efi(在顶级目录)注册hashes,它还包括一个需要注册hash才能运行的KeyTool.efi文件。
另外,除了Linux基金会提供的这个方法,去年11月份Lin开发人员Matthew Garrett也曾公布了一个方法,可以在采用UEFI安全启动系统的PC上启动Linux。Garrett的方法和Linux基金会提供的解决方案都各有利弊,据悉,两者正在通力合作,希望找到一种完美的解决方案。

另外还有一种方式是用UEFI启动到GRUB,然后加载Win系列系统或者Linux以实现其双系统,目前还在研究,静待下文~~

参考:

  1. http://benyouhui.it168.com/thread-3171040-1-1.html

  2. http://wenku.baidu.com/link?url=dUEJoy3mMQfPfzDVvw63VhVMoRO0c66oRKDG5D0fvs0iLe3jUoYHHy930NwefPdk0rCA-b0hm92fSkE59zNrnXA-sI2e5cmSdmyGu9unxg7

  3. http://bbs.wuyou.com/forum.php?mod=viewthread&tid=323759

页面下部广告

2 对 “UEFI学习之启动修复与Linux双系统”的想法;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

鲁ICP备17018668号-1