先插一句话,现在很多人用UEFI BIOS这个称呼。这里为了区分:
写这篇的原因一直就想写这个,因为自己折腾Hackintosh。
直到我搞懂了Clover,直到我搞懂了UEFI,突然觉得:“哇!懂了原理之后,这些玩意一点都不难啊!” 嗯。上面是根因。 其实这篇文章,也适合以下用户:
标题说是科普,可是我可能会习惯性的啰嗦技术细节。我尽量科普吧。 先说传统BIOS吧一句话概括:BIOS只认识设备,不认识分区、不认识文件。 BIOS启动的时候,按照CMOS设置里的顺序,挨个存储设备看:(此处不讨论PXE和光盘) 就是这样。 至于后面启动什么系统,取决于这512字节里存了谁家的代码。这个代码是各家的系统安装程序写进去的,目的是启动自家系统。
顺便这512字节包含了MBR分区表的信息。但是有人可能注意到,上面半句没提“系统装在哪个分区上了”,硬盘有几个分区。 其实BIOS并不认识分区表。哪怕磁盘上没有分区表,没分过区,只要前512字节有0x55 0xAA的结尾,有合适的引导代码,也是能启动的。 然后说UEFI(此处只讨论民用64位架构下的UEFI。) 一句话概括,UEFI认识设备,还认识设备ROM,还认识分区表、认识文件系统以及文件。
就是这样。 至于这个EFI文件会干嘛,主板是不管的。 UEFI的DXE与磁盘上的文件一个磁盘分区,要格式化之后,才能往里存文件,格式化的时候,又能选择不同的文件系统。 其实每个操作系统,都会有文件系统驱动,然后才能读取某种文件系统。 UEFI作为一个模糊了固件和操作系统界限的东西,作为一个设计之初就考虑到了扩展性的东西,它也是有驱动程序的。启动过程中的DXE阶段,全称叫Driver eXecution Environment,就是加载驱动用的。 首先各种PCI-E的设备,比如显卡,比如PCI-E的NVMe固态硬盘,都有固件。 题外话:浦科特的NVMe固态硬盘,UEFI版固件是没有那个丑丑丑的Logo的哦。那个丑丑丑丑的Logo是浦科特的BIOS版(Legacy版)固件。它被加载是因为主板默认为了兼容性,“StorageOptionROM”选项默认是Legacy的。改成UEFI,就见不到那个丑丑丑丑丑的浦科特Logo页了。 UEFI启动后,进入了DXE阶段,就开始加载设备驱动,然后UEFI就会有设备列表了。 作为UEFI标准里,钦定的文件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区。这就是UEFI的Windows安装盘为啥非得是FAT32的。 如同Windows可以安装驱动一样,UEFI也能在后期加载驱动。
再插句嘴,Apple随着macOS10.13推出了APFS,很良心的放出了apfs.efi,广大Hackintosh用户的福音啊,把这玩意放进Clover里就能识别APFS分区里的HighSierra了! 说说EFI系统分区UEFI规范里,在GPT分区表的基础上,规定了一个EFI系统分区(EFI System Partition,ESP),ESP要格式化成FAT32,EFI启动文件要放在“\EFI\<厂商>”文件夹下面。 比如Windows的UEFI启动文件,都在“\EFI\Microsoft”下面。 但是Apple比较特殊,它的主板直接去HFS/APFS分区找启动文件。然而即便如此,Mac的ESP里还是会有一堆Apple的文件。 说正事,上面“写这篇文章的原因”里加粗的那个问题。 根据UEFI标准里说的,你可以把优盘里的“\EFI\Clover”文件夹,拷贝到硬盘里的ESP对应的路径下。然后把“\EFI\Clover\CloverX64.efi”添加为UEFI的文件启动项就行了。 Windows的BCD命令,其实也可以添加UEFI启动项,然而我没搞懂怎么弄。我更喜欢用EasyUEFI来搞这些操作。但是免费版的EasyUEFI不支持企业版Windows哦~某些Win10用户要被拒之门外了。 这一节的最后,再说说“\EFI\Boot”这个文件夹。这个文件夹,放谁家的程序都行。无论是“\EFI\Microsoft\Boot\Bootmgfw.efi”,还是“\EFI\Clover\CloverX64.efi”,只要放到“\EFI\Boot”下并且改名“bootX64.efi”,就能在没添加文件启动项的情况下,默认加载对应的系统。 举个例子:一个U盘,你想做成Windows安装盘+Hackintosh安装盘,该怎么做?
嗯,这一节就写到这吧。 Windows 8/8.1/10在UEFI和BIOS下,各种启动文件的顺序BIOS下: 按照前文说的,BIOS加载某个磁盘MBR的启动代码,这里特指Windows的引导代码,这段代码会查找活动分区(BIOS不认识活动分区,但这段代码认识活动分区)的位置,加载并执行活动分区的PBR(另一段引导程序)。 重点来了,为什么图中有两组虚线? 这就解释了,为什么,有的时候,Windows装在磁盘2上,却要在BIOS里选磁盘0启动了。 UEFI下: 根据前文说的,UEFI启动项分为文件启动项和设备启动项。 通常情况:主板UEFI初始化,然后找到了默认启动项“Windows Boot Manager”。里面写了bootmgfw.efi的位置。固件加载bootmgfw.efi。bootmgfw.efi根据BCD启动项存储,找到装Windows的磁盘的具体分区,加载其中的WinLoad.efi。由WinLoad.efi完成剩下的启动工作。 其中的虚线,根上面的一样,意思是,Windows启动盘和EFI启动盘,可以是一个硬盘,也可以是不同的硬盘。所以对于UEFI来说,启动盘是bootmgfw.efi所在的那个盘。 回答一下上面列出的几个问题
先说一句,真不推荐用网上的Ghost版Windows安装盘来装系统了。微软公开放出了官方的原版Win10下载链接,而且还有启动盘制作程序。链接在这:下载 Windows 10。写这个的原因,是因为,有时候,自己做的Ghost备份,还是挺好用的。 并不是不能Ghost了。但是传统的Ghost盘,都是只Clone了C盘,没有考虑到“UEFI下,启动盘是ESP分区,跟Windows不是同一个分区”的事。 其次,Ghost备份,并不能备份分区的GUID。还原之后,ESP分区里的BCD中记录的Windows在“某某GUID的分区上”,就可能找不到对应的GUID了。这时候,需要用bcdedit命令,或者BCDBoot命令,修改BCD存储。鉴于目前的Ghost盘,很少基于DOS了,如果是基于WinPE的,bcdedit命令和bcdboot命令都是已经内置了的。只要制作者在批处理文件里,在Ghost之后,调用bcdedit命令改一下bcd配置就行了。 而且,即使没Ghost备份ESP分区,你依然可以用bcdboot命令来生成ESP分区的内容。同样,在WinPE下,批处理文件里,Ghost还原之后,使用BCDBoot命令生成启动文件就行了。 总结一下,Ghost还原Windows分区之后,调用BCDBoot配置启动项即可。 再说一句,真不推荐用网上的Ghost版Windows安装盘来装系统了。微软公开放出了官方的原版Win10下载链接,而且还有启动盘制作程序。链接在这:下载 Windows 10。写这个的原因,是因为,有时候,自己做的Ghost备份,还是挺好用的。
这种报错信息,如果是在UEFI模式下,一般是因为,你有多块硬盘,而且超过一块硬盘上,有ESP分区。只要把不想用的ESP分区删掉,或者拔掉对应的硬盘,保证装Windows的时候,只有一个硬盘上有ESP分区,即可。 如果实在做不到,考虑用DISM.exe安装Windows吧。Win7的DISM.exe真的太弱了。尽量用Win10安装盘或者Win10PE里的DISM.exe。
确实啊,根据上文说的,U盘,格式化成FAT32,然后把Windows安装盘的ISO里面的东西拷贝到U盘就行了。(适用于Win8/8.1/10以及WinServer2012/2012R2/2016。WinVista x64/Win7x64以及WinServer2008x64/2008R2需要额外操作,WinVista x86/Win7x86/WinServer2008x86不支持UEFI)
对啊对啊,搞个FAT32的分区,把Linux安装盘的iso镜像里面的文件拷贝进去,然后在Windows下,用工具给那个分区的BOOTx64.efi,添加为UEFI文件启动项,开机时候选那个启动项,就能启动到Linux安装盘了。下面示意图是Ubuntu的。记得查看一下你的Linux支不支持SecureBoot哦!如果你要装的Linux不支持SecureBoot,记得关掉主板的SecureBoot设置哦。
如果是UEFI模式,那就跟之前一样,改启动项顺序就行了。 如果是传统BIOS的,要么用bootsect.exe把MBR改成Windows的。要么用工具把MBR刷成Grub的。也可以考虑Linux下用dd命令备份MBR的前446字节,到时候再还原回去。
这个就是Windows安装程序的限制了。BIOS模式下的Windows只允许被装在MBR分区表下面。UEFI模式下的Windows只允许被装在GPT分区下。但事实上,MBR分区表,也能启动UEFI模式下的Windows。 嗯,就说到这吧。 |
|