開機載入器(bootloader)
開機故事裡有一道斷層:韌體知道如何啟動某個小東西,卻不知道你的核心在哪裡、它存在於哪個檔案系統上、或如何安排交接。開機載入器(bootloader)就是填補這道斷層的小程式——它唯一的任務就是找到作業系統核心、把它載入記憶體,然後啟動它。把它想成兩幕之間的舞台工作人員:韌體在它那一幕落下布幕,開機載入器悄悄把正確的道具就定位,然後為核心拉起布幕。
具體來說,開機載入器分成幾個階段執行,因為它一開始所處的環境非常受限。第一個極小的階段(小到能塞進開機磁區,或由 UEFI 載入)幾乎只做一件事:找到並載入較大的第二階段。第二階段(在 GRUB 中就是畫出選單的那部分)看得懂真正的檔案系統,因此能從一般的磁碟路徑讀取核心映像與 initramfs、列出已安裝作業系統的選單、套用你設定的開機選項、把核心載入記憶體、若是壓縮的就解壓縮、把 initramfs 放在它旁邊,最後跳到核心的進入點——並一併傳遞諸如 initramfs 的位置與命令列內容等資訊。跳轉之後,開機載入器的工作就結束了;直到下一次開機之前它都不會再執行。
它之所以重要,是因為開機載入器讓開機時的選擇與設定成為可能:Windows 與 Linux 雙系統、在新核心失敗時選用舊核心、或開機進入修復模式,全都在這裡發生——就在任何作業系統掌控機器之前。一個常見的誤解是把開機載入器當成作業系統的一部分;它是有自己程式碼的獨立程式,這正是為什麼壞掉的開機載入器會讓一個完好的作業系統無法開機,也是為什麼修復 GRUB 與重灌作業系統是兩件不同的事。
GRUB(GRand Unified Bootloader)給你一個選單:Ubuntu、Ubuntu(修復模式)、以及 Windows 開機管理員。你選了 Ubuntu;GRUB 從磁碟讀取 /boot/vmlinuz 與 /boot/initrd.img、把兩者載入記憶體、附上核心命令列(例如 root=/dev/sda2 quiet),然後跳入核心。那個選單與那次交接,就是 GRUB 的全部目的。
開機載入器找到、載入並啟動核心——然後退下舞台。
別把開機載入器和韌體搞混:韌體(BIOS/UEFI)在主機板晶片裡,是最先執行的;開機載入器是磁碟上的程式,由韌體選擇去執行它。UEFI 甚至能充當自己的開機管理員,模糊了界線,但載入核心的工作仍是開機載入器的職責。