1 基礎知識
1.1 引導程序(boot loader)
1.1.1 概念 [1]
引導裝載程序(英語:boot loader)是計算機開機自檢完成后裝載操作系統或者其他系統軟件的計算機程序。自檢完成后運行引導裝載程序,然后再加載並運行軟件。引導裝載程序可以從硬盤裝載到主內存中。
在MBR磁盤分區中引導程序位於主引導記錄(MBR)。但是隨着計算機操作系統越來越復雜,位於主引導記錄的空間已經放不下引導操作系統的代碼,於是就有了第二階段的引導程序,而MBR中代碼的功能也從直接引導操作系統變為了引導第二階段的引導程序。因此引導程序通常分為兩部分:第一階段引導程序位於主引導記錄(MBR),用以引導位於某個分區上的第二階段引導程序,如NTLDR、BOOTMGR和GNU GRUB等。
對於UEFI系統,由EFI應用程序(即EFI系統分區中的.efi文件)取代MBR和第二階段引導程序,UEFI固件會加載引導程序的.efi文件,再由引導程序加載操作系統。
1.1.2 BOOTMGR安裝
在MBR磁盤分區安裝Windows時,Windows會覆蓋MBR分區和其所在的分區。你沒有辦法保留之前MBR中對Linux引導程序的指向。
1.1.3 GRUB安裝
在MBR磁盤分區有兩種安裝GRUB的方法:兩種方法的啟動鏡像(即boot.img
,用於加載后續內容)都是放在MBR中的,GRUB的核心鏡像(即core.img
,GRUB的核心部分)可以將其嵌入MBR和第一個分區之間的區域(英文叫做“boot track”、 “MBR gap”或者“embedding area”,通常至少為31 KiB),也可以將其安裝在存放分區的第一個扇區中(VBR)[2],[3],[4]。
在BIOS/GPT啟動時,GRUB會被安裝在BIOS BOOT分區,參見[5]。
1.2 磁盤分區 [6]
1.2.1 主分區
實際上在早期的硬盤分區中並沒有主分區、擴展分區和邏輯分區的概念,每個分區的類型都是主分區。由於硬盤僅僅為分區表保留了64個字節的存儲空間,而每個分區的參數占據16個字節,故主引導扇區中總計只能存儲4個分區的數據。也就是說,一塊物理硬盤只能划分為4個邏輯磁盤。在具體的應用中,4個邏輯磁盤往往不能滿足實際需求。為了建立更多的邏輯磁盤供操作系統使用,引入了擴展分區和邏輯分區,並把原來的分區類型稱為主分區。
1.2.2 拓展分區
上面說了,4個分區顯然不能滿足需求,但是物理硬件限制只能有4個分區怎么辦呢?所以操作系統開始出馬了,把其中一個主分區命名為擴展分區,記住只是命名哦,原則上擴展分區和主分區是一樣的,只不過功能不同。下面說完邏輯分區,你就懂我在說什么了。
1.2.3 邏輯分區
4個分區肯定不夠,我想要20個分區,怎么辦呢?把其中一個主分區變成擴展分區,然后在這個擴展分區上進行切割,變成一個個D盤,E盤,F盤什么的,但是這些盤綜合起來就是一個擴展分區,這些盤是相互鏈接的,並不像主分區那樣,4個之間相互獨立互不干擾。邏輯分區用鏈表進行鏈接,如果E盤中的分區信息丟掉,操作系統就找不到F盤了。
1.2.4 啟動分區
存放操作系統文件的的分區,比如你裝了2個系統:Windows 7 + Linux那么你就2個啟動分區。裝的是Windows的話就看Windows
目錄(System32
目錄)存放在那個區,哪個區就是你的啟動分區,默認裝C盤,你也可以裝F盤等。裝的是Linux的話就看/
分區裝在哪,哪就是啟動分區。
1.2.5 系統分區
存放第二階段引導程序(如NTLDR、BOOTMGR和GNU GRUB等)的分區,Windows通常裝在C盤,Linux通常裝載/boot
分區
1.2.6 活動分區
活動分區是主分區,活動分區是系統分區,每次PC啟動時,一塊硬盤只能有一個活動分區,如果要啟動Windows就將Windows的系統分區設為活動分區,計算機就會去那里裝載引導程序(NTLDR、BOOTMGR和GRUB等)並執行,如果要啟動Linux就將Linux的系統分區設為活動分區。
注:系統分區就是保存各種引導文件的分區(也叫引導分區),啟動分區則是指保存Windows目錄的分區。系統分區和啟動分區可以在同一個分區,也可以不在同一個分區。
1.3 VBR(PBR)
VBR(也稱作PBR)是IBM個人計算機引入的一種啟動扇區。它可以在分區數據存儲設備(例如硬盤)或未分區設備(例如軟盤)上找到,並且包含用於引導存儲在計算機其他部分中的程序(通常但不一定是操作系統,例如GRUB、BOOTMGR等)的機器代碼。在非分區存儲設備上,它是設備的第一個扇區。在分區的設備上,它是設備上單個分區的第一個扇區,整個設備的第一個扇區是包含分區表的主啟動記錄(MBR)[7],[8]。
- MBR:主引導記錄位置在磁盤的第一個邏輯扇區,即LBA0的位置。一個邏輯扇區僅有512B(字節) ,MBR引導代碼占446B,MBR分區表占64B,最后的magic number占2B(即上述以0x55 0xAA結尾的標識符)。因為每個分區只有16B大小的分區表記錄,所以尋址最大只能到2.2TB,並且由於分區表總共只占64B,所以MBR分區表最多4個分區。上圖的綠色部分。
- PBR:即Partition Boot Record,對應主引導記錄,每個分區都存在引導記錄,位置在每個磁盤分區的開始部分,占用扇區不定。這個扇區一般保存着操作系統引導程序的所在位置。上圖的紅色部分。
- File System:操作系統對磁盤的所有操作都需要經過文件系統,刪除文件指的是在文件系統里刪除文件的索引條目,創建文件就是在在文件系統里添加索引條目並將具體數據寫入磁盤。常見的文件系統格式有:FAT、ext4、NTFS。文件系統位置一般在PBR之后。上圖黃色部分。
1.4 鏈式加載
ChainLoading的意思是用當前的啟動加載器去載入另一個啟動加載器,所以叫做鏈式加載[9]。
要被加載的另一個啟動加載器可能嵌入在一個有分區表的磁盤的頭部 (MBR),或在一個未分區磁盤或者一個分區的頭部 (VBR),也可能在使用 UEFI 的情形下是一個 EFI 可執行文件 [9]。
例如,GRUB可以通過鏈式加載的方法加載放在VBR中的BOOTMGR的引導程序進而運行BOOTMGR,也可以在UEFI模式下鏈式加載Windows和Linux的啟動加載器。
Invoking a VBR via a boot manager is known as chain loading. Some dual-boot systems, such as NTLDR (the boot loader for all releases of Microsoft's Windows NT-derived operating systems up to and including Windows XP and Windows Server 2003), take copies of the bootstrap code that individual operating systems install into a single partition's VBR and store them in disc files, loading the relevant VBR content from file after the boot loader has asked the user which operating system to bootstrap. In Windows Vista, Windows Server 2008 and newer versions, NTLDR was replaced; the boot-loader functionality is instead provided by two new components: WINLOAD.EXE and the Windows Boot Manager [7].
1.5 GRUB的兩種啟動方式
GRUB有兩種不同的引導方法。 兩者之一是直接加載操作系統,另一個是鏈式加載另一個引導加載程序,然后該引導加載程序將實際加載操作系統。 一般來說,前者是更理想的選擇,因為您無需安裝或維護其他引導加載程序,並且GRUB具有足夠的靈活性,可以從任意磁盤/分區加載操作系統。 但是,有時需要后者,因為GRUB本身並不支持所有現有的操作系統 [2]。
如上圖中,GRUB啟動加載器有兩個啟動項,Linux啟動項是直接加載操作系統的,而Windows啟動項使用鏈式加載方式加載VBR中的Windows啟動加載器(BOOTMGR或者NTLDR)。同時還需要注意,圖中的系統分區和啟動分區應該是位於同一分區的,因為啟動加載器和操作系統都在一個分區。
1.6 組合方式
一般來說,有如下兩種引導+磁盤分區表組合方式:LegacyBIOS+MBR和UEFI BIOS+GPT
Legacy BIOS無法識別GPT分區表格式,所以也就沒有LegacyBIOS+GPT組合方式;
UEFI BIOS可同時識別MBR分區和GPT分區,所以UEFI下,MBR和GPT磁盤都可用於啟動操作系統。不過由於微軟限制,UEFI下使用Windows安裝程序安裝操作系統是只能將系統安裝在GPT磁盤中。
注:UEFI引導MBR要開啟CSM模式百度百科。
2 BIOS引導流程[3],[10]
開機后,固化在ROM里的BIOS就會被加載到內存運行,BIOS自檢完畢以后加載COMS的參數,通過COMS的參數,BIOS程序加載啟動磁盤的MBR到內存里運行,運行MBR的引導代碼,這段代碼會查找活動分區DPT(BIOS不認識活動分區,但這段代碼認識活動分區)的位置,加載並執行活動分區的PBR(另一段引導程序),與MBR類似,PBR在運行后加載操作系統的引導程序到內存運行,例如Windows的BOOTMGR或Linux的GRUB。當引導程序運行后,操作系統內核就被加載運行,完成從BIOS程序中接手的引導流程,整體流程如下圖:
Windows的PBR認識FAT32和NTFS兩種分區,找到分區根目錄的bootmgr
文件,加載、執行bootmgr
。
bootmgr
沒了MBR和PBR的大小限制,可以做更多的事。它會加載並分析BCD啟動項存儲。而且bootmgr
可以跨越磁盤讀取文件了。所以無論你有幾個磁盤,你在多少塊磁盤上裝了Windows,一個電腦只需要一個bootmgr
就行了。bootmgr
會去加載某磁盤某NTFS分區的\Windows\System32\WinLoad.ex
e,后面啟動Windows的事就由WinLoad.exe
來完成了。
上圖中,啟動分區和系統分區是位於同一個磁盤的同一分區,因為bootmgr
和BCD
文件是位於的系統分區的文件,WinLoad.exe
是位於啟動分區的文件。啟動分區和系統分區也有可能位於同一分區也是可以在不同磁盤的不同分區或者是同一磁盤的不同分區。
上圖中的虛線就很好的說明了系統分區和啟動分區可能不是位於同一磁盤同一分區,因為兩個分區之前用虛線隔開了。
3 UEFI引導流程[10],[11]
UEFI的啟動要經過多個階段[12],[13],[14],本文主要對DXE這一階段進行介紹。
系統想要使用一個設備就必須要有對應的驅動。UEFI作為一個模糊了固件和操作系統界限的東西,作為一個設計之初就考慮到了擴展性的東西,它也是有驅動程序的。啟動過程中的DXE階段,全稱叫Driver eXecution Environment,就是加載驅動用的。
UEFI啟動后,進入了DXE階段,就開始加載設備驅動,然后UEFI就會有設備列表了。
對於其中的磁盤,UEFI會加載對應的驅動解析其中的分區表(GPT和MBR)。然后UEFI就會有所有分區的列表了。然后UEFI就會用內置的文件系統驅動,解析每個分區。然后UEFI就會認識分區里的文件。
在啟動操作系統的階段,根據設置的啟動項順序,轉到相應設備(僅限GPT設備,如果啟動傳統MBR設備,則需要打開CSM支持)的引導項,引導並進入操作系統。
啟動項分為兩種:
- 文件啟動項:大約記錄的是某個磁盤的某個分區的某個路徑下的某個文件。對於文件啟動項,固件會直接加載這個EFI文件,並執行。類似於DOS下你敲了個win.com就執行了Windows 3.2/95/98的啟動。文件不存在則失敗。
- 設備啟動項:大約記錄的就是“某個U盤”、“某個硬盤”。(此處只討論U盤、硬盤)對於設備啟動項,UEFI標准規定了默認的路徑
\EFI\Boot\bootX64.efi
。UEFI會加載磁盤上的這個文件。文件不存在則失敗。
作為UEFI標准里,欽定的文件系統,FAT32.efi是每個主板都會帶的。所有UEFI的主板都認識FAT32分區。這就是UEFI的Windows安裝盤為啥非得是FAT32的。
至於這個EFI文件會干嘛,主板是不管的。
但是隨着Windows 8.x,以及UEFI標准2.x,推出了一個叫做SecureBoot的功能。開了SecureBoot之后,主板會驗證即將加載的efi文件的簽名,如果開發者不是受信任的開發者,就會拒絕加載。
根據前文說的,UEFI啟動項分為文件啟動項和設備啟動項。
通常情況:主板UEFI初始化,然后找到了默認啟動項Windows Boot Manager。里面寫了bootmgfw.efi
的位置。固件加載bootmgfw.efi
。bootmgfw.efi
根據BCD
啟動項存儲,找到裝Windows的磁盤的具體分區,加載其中的WinLoad.efi
。由WinLoad.efi
完成剩下的啟動工作。
其中的虛線,跟上面的一樣,意思是,Windows啟動盤和EFI啟動盤,可以是一個硬盤,也可以是不同的硬盤。所以對於UEFI來說,啟動盤是bootmgfw.efi
所在的那個盤。
4 為Boot loader添加系統引導[15]
一般先安裝 Windows,后裝 Linux,因為GRUB能檢測到Window是的引導並自動配置好引導,反過來Windows比較霸道會覆蓋掉Linux的引導,可以通過重裝GRUB並生成配置grub.cfg
或者修改BCD添加Linux引導實現多重引導。
GRUB可以通過grub-mkconfig
或手動修改grub.cfg
文件添加Windows的引導。(推薦)
Bootmgr同樣可以通過EasyBCD
或者BOOTICE
等軟件修改BCD文件,添加GRUB引導,詳見[16]。(UEFI沒添加成功,不太推薦)
參考文獻
- 引導程序 - Wiki
- GNU GRUB Manual 2.04
- 聊聊 BIOS、UEFI、MBR、GPT、GRUB…… - 個人博客
- linux的/boot和grub和MBR和boot sector是什么關系? - js li的回答
- BIOS UEFI MBR GPT GRUB - 個人博客
- 從系統盤符選錯到認識硬盤的各種分區 - 博客園
- Volume boot record - Wiki
- Partition Boot Record (PBR)
- GRUB (簡體中文) - ArchWiki
- 科普貼:BIOS和UEFI的啟動項 - 知乎專欄
- 電腦基礎知識普及:BIOS、EFI與UEFI詳解! - 知乎專欄
- UEFI啟動流程 - 博客園
- (轉)UEFI系統的啟動過程 - CSDN
- 兩圖看懂BIOS和UEFI啟動過程 - 每日頭條
- 多操作系統安裝與引導原理(Windows、Deepin) - github.io
- 如何將Linux添加到新的Windows 8啟動管理器中?