GRUB 引導引導程式 20210209

2022-06-06 15:03:10 字數 2628 閱讀 7702

在系統啟動的第二步中,開始執行引導程式,那引導程式是**來的呢?引導程式是grub安裝到mbr中。

grub,乙個引導引導程式,屬於gnu專案。它是「多引導規範」的「參考實現」,可以使用者在安裝了多個作業系統的主機上選擇要啟動的系統,或者選擇特定的核心配置。

作業系統的核心通常儲存在檔案系統中的,但是bios並沒有檔案系統的概念,因此bios無法直接啟動核心。因此需要加入中間層,系統啟動的大概為 bios -> bootloader -> kernel。因此在基於bios的系統中,讀取檔案系統的檔案由 bootloader 負責。由引導引導程式載入核心到記憶體執行。這有兩種途徑:

**途徑一,直接讀取物理扇區**:不管用什麼檔案系統,資料在磁碟上還是資料。所以,只要找到儲存檔案的扇區,將扇區依照順序拼湊起來,即使不理解檔案系統,也能夠獲取到檔案。鑑於此,定義乙個「間接層」,該層儲存了核心所在的物理扇區,引導程式直接讀取這個間接層來獲取核心,這樣就可以了。但是,這也帶來了一些問題。核心檔案不能動,移動、碎片整理、更新核心都會導致物理扇區發生變化。一旦變化,就要重新更新」間接層「,同時可能還要更新mbr中的**(因為它要知道間接層的開始和結束位置)。這個方案不好。
**途徑二,理解檔案系統**:讓引導程式理解檔案系統,這樣就可以通過檔案路徑找到核心。這就要求引導程式中包含某些驅動程式,以識別檔案系統。這種方法減少了對物理扇區的依賴,並且在核心檔案發生修改之後,不需要更新引導程式。並且,由於可以理解檔案系統,引導程式的配置檔案可以儲存在檔案系統中。但是也存在一些缺點,這種途徑增加了引導引導程式的大小和複雜性。
我們使用的grub就是第二種途徑,通過理解底層的檔案系統。引導引導程式也被分成了多個階段,以適合mbr引導方案。目前grub由兩個版本,grub legacy(存在於舊的發行版中)與grub 2(從頭開始開發,意圖替換之前的版本)。目前grub 2已經在大多數linux發行版中使用。

在主引導記錄中,留給引導程式的空間只有434446位元組。對於簡單的引導程式,這個空間足夠了。對於相對複雜的引導,這個空間是遠遠不足的。因此複雜的引導程式只能被分為兩部分:一部分位於主引導記錄中,一部分位於其他位置。由主引導記錄中的引導程式載入另一部分引導程式。

該版本採用兩階段方法。包含在mbr中的是第一階段(或者包含乙個標準的mbr實現,然後從活動「分割槽的引導扇區」中載入第一階段)。由於大小的限制,第一階段只能從磁碟的固定位置載入幾個扇區,來載入下一階段的引導程式。

階段一可以直接載入階段二,但通常設定為載入「階段1.5」(位於mbr之後和第乙個分割槽之前的前30kib中)。 如果此空間不可用,則「階段1.5」的安裝將會失敗。「階段1.5」映象包含檔案系統驅動程式,使其能夠從檔案系統中的任何已知位置直接載入「階段二」,例如從/boot/grub載入檔案。然後,「階段二」將載入預設配置檔案和所需的任何其他模組(比如核心等等)。

第一步,在mbr的前440位元組,寫入了boot.img映象(或寫入分割槽的引導扇區中),通過64位的lba位址來定位diskboot.img映象,因此它可以從mbr的2 gib限制以上載入。實際的扇區號由grub-install寫入。

第二步,那麼diskboot.img是什麼呢?它是core.img(在grub legacy中stage 1.5的)的第乙個扇區,其唯一目的是載入core.img的其餘的部分。在 mbr 分割槽表中,第一扇區和第一分區之間由 1mib 的空隙,而core.img就存在與這個空隙中。由於處理器當前處於 real mode,此時記憶體上限為 1mib,因此只能載入 1mib 內容到記憶體中。

第三步,然後core.img進行32位 protected mode,自解壓,從grub-install配置的分割槽載入/boot/grub模組。如果你的grub找不到normal.mod模組,它就進入救援模式,顯示grub>提示符。可以從任何地方載入/boot/grub目錄,這取決與你是如何配置的。

第四步,載入normal.mod之後,它就可以讀取並解析/boot/grub/grub.cfg檔案,顯示選單。

第五步、使用者選擇選單項,根據使用者選擇將 kernel 與 initramfs 檔案載入到記憶體。

執行流程與bios + mbr類似,只是core.img儲存位置不同。在gpt中,由於分割槽不限於4個,因此core.img被寫入其自己的小型(1 mib)的、無檔案系統的「bios啟動分割槽」

# todo 指用uefi韌體的系統啟動

multiboot specification

comparison of boot loaders

4 best linux boot loaders

「grub」- 安裝

「grub」- 手動引導啟動

「grub」- 在bios系統上的grub引導

「kernel」- 核心(linux)

6 stages of linux boot process (startup sequence)

stages of linux booting process – explanation, step by step tutorial

hard disk [hdd] internal structure

wikipedia/gnu grub

wikipedia/bios boot partition

什麼是引導引導程式?

引導引導程式 boot loader 會引導作業系統。當機器引導它的作業系統時,bios 會讀取引導介質上最前面的 512 位元組 即人們所知的 主引導記錄 master boot record,mbr 在單一的 mbr 中只能儲存乙個作業系統的引導記錄,所以當需要多個作業系統時就會出現問題。所以需...

對Bootloader(引導引導程式)的幾點理解

1 在加電復位之後,大多數處理器都會從乙個預設的位址處獲取 比如mips結構的cpu會從0xbfc00000處取第一條指令,而arm結構的cpu則從位址0x00000000處取第一條指令。因此,在嵌入式開發板中,需要把儲存器件rom或flash等對映到這個預設的位址處,bootloader就存放在這...

恢復 Grub 引導

一般安裝 windows 和 linux 雙系統時都是先安裝 windows 再安裝 linux,然後利用 linux 自帶的多作業系統引導工具來製作引導選單。以 fedora 為例,安裝時會有 grub 的設定只要一直 next 就可以配置好 至少是能用的 但如果在使用中我們重新安裝了 windo...