科普贴:BIOS和UEFI的启动项
原⽂:
先插⼀句话,现在很多⼈⽤UEFI BIOS这个称呼。这⾥为了区分:
BIOS⼀律指传统BIOS,
UEFI BIOS⼀律称呼为UEFI。
UEFI下的BIOS设置,⼀律称为UEFI设置。
写这篇的原因
想直接看⼲货的跳过这节吧。
⼀直就想写这个,因为⾃⼰折腾Hackintosh。
最初BootThink,后来Chameleon,现在Clover。
每次接触新玩意,都要纠结好久的“安装”问题:
我这个磁盘默认BootThink启动,我想重装Windows,会覆盖引导,怎么办。
BootThink要求启动分区是NTFS,这是什么⿁要求?想换个Kext还得重启回Windows?
这个Chameleon太⽼了,我想换新版本,直接替换ISO么?
听说了个叫XPCBoot的东西,那是什么玩意?教程怎么只给了⼀个装Duet的⼯具?Efildr20这个⽂件在哪下载?
这个什么iBoot,听说⽤这个的Hackintosh能打开BootCamp助理?但我怎么启动到了⼀个类似于BIOS设置的地⽅?
我这个⽼华硕装了Clover怎么启动不了?⿊屏卡在那?屏幕只有⼀个6?
哇,这个⽼电脑平均⼀万次才能进Clover⼀次,怎么启动个Clover就要⼆⼗分钟?
新电脑⽀持了UEFI,终于能⽤Clover了!这个神马MBR、GPT是怎么回事?
教程⾥把Clover引导做在了U盘上,我怎么能摆脱优盘开机?
………………
直到我搞懂了Clover,直到我搞懂了UEFI,突然觉得:“哇!懂了原理之后,这些玩意⼀点都不难啊!”
嗯。上⾯是根因。
诱因是前⼏天有⼈问了我上⾯的加粗的那个问题。
其实这篇⽂章,也适合以下⽤户:
重装Windows,提⽰我什么MBR、GPT,不让装?
我想装个Linux,但我希望默认还是Windows。
我想重装Windows,可是我开机不再默认Grub,怎么回Linux?
“Windows⽆法定位现有分区,也⽆法。。。。。”
我电脑好⼏个磁盘,我把Windows装到了磁盘2上,怎么开机我在UEFI⾥选磁盘⼆开不开?
装Windows时候听说有个什么操作能装在VHD上?
那个什么EFI分区是⼲嘛的?
UEFI的启动U盘为啥⾮得FAT32?
不需要第三⽅⼯具就能做UEFI下的Windows安装盘?
以前我⼀直装Ghost版的Windows,UEFI之后真的没法Ghost了么?
我电脑是UEFI的,想装Linux,但我⼿头没优盘,听说也能搞定?
标题说是科普,可是我可能会习惯性的啰嗦技术细节。我尽量科普吧。
先说传统BIOS吧
⼀句话概括:BIOS只认识设备,不认识分区、不认识⽂件。
BIOS启动的时候,按照CMOS设置⾥的顺序,挨个存储设备看:(此处不讨论PXE和光盘)
这个存储设备的前512字节是不是以0x55 0xAA结尾?
不是,那就跳过。下⼀个设备。
是的话,嗯,这个磁盘可以启动,加载这512字节⾥的代码,然后执⾏。uefi boot
执⾏之后,后⾯的事,⼏乎就跟BIOS没啥关系了。
就是这样。
⾄于后⾯启动什么系统,取决于这512字节⾥存了谁家的代码。这个代码是各家的系统安装程序写进去的,⽬的是启动⾃家系统。
⽐如你装(或者重装)了Windows,这⾥⾯就变成了Windows的启动代码。
⽐如你装(或者重装)了Linux,这⾥⾯就会变成Grub的启动代码。
顺便这512字节包含了MBR分区表的信息。但是有⼈可能注意到,上⾯半句没提“系统装在哪个分区上了”,硬盘有⼏个分区。
其实BIOS并不认识分区表。哪怕磁盘上没有分区表,没分过区,只要前512字节有0x55 0xAA的结尾,有合适的引导代码,也是能启动的。
然后说UEFI
(此处只讨论民⽤64位架构下的UEFI。)
⼀句话概括,UEFI认识设备,还认识设备ROM,还认识分区表、认识⽂件系统以及⽂件。
UEFI启动的时候,经过⼀系列初始化(SEC、CAR、DXE什么的,SEC、CAR你们不需要懂。下⼀节⾥会说DXE阶段是⼲嘛的)
然后按照设置⾥的顺序,启动项。启动项分两种,设备启动项和⽂件启动项:
·⽂件启动项,⼤约记录的是某个磁盘的某个分区的某个路径下的某个⽂件。对于⽂件启动项,固件会直接加载这个EFI⽂件,并执⾏。类似于DOS下你敲了个win就执⾏了Windows 3.2/95/98的启动。⽂件不存在则失败。
·设备启动项,⼤约记录的就是“某个U盘”、“某个硬盘”。(此处只讨论U盘、硬盘)对于设备启动项,UEFI标准规定了默认的路
径“\EFI\Boot\bootX64.efi”。UEFI会加载磁盘上的这个⽂件。⽂件不存在则失败。
就是这样。
⾄于这个EFI⽂件会⼲嘛,主板是不管的。
但是随着Windows8.x,以及UEFI标准2.x,推出了⼀个叫做SecureBoot的功能。开了SecureBoot之后,主板会验证即将加载的efi⽂件的签名,如果开发者不是受信任的开发者,就会拒绝加载。
⽐如CloverX64.efi就好像没有签名。
UEFI的DXE与磁盘上的⽂件
⼀个磁盘分区,要格式化之后,才能往⾥存⽂件,格式化的时候,⼜能选择不同的⽂件系统。
⽐如Win10可以选FAT32、NTFS、exFAT、ReFS⼏种,Linux可以选ext2、ext3、ext4、FAT32等,macOS可以选FAT32、HFS+、APFS、exFAT⼏种。
其实每个操作系统,都会有⽂件系统驱动,然后才能读取某种⽂件系统。
⽐如Windows带了上述四种⽂件系统等驱动,Linux带了FAT32、ext等⽂件系统等驱动,macOS带了上述四种驱动以及NTFS等只读驱动。设备也是⼀样的。
原版的WinXP只带了IDE驱动,没有SATA驱动;原版Win7只带了IDE和SATA驱动,没带NVMe驱动;Win8/Win10则带了IDE/SATA和NVMe三种驱动;macOS10.12带了SATA驱动以及苹果专⽤NVMe磁盘的驱动;macOS10.13带了SATA和标准NVMe驱动。
UEFI作为⼀个模糊了固件和操作系统界限的东西,作为⼀个设计之初就考虑到了扩展性的东西,它也是有驱动程序的。启动过程中的DXE 阶段,全称叫Driver eXecution Environment,就是加载驱动⽤的。
⾸先各种PCI-E的设备,⽐如显卡,⽐如PCI-E的NVMe固态硬盘,都有固件。
其中⽀持UEFI的设备,⽐如10系列的Nvidia显卡,固件⾥就会有对应的UEFI的驱动。
题外话:浦科特的NVMe固态硬盘,UEFI版固件是没有那个丑丑丑的Logo的哦。那个丑丑丑丑的Logo是浦科特的BIOS版(Legacy版)固件。它被加载是因为主板默认为了兼容性,“StorageOptionROM”选项默认是Legacy的。改成UEFI,就见不到那个丑丑丑丑丑的浦科特Logo 页了。
UEFI启动后,进⼊了DXE阶段,就开始加载设备驱动,然后UEFI就会有设备列表了。
对于其中的磁盘,UEFI会加载对应的驱动解析其中的分区表(GPT和MBR)。然后UEFI就会有所有分区的列表了。然后UEFI就会⽤内置的⽂件系统驱动,解析每个分区。然后UEFI就会认识分区⾥的⽂件了。⽐如“\EFI\Boot\bootX64.efi”。
作为UEFI标准⾥,钦定的⽂件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区。这就是UEFI的Windows安装盘为啥⾮得是FAT32的。
除此之外,苹果的主板还会⽀持hfs分区。如果某天Linus Torvalds推出了主板,我猜这主板⼀定会带EXT4.efi,哈哈哈哈哈。
如同Windows可以安装驱动⼀样,UEFI也能在后期加载驱动。
⽐如CloverX64.efi启动之后,会加载\EFI\Clover\drivers64UEFI下的所有驱动。包括VboxHFS.efi等各种efi。⽹上你也能搜到NTFS.efi。
再⽐如,UEFIShell下,你可以⼿动执⾏命令加载驱动。
题外话:⼀个没收钱的“⼴告”,我真的好喜欢Paragon这个公司啊。推出了NTFS for Mac、HFS for Windows、ExtFS for……等⼀套⽂件系统驱动啊,我买了好⼏份。后来看到这公司还推出了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”下⾯。
⽐如Clover的东西,全都放在“\EFI\Clover”下⾯。
但是Apple⽐较特殊,它的主板直接去HFS/APFS分区启动⽂件。然⽽即便如此,Mac的ESP⾥还是会有⼀堆Apple的⽂件。
Macbook上的ESP分区⾥的“\EFI\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安装盘,该怎么做?
你划分俩分区,第⼀个分区格式化成FAT32,第⼆个分区HFS+。
苹果系统下把第⼆个分区做成安装盘。苹果启动盘做好了。
把Windows的ISO镜像⾥的⽂件拷贝到第⼀个分区。Windows安装盘做好了。
然后Clover拷贝到第⼀个分区的“\EFI\Clover”⽂件夹下。Clover的东西也做好了。
最后,怎么让这个U盘插到任何电脑上都默认启动Clover呢?答案是,把“\EFI\Boot”下的“bootX64.efi”换成Clover的就可以了。那个⽂件夹放谁家的efi⽂件,都要改名“bootX64.efi”哦。
嗯,这⼀节就写到这吧。
Windows 8/8.1/10在UEFI和BIOS下,各种启动⽂件的顺序
BIOS下:
MBR->PBR->bootmgr-&
按照前⽂说的,BIOS加载某个磁盘MBR的启动代码,这⾥特指Windows的引导代码,这段代码会查活动分区(BIOS不认识活动分区,但这段代码认识活动分区)的位置,加载并执⾏活动分区的PBR(另⼀段引导程序)。
Windows的PBR认识FAT32和NTFS两种分区,到分区根⽬录的bootmgr⽂件,加载、执⾏bootmgr。
bootmgr没了MBR和PBR的⼤⼩限制,可以做更多的事。它会加载并分析BCD启动项存储。⽽且bootmgr可以跨越磁盘读
取⽂件了。所以⽆论你有⼏个磁盘,你在多少块磁盘上装了Windows,⼀个电脑只需要⼀个bootmgr就⾏了。bootmgr会去加载某磁盘某NTFS分区
的“\Windows\”,后⾯启动Windows的事就由来完成了。
重点来了,为什么图中有两组虚线?
因为“启动磁盘”和“装系统的磁盘”可以是同⼀个磁盘,也可以不是同⼀个。“启动分区”和“系统分区”可以是不同磁盘的不同分区,也可以是相同磁盘的不同分区,也可以是同⼀个分区。
这就解释了,为什么,有的时候,Windows装在磁盘2上,却要在BIOS⾥选磁盘0启动了。
因为bootmgr可能在磁盘0上。
UEFI下:
UEFI固件->bootmgfw.efi->WinLoad.efi
根据前⽂说的,UEFI启动项分为⽂件启动项和设备启动项。
通常情况:主板UEFI初始化,然后到了默认启动项“Windows Boot Manager”。⾥⾯写了bootmgfw.efi的位置。固件加
载bootmgfw.efi。bootmgfw.efi根据BCD启动项存储,到装Windows的磁盘的具体分区,加载其中的WinLoad.efi。由WinLoad.efi完成剩下的启动⼯作。
其中的虚线,根上⾯的⼀样,意思是,Windows启动盘和EFI启动盘,可以是⼀个硬盘,也可以是不同的硬盘。所以对于UEFI来说,启动盘是bootmgfw.efi所在的那个盘。
回答⼀下上⾯列出的⼏个问题
以前我⼀直装Ghost版的Windows,UEFI之后真的没法Ghost了么?
先说⼀句,真不推荐⽤⽹上的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备份,还是挺好⽤的。
“Windows⽆法定位现有分区,也⽆法。。。。。”
这种报错信息,如果是在UEFI模式下,⼀般是因为,你有多块硬盘,⽽且超过⼀块硬盘上,有ESP分区。只要把不想⽤的ESP分区删掉,或者拔掉对应的硬盘,保证装Windows的时候,只有⼀个硬盘上有ESP分区,即可。
如果实在做不到,考虑⽤安装Windows吧。Win7的真的太弱了。尽量⽤Win10安装盘或者Win10PE⾥的。
不需要第三⽅⼯具就能做UEFI下的Windows安装盘?
确实啊,根据上⽂说的,U盘,格式化成FAT32,然后把Windows安装盘的ISO⾥⾯的东西拷贝到U盘就⾏了。(适⽤于Win8/8.1/10以及
WinServer2012/2012R2/2016。WinVista x64/Win7x64以及WinServer2008x64/2008R2需要额外操作,WinVista
x86/Win7x86/WinServer2008x86不⽀持UEFI)
打开这个Windows安装盘,这个ISO(截图的版本较⽼,⾃⾏忽略)
打开之后,是这四个⽂件夹、四个⽂件,拷贝到优盘。
我电脑是UEFI的,想装Linux,但我⼿头没优盘,听说也能搞定?
对啊对啊,搞个FAT32的分区,把Linux安装盘的iso镜像⾥⾯的⽂件拷贝进去,然后在Windows下,⽤⼯具给那个分区的BOOTx64.efi,添加为UEFI⽂件启动项,开机时候选那个启动项,就能启动到Linux安装盘了。下⾯⽰意图是Ubuntu的。记得查看⼀下你的Linux⽀不⽀持SecureBoot哦!如果你要装的Linux不⽀持SecureBoot,记得关掉主板的SecureBoot设置哦。
Ubuntu安装盘ISO镜像内的UEFI启动⽂件。
我想装个Linux,但我希望默认还是Windows。
我想重装Windows,可是我开机不再默认Grub,怎么回Linux?
如果是UEFI模式,那就跟之前⼀样,改启动项顺序就⾏了。
如果是传统BIOS的,要么⽤把MBR改成Windows的。要么⽤⼯具把MBR刷成Grub的。也可以考虑Linux下⽤dd命令备份MBR 的前446字节,到时候再还原回去。
重装Windows,提⽰我什么MBR、GPT,不让装?
这个就是Windows安装程序的限制了。BIOS模式下的Windows只允许被装在MBR分区表下⾯。UEFI模式下的Windows只允许被装在GPT 分区下。但事实上,MBR分区表,也能启动UEFI模式下的Windows。
嗯,就说到这吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论