說啓動過程以前,先說說一些背景知識。php
系統的啓動模式有BIOS和UEFI兩種,前者比較老,是一直在使用的方式,後者比較性,可是性能比較好,微軟知道win10才支持UEFI啓動方式。html
硬盤的分區格式也有GPT和MBR兩種,並且啓動模式和硬盤分區格式還有一些關係,具體以下:linux
1.BIOS模式可啓動GPT和MBR硬盤上的系統;shell
2.UEFI通常只能啓動GPT上的系統,雖然也支持MBR,可是不推薦這種方式,由於UEFI不會執行主分區記錄(無論它存在與否)而是執行ESP。並且要求硬盤必須是原生硬盤(不能是虛擬機),也就是說UEFI啓動方式不支持虛擬機。bootstrap
根據這種對應關係,因此咱們裝系統的時候就有3中選擇:windows
1.BIOS/MBR 這是最老的方案,幾乎支持全部的系統。在BIOS/MBR方案上,須要給引導器留一小塊位置,這一小塊位置叫作post-MBR gap,這是MBR分區方案下一塊處於512byte(MBR第一個扇區)以後,第一個分區開始以前的一段內存。這段內存推薦1到2M。可是爲了兼容windows的31k對齊,因此最好用一個支持1M對齊的的分區工具來作分區。app
2.BIOS/GPT 這是比較奇怪的方案,通常只有受限的狀況下才會使用(好比虛擬機中不支持UEFI,因此只能用這種方案)。在BIOS/GPT方案上,須要給引導器(好比GRUB)一個安放鏡像空間的位置,這一般是一個只要幾M的小空間,分區的格式是BIOS Boot,而且這個分區不能分配文件系統格式,也不能被掛載。另外這個分區不必定要在硬盤的開頭,能夠在任意位置,這點區分了它和post-MBR gap的區別。less
3.UEFI/GPT 這是比較推崇的方案。這種方式強制須要一個專門用以安裝UEFI應用的ESP分區(EFI System Partition),ESP分區只能是原生的物理硬盤,不能是LVM或者是RAID,這算是UEFI的缺點。ESP的文件系統格式支持vfat(通常都用FAT32)。工具
須要指出的是,BIOS不管採用各類硬盤分區方案,都會用到MBR。UEFI不管採用那種分區方案,也無論MBR存在不存在,都不會從MBR啓動任何代碼,UEFI從NVRAM中直接讀取相關配置,配置文件中以變量的形式保存了一些成爲啓動點(boot entry)的東西,經過boot entry,UEFI就知道從哪裏啓動相應的UEFI應用(the boot configuration is defined by variables stored in NVRAM, including variables that indicate the file system paths to OS loaders and OS kernels),若是是從磁盤啓動,那麼這些UEFI應用都是存放在磁盤的EFI System Partition(ESP)中的,能夠是 bootloaders, operating system kernels, and utility software等等。通常都是bootloader好比grub2.post
BIOS啓動過程:
UEFI啓動過程:
\EFI\BOOT\BOOTX64.EFI
(BOOTIA32.EFI
on systems with a IA32 (32-bit) UEFI). This is how UEFI bootable removable media work.
GRUB2
grub2是一個類unix操做系統中經常使用的啓動加載器,在常見的BIOS啓動模式中,它分爲三個部分。
stage 1:
負責stage 1 的代碼 boot.img 放在MBR中分區表後面,具體在434 到446 bytes之間,以機器碼的形式存在,因爲這塊區域實在過小了,放不下複雜的操做,也無法安裝文件系統驅動器,因此它不認識文件系統。stage 1 的任務就是加載stage1.5。
stage 1.5:
負責stage 1.5的代碼 core.img 一般位於住分區記錄(MBR)後到第一個分區前的被稱爲post-MBR gap的以小段區域內(MBR分區方案)或者一個專門的BIOS Boot分區內(GPT分區方案)。這段區域稍微大一點,因此它能夠安裝文件系統驅動器,也就能夠識別文件路徑,因此stage 2的相關文件能夠放到某個文件路徑下面了。stage 1.5的任務就是定位到stage 2階段的相關文件而且加載執行他們。
stage 2:
stage 2纔是真正執行功能的模塊,stage 2的代碼一般放在/boot 尤爲是 /boot/grub2中,文件系統能夠是standard EXT and other Linux filesystems, FAT, and NTFS等選擇。stage 2不像前兩個階段,它沒有鏡像鏡像文件,而是有不少個子文件夾,裏面包含了runtime kernel modules that are loaded as needed from the /boot/grub2/i386-pc directory。 stage 2 的任務就是加載操做系統內核進內存,而且把控制權交給操做系統,至此,grub的任務就完成了。
GRUB2在BIOS平臺上的常規啓動步驟是這樣的:BIOS --> boot.img[MBR] --> core.img[MBR gap/embedding area/BIOS Boot Partition] --> 設置"prefix root cmdpath"環境變量 --> 加載"normal.mod"模塊[同時還包括它所依賴的 terminal crypto extcmd boot gettext 模塊] --> 執行"normal $prefix/grub.cfg"命令
GRUB2在UEFI平臺上的常規啓動步驟是這樣的:UEFI --> core.img[BOOTX64.EFI/BOOTX86.EFI] --> 設置"prefix root cmdpath"環境變量 --> 加載"normal.mod"模塊[同時還包括它所依賴的 terminal crypto extcmd boot gettext 模塊] --> 執行"normal $prefix/grub.cfg"命令
grub有一些特殊的環境變量,其中最重要的三個是:
prefix:絕對路徑形式的'/boot/grub'目錄位置(也就是GRUB2的安裝目錄),例如'(hd0,gpt1)/grub'或'(hd0,msdos2)/boot/grub'。這是安裝grub時寫死在core.img中的。你只應該使用此變量,而不該該修改它,除非系統不能啓動了,你得在grub的rescue從新指定它。
cmdpath: 當前被加載的"core.img"所在目錄(絕對路徑)。例如:UEFI啓動多是'(hd0,gpt1)/EFI/UBUNTU'或'(cd0)/EFI/BOOT',BIOS啓動多是'(hd0)'。由GRUB2自動設置。你只應該使用此變量,而不該該修改它。
root: 設置"根設備"。任何未指定設備名的文件都視爲位於此設備。初始值由GRUB在啓動時根據"prefix"變量的值自動設置。在大多數狀況下,你都須要修改它。
參考: