原文:
https://zhuanlan.zhihu.com/p/31365115
先插一句話,現在很多人用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字節里的代碼,然后執行。
執行之后,后面的事,幾乎就跟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.com就執行了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->WinLoad.exe
按照前文說的,BIOS加載某個磁盤MBR的啟動代碼,這里特指Windows的引導代碼,這段代碼會查找活動分區(BIOS不認識活動分區,但這段代碼認識活動分區)的位置,加載並執行活動分區的PBR(另一段引導程序)。
Windows的PBR認識FAT32和NTFS兩種分區,找到分區根目錄的bootmgr文件,加載、執行bootmgr。
bootmgr沒了MBR和PBR的大小限制,可以做更多的事。它會加載並分析BCD啟動項存儲。而且bootmgr可以跨越磁盤讀取文件了。所以無論你有幾個磁盤,你在多少塊磁盤上裝了Windows,一個電腦只需要一個bootmgr就行了。bootmgr會去加載某磁盤某NTFS分區的“\Windows\System32\WinLoad.exe”,后面啟動Windows的事就由WinLoad.exe來完成了。
重點來了,為什么圖中有兩組虛線?
因為“啟動磁盤”和“裝系統的磁盤”可以是同一個磁盤,也可以不是同一個。“啟動分區”和“系統分區”可以是不同磁盤的不同分區,也可以是相同磁盤的不同分區,也可以是同一個分區。
這就解釋了,為什么,有的時候,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分區,即可。
如果實在做不到,考慮用DISM.exe安裝Windows吧。Win7的DISM.exe真的太弱了。盡量用Win10安裝盤或者Win10PE里的DISM.exe。
不需要第三方工具就能做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的,要么用bootsect.exe把MBR改成Windows的。要么用工具把MBR刷成Grub的。也可以考慮Linux下用dd命令備份MBR的前446字節,到時候再還原回去。
重裝Windows,提示我什么MBR、GPT,不讓裝?
這個就是Windows安裝程序的限制了。BIOS模式下的Windows只允許被裝在MBR分區表下面。UEFI模式下的Windows只允許被裝在GPT分區下。但事實上,MBR分區表,也能啟動UEFI模式下的Windows。
嗯,就說到這吧。
科普貼:BIOS和UEFI的啟動項 - 王詩嶢的文章 - 知乎 https://zhuanlan.zhihu.com/p/31365115
————————————————
版權聲明:本文為CSDN博主「黎明」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44702017/article/details/104193134