GRUB (Grand Unified Bootloader) 包含兩個階段。第一個階段包含 512 個位元組,而且唯一工作是將載入開機載入器的第二階段。接下來,會載入 stage2。這個階段會包含開機載入器的主要部分。
某些組態會使用中繼階段 1.5,用來配置和載入適當檔案系統的階段 2。在適當情況下,這種方法在安裝或使用 YaST 初始設定 GRUB 時會是預設選項。
stage2 可以存取許多檔案系統。目前支援 Ext2、Ext3、ReiserFS、Minix 和 Winodws 使用的 DOS FAT 檔案系統。對於 、XFS、UFS 以及 BSD 使用的 FFS,也支援到一定的程度。自 0.95 版開始,GRUB 也可以從包含符合 El Torito
規格的 ISO 9660 標準檔案系統的 CD 或 DVD 啟動。即使在系統啟動之前,GRUB 可以存取支援的 BIOS 磁碟機 (BIOS 偵測到的磁片或硬碟、CD 光碟機和 DVD 磁碟機) 的系統。因此,對 GRUB 組態檔 (menu.lst) 所做的變更,將不再需要重新安裝開機管理員。啟動系統後,GRUB 會重新載入功能表檔案以及核心或起始 RAM 磁碟 (initrd) 的有效路徑和分割區資料,然後找這些檔案。
GRUB 的實際組態是以下列敘述的三個檔案為基礎:
此檔案包含可以使用 GRUB 啟動的分割區或作業系統,所有的相關資訊。如果沒有這段資訊,GRUB 指令行就會提示使用者提供如何繼續執行 (如需詳細資訊,請參閱在開機程序期間編輯功能表項目)。
此檔案會從 GRUB 和 BIOS 表示法,將設備名稱轉譯成 Linux 設備名稱。
此檔案包含 GRUB 外圍程序正確安裝開機載入器時需要的指令、參數和選項。
有多種方法可以控制 GRUB。現有組態啟動項目,可以從圖形功能表選取 (開頭顯示畫面)。組態會從檔案 menu.lst 載入。
在 GRUB,啟動前可以變更所有啟動參數。例如,編輯功能表檔案發生的錯誤,可以用此方法更正。開機指令也可透過輸入提示輸入 (請參閱在開機程序期間編輯功能表項目)。GRUB 提供開機前,判斷核心和 initrd 二者位置的可能性。以此方法,您還可以為開機載入器組態中不存在的項目,啟動安裝的作業系統。
GRUB 事實上有兩個版本:一個是開機載入器,一個是位於 /usr/sbin/grub 的一般 Linux 程式。此程式稱為 GRUB 外圍程序。它可以在安裝系統中提供 GRUB 模擬功能,並可用來安裝 GRUB 或是在套用之前測試設定。將 GRUB 安裝成硬碟或磁片上的開機載入器,這種功能是以指令 install 和 setup 的形式,整合於 GRUB。Linux 載入時,可以在 GRUB 外圍程序使用此指令。
檔案 device.map 會將 GRUB 和 BIOS 設備名稱對應至 Linux 設備名稱。在包含 IDE 和 SCSI 硬碟的混合系統中,GRUB 必須透過特定程序來判斷開機順序,因為 GRUB 可能不會存取 BIOS 的開機順序資訊。GRUB 儲存分析的結果至檔案 /boot/grub/device.map。在 BIOS 中的開機順序設定成 IDE 在 SCSI 前面的系統,檔案 device.map 會顯示如下:
(fd0) /dev/fd0 (hd0) /dev/hda (hd1) /dev/sda
因為 IDE、SCSI 和其他硬碟的順序取決於各種因素,而且 Linux 無法識別對應,所以檔案 device.map 可以手動設定。如果您在啟動時發生問題,檢查此檔案中的順序是否對應至 BIOS 的順序,然後在需要時使用 GRUB 提示來暫時修改它。啟動 Linux 系統之後,檔案 device.map 可以透過 YaST 開機載入器或其他選擇的編輯器,永久性編輯。
重要: SATA 磁碟
根據控制器的差異,SATA 磁碟可以識別成 IDE (/dev/hdx) 或 SCSI (/dev/sdx) 設備。
在手動變更檔案 device.map 之後,執行以下指令來重新安裝 GRUB。此指令會造成檔案 device.map 重新載入,並以 grub.conf 列示的指令執行:
grub --batch < /etc/grub.conf
除了 menu.lst 和 device.map 之外,第三個重要的 GRUB 組態檔是 /etc/grub.conf。此檔案包含 GRUB 外圍程序正確安裝開機載入器時需要的指令、參數和選項:
root (hd0,4) install /grub/stage1 (hd0,3) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst quit
下面介紹個別項目的意義:
此指令告訴 GRUB 將以下指令套用至第一個硬碟的第一個邏輯分割區 (開機檔案的位置)。
指令 grub 應該與參數 install 一起執行。開機載入器的 stage1 應該安裝在擴充分割區容器 (/grub/stage1 (hd0,3))。這是稍微有點深奧的組態,但已知在許多情況下都有效。stage2 應該載入到記憶體位址 0x8000 (/grub/stage2 0x8000)。最後項目 ((hd0,4)/grub/menu.lst) 告訴 GRUB 到什麼地方尋找功能表檔案。
即使作業系統啟動之前,GRUB 也可以存取檔案系統。沒有 root 許可權的使用者,在此時可以存取 Linux 系統中的檔案 (這些檔案在系統啟動後,他們並無法存取)。若要封鎖此類型的存取、或者防止使用者啟動特定作業系統,請設定開機密碼。
重要: 開機密碼和開頭顯示畫面
如果您在 GRUB 使用啟動密碼,將不會顯示一般的開頭顯示畫面。
按照以下方式,以使用者 root 的身份設定開機密碼:
在 root 提示下,使用 grub-md5-crypt 將密碼加密:
# grub-md5-crypt Password: **** Retype password: **** Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
將加密字串貼到檔案 menu.lst 的全域區段:
gfxmenu (hd0,4)/message
color white/blue black/light-gray
default 0
timeout 8
password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
現在 GRUB 指令只可以在按 P 並輸入密碼後的啟動提示時執行。不過,使用者仍然可以從開機功能表,啟動所有作業系統。
要防止一或多個作業系統從開機功能表啟動,將項目 lock 新增至沒有密碼便不可以啟動的 menu.lst 每一個段落。例如:
title linux
kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791
initrd (hd0,4)/initrd
lock
重新啟動系統並從開機功能表選取 Linux 之後,將會顯示以下錯誤訊息:
Error 32: Must be authenticated
按 Enter 進入功能表。然後按 P,進入密碼提示要求。輸入密碼並按 Enter 之後,應該就可啟動選取的作業系統 (本範例為 Linux)。