Grub

BIOS 引導載入程序如何知道要使用哪個磁碟?

  • July 27, 2019

據我了解,BIOS 系統上的 GRUB 引導載入程序(以及大多數其他引導載入程序)由 3 個部分組成。第一部分(階段 1)儲存在第一個448字節中,它負責將控制權傳遞給所謂的階段 1.5,它位於記憶體中稍晚一點的位置。這個階段最終從 /boot 文件夾載入階段 2,並將控制權轉移給它。

階段 1 如何知道階段 1.5 駐留在哪個磁碟上?一旦階段 1 中的程式碼開始執行,它就無法知道它是從哪個磁碟載入的(除非此資訊以某種方式傳遞到階段 1 或者 BIOS 本身也將階段 1.5 載入到記憶體中?)

同樣,對於階段 1.5 到階段 2,階段 1.5 如何知道 /boot 目錄駐留在哪個磁碟(和哪個分區)上?

如果您查看 GRUB 的來源,可在此處找到,您會發現 stage1 實際上定義在grub/grub-core/boot/i386/pc/boot.S.

如果已配置,它可以執行磁片引導。它確實從配置的硬碟啟動,並且它需要知道它必須從哪個 C/H/S 載入 stage1.5。它唯一的自動功能是確定從哪個驅動器載入引導扇區,如果沒有另外配置的話。在將控制權傳遞給 stage1 之前,功能性 BIOS 會將該值載入到 DL 中。有些不這樣做,grub 會退回到第一個硬碟。

stage1.5 已經能夠理解分區和文件系統,因此它不再依賴 C/H/S 值。它載入的驅動器仍然與上面相同。

第一部分(階段 1)儲存在前 448 個字節中,負責將控制權傳遞給所謂的階段 1.5,它位於記憶體中稍晚一點的位置。這個階段最終從 /boot 文件夾載入階段 2,並將控制權轉移給它。

名稱“stage1”、“stage1.5”和“stage2”屬於 GRUB Legacy,即 GRUB 版本 0.xx。當階段 1 寫入 MBR(或 PBR)時,安裝程序還將在其中寫入下一階段開始所在的實際磁碟塊號。下一階段的第一個塊將包含更多程式碼,以及描述該階段其餘部分所在位置的*塊列表。*阻止列表條目的形式為“從磁碟塊 #Y 開始載入 X 塊”。如果下一階段作為連續(非分段)文件寫入磁碟,則通常只需要一個阻止列表條目。

stage1.5 實際上是可選的:完全有可能根本不安裝 stage1.5,而只是讓 stage1 直接載入 stage2。階段 1.5 將包含足夠的程式碼來理解單個文件系統類型;stage2 將包含所有受支持的文件系統驅動程序,這將使其更大。這樣,stage1.5 可以嵌入到 MBR 和第一個分區開頭之間的通常未使用的空間中。

(現代的 MBR 分區磁碟現在從第一個磁碟的開頭正好 1 MiB 開始第一個分區,即在塊 #2048,以允許大型儲存系統的最佳數據對齊。這在 MBR 之間留下了更多未使用的空間並且第一個分區的開頭比舊約定在 C/H/S 0/1/1 開始第一個分區。)

stage1.5 和 stage2 都有一個預先分配的空間,供安裝程序寫入 GRUB 磁碟標識符和路徑名。對於 stage1.5,這將辨識實際 stage2 所在的分區和文件名;在 stage2 的情況下,它將辨識 GRUB 配置文件的位置。

與 BIOS 兼容的 GNU GRUB(即 GRUB 版本 1.xx 及更高版本)完全跳過 stage1.5,並使用不同的名稱:

  • 過去stage1是現在boot.img
  • 過去stage2是現在core.img

boot.img仍然是嵌入到 MBR 中的 448 字節,但是core.img在 GRUB 安裝時從kernel.img一組 GRUB 模組動態建構。

我可以看到這些資訊被硬編碼到 1.5 階段,但是這如何處理以不同順序安裝的驅動器(保證 (hd0) 和 (hd1) 將始終是同一個驅動器,所以硬編碼類似的東西似乎是一個脆弱的策略。

事實上的標準 BIOS 約定是,從 BIOS 中選擇的任何磁碟作為要啟動的磁碟都將被分配 ID 0x80 用於 BIOS 磁碟訪問功能,並且該 ID 將直接映射到 GRUB (hd0)。(古老的 MS-DOS 同樣總是將 BIOS 磁碟 ID 0x80 映射到驅動器C:。)

幸運的是,BIOS 在列舉不同磁碟控制器的方式上通常非常確定。因此,只要硬體配置和 BIOS 設置保持不變,磁碟檢測順序就會從一次引導到下一次保持不變。

但是,是的,這絕對是一個脆弱的策略。不幸的是,沒有普遍的標準方法可以將 BIOS 的磁碟檢測資訊從 16 位 BIOS 常式傳遞到使用 32 位保護模式程式(甚至 64 位)的作業系統。因此,在從基於 BIOS 的引導載入程序切換到完整的 32 位或 64 位模式後,所有 32 位或更好的作業系統都將從頭重新檢測其磁碟。

是的,BIOS 增強磁碟驅動器服務(簡稱 EDD)包括一個 BIOS 擴展,可用於向受保護模式的作業系統報告 BIOS 磁碟檢測的基本細節……但該擴展引入的時間相當晚,並且報告部分是可選的,因此它的可用性遠不能保證。

在具有多個磁碟控制器的基於 BIOS 的系統上,這基本上是一個令人頭疼的問題。

獲勝的策略通常是在第一次遇到特定的硬體型號時徹底測試 BIOS 引導設置(可能會嘗試多次安裝作業系統),一旦找到好的配置,就將其寫下來不要碰 BIOS之後的啟動設置

現代 GNU GRUB 包括search可用於通過標籤、UUID 和/或特定文件的存在來選擇磁碟分區的命令。在現代生成的grub-mkconfigGRUB 2.xx 配置文件中,固定標識符通常應該是最後的選擇,僅在早期search命令失敗時使用。

GPT 分區表包括每個磁碟和分區的唯一 UUID 作為標準,UEFI NVRAM 變數實際上使用 ESP 的分區 UUID + ESP 分區內的引導載入程序的路徑名指定引導載入程序的位置。這允許更健壯的配置。執行中的作業系統還有一個標準介面,可以從 UEFI 韌體讀取引導資訊,並在需要時修改引導設置。

引用自:https://unix.stackexchange.com/questions/532422