
我使用的是 CentOS 7,並已為其連接了多個磁碟。我知道我的作業系統、核心、initramfs 等位於“/dev/sda”,這是可啟動磁碟。但 grub2 是如何推論出這一點的呢?它會一一檢查所有連接的磁碟嗎?
答案1
從技術上講:Linux 找不到任何可啟動磁碟,因為當 Linux 運行時,引導程式已完成其工作 - 即:
- 將 Linux 從檔案複製到 RAM 中的某處
- 將 initramfs 從檔案複製到 RAM 某處
- 在某些架構(例如 ARM)上 - 將裝置樹或架構描述符等其他內容複製到 RAM 中的某處
- 將控制權傳遞給 RAM 中複製 Linux 的第一個位置,現在引導程式不再活動。
現代 UEFI 韌體以及非 x86 平台上的東西(如 U-Boot)將在韌體中存儲“啟動條目” - 啟動條目包含存儲設備和文件名,固件將按順序運行並加載/運行它找到的第一個文件。您可以透過進入 UEFI 設定並進行更改,或使用作業系統中的實用程式來更改 UEFI NVRAM 設定來更改順序。
現在 x86 上的 UEFI 的特點是它會將單個二進位檔案載入到 RAM 中,但通常 Linux 也至少需要一個 initramfs 來啟動(儘管這不是 Linux 的嚴格要求)。
歷史上 x86 也有更原始的韌體 (BIOS),它只是從儲存裝置載入第一個磁區(順序由 BIOS 設定決定),甚至不嘗試尋找/載入檔案。
因此,這就是為什麼在大多數Linux 系統上,UEFI 實際加載的東西(即服從啟動順序/搜尋可啟動設備的東西)是GRUB - 它是Linux(以及其他作業系統,如果需要)的通用引導程序平台,實際上會執行此操作很多預先啟動的東西應該存在於韌體中,但由於各種原因而不存在,並且還為您提供了在載入作業系統之前執行操作的環境。
安裝 Linux 時,安裝程式將透過產生 GRUB 可以存取的設定檔來設定 GRUB,並將在 GRUB 選單中新增項目,告訴 GRUB 去哪裡載入核心和 initramfs。多個條目是可能的,甚至很常見 - 例如 Debian 將為救援核心安裝第二個選單項目 - 大致相當於 Windows 安全模式。但這些都是在安裝 Linux 時由安裝程式設定的,並且在 UEFI 完成其工作後您將看到這些選項。
(順便說一句,我喜歡 U-Boot 的原因之一是它會直接載入核心和 initramfs,因此根本不需要 GRUB。但那是具有可自訂韌體的 ARM 裝置)。
Windows 有自己的“GRUB”,winload.exe
可執行 Windows 所需的操作,並且可以選擇在啟動之前提供預啟動功能表選項,而韌體也不會執行此操作。您可以bcdedit
在那裡更改選單選項。比 Vista 更早的 Windows 版本使用 NTLDR,並且可以使用 C:\boot.ini 檔案 IIRC 進行設定。
Linux 不需要 GRUB - 很長一段時間以來,使用了一種稱為 LILO(Linux Loader)的更簡單的引導程序,並且某些發行版可能仍在使用它。