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 的實際組態是以下列敘述的三個檔案為基礎:
/boot/grub/menu.lst
此檔案包含可以使用 GRUB 啟動的分割區或作業系統,所有的相關資訊。如果沒有這段資訊,GRUB 指令行就會提示使用者提供如何繼續執行 (如需詳細資訊,請參閱第 21.2.1.3 節「在開機程序期間編輯功能表項目」)。
/boot/grub/device.map
此檔案會從 GRUB 和 BIOS 表示法,將設備名稱轉譯成 Linux 設備名稱。
/etc/grub.conf
此檔案包含 GRUB 外圍程序正確安裝開機載入程式時需要的指令、參數和選項。
有多種方法可以控制 GRUB。現有組態啟動項目,可以從圖形功能表選取 (開頭顯示畫面)。組態會從檔案 menu.lst
載入。
在 GRUB,啟動前可以變更所有啟動參數。例如,編輯功能表檔案發生的錯誤,可以用此方法更正。開機指令也可透過輸入提示輸入 (請參閱第 21.2.1.3 節「在開機程序期間編輯功能表項目」)。GRUB 提供開機前,判斷核心和 initrd
二者位置的可能性。以此方法,您還可以為開機載入程式組態中不存在的項目,啟動安裝的作業系統。
GRUB 事實上有兩個版本:一個是開機載入程式,一個是位於 /usr/sbin/grub
的一般 Linux 程式。此程式稱為 GRUB 外圍程序。它可以在安裝系統中提供 GRUB 模擬功能,並可用來安裝 GRUB 或是在套用之前測試設定。將 GRUB 安裝成硬碟或磁片上的開機載入程式,這種功能是以指令 install 和 setup 的形式,整合於 GRUB。Linux 載入時,可以在 GRUB 外圍程序使用此指令。
圖形開頭顯示畫面以及開機功能表是以 GRUB 組態檔 /boot/grub/menu.lst
為基礎的,它包含可以透過功能表啟動的所有分割區或作業系統,全部的相關資訊。
每次啟動系統時,GRUB 會從檔案系統載入功能表檔案。基於此因素,GRUB 不需要在每次變更檔案後,重新安裝。使用 YaST 開機載入程式來修改 GRUB 組態,如第 21.3 節「使用 YaST 設定開機載入程式」所述一般。
功能表檔案包含指令。語法相當簡單。每一行包含一個指令,後面是由像外圍程序中的空格所分開的選用參數。基於歷史因素,部份指令可以允許 =
放在第一個參數前面。註解是以井字號 (#
) 開頭。
若要識別功能表綜覽中的功能表項目,請為每一個項目設定 title
。關鍵字 title
後面的文字 (包括任何空格) 將在功能表中顯示成可選取的選項。當這個功能表項目被選取時,就會執行下一個 title
指示的所有指令。
最簡單的案例是重新導向至其他作業系統的開機載入程式。指令是 chainloader
及引數通常是 GRUB 區塊表示法中,其他分割區的啟動區塊。例如:
chainloader (hd0,3)+1
GRUB 中的設備名稱會在第 21.2.1.1 節「硬碟和分割區的命名慣例」說明。這個範例會指定第一個硬碟中,第四個分割區的第一個區塊。
使用指令 kernel
來指定核心影像。第一個引數是分割區中,核心影像的路徑。其他引數會傳送到指令行上的核心。
如果核心沒有內建驅動程式來存取根分割區、或是這時是使用包含進階 HotPlug 功能的最新 Linux 系統,initrd
就必須以個別的 GRUB 指令來指定,它唯一的引數是 initrd
檔案路徑。因為 initrd
的載入位址是記錄於載入的核心影像,所以指令 initrd
必須立即接在 kernel
指令的後面。
指令 root
會簡化核心和 initrd 檔案的指定。root
的唯一引數是設備或分割區。這個設備會用於所有一直到下一個 root
指令指定時才會出現明確指定設備的所有核心、initrd
或其他檔案路徑。
boot
指令會在每一個功能表項目最後暗示,所以它不需要寫入功能表檔案。不過,如果您使用互動式 GRUB 來啟動,必須在最後輸入 boot
指令。指令本身沒有引數。它只是啟動載入的核心影像或指定的鏈結載入器。
撰寫所有功能表項目之後,將其中一個定義為 default
項目。否則,會使用第一個 (項目 0
) 做為預設項目。您也可以指定預設項目要在幾秒後啟動。timeout
和 default
通常在功能表項目前面。如需參考範例,請參閱第 21.2.1.2 節「功能表檔案範例」。
GRUB 用於硬碟和分割區的命名慣例與用於一般 Linux 設備的命名慣例不同。它比較類似 BIOS 的簡易磁碟列舉方式,而且語法類似一些 BSD 衍生版本中所用的語法。在 GRUB,分割區的編號會從 0 開始。這表示 (hd0,0
) 是第一個硬碟的第一個分割區。與一般桌上型機器的 primary master 硬碟對應的 Linux 設備名稱是 /dev/hda1
。
四個可能的主要分割區會指定分割區編號 0
到 3
。邏輯分割區是從 4
開始編號:
(hd0,0) first primary partition of the first hard disk (hd0,1) second primary partition (hd0,2) third primary partition (hd0,3) fourth primary partition (usually an extended partition) (hd0,4) first logical partition (hd0,5) second logical partition
由於獨立於 BIOS 設備,GRUB 不會區分 IDE、SATA、SCSI 和硬體 RAID 設備。BIOS 或其他控制器識別的所有硬碟,會按照 BIOS 的開機順序編號。
可惜的是,它通常無法將 Linux 設備名稱正確對應至 BIOS 設備名稱。它會透過演算法的協助來產生此對應,然後儲存至檔案 device.map
,需要時可以編輯它。如需關於檔案 device.map
的資訊,請參閱第 21.2.2 節「檔案 device.map」。
完整 GRUB 路徑包含放在括號中的設備名稱,以及指定分割區中檔案系統的檔案路徑。路徑開頭是一個斜線。例如,如果系統有一個 IDE 硬碟,它的第一個分割區包含 Linux,則可以使用下列方式設定可開機核心:
(hd0,0)/boot/vmlinuz
以下範例顯示 GRUB 功能表檔案的結構。這個範例安裝會在 /dev/hda5
下安裝 Linux 啟動分割區、在 /dev/hda7
下安裝根分割區,以及在 /dev/hda1
下進行 Windows 安裝。
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 title linux kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 initrd (hd0,4)/initrd title windows chainloader(hd0,0)+1 title floppy chainloader(fd0)+1 title failsafe kernel (hd0,4)/vmlinuz.shipped root=/dev/hda7 ide=nodma \ apm=off acpi=off vga=normal nosmp maxcpus=0 3 initrd (hd0,4)/initrd.shipped
第一個區塊定義開頭顯示畫面的組態:
背景影像 message
位於 /dev/hda5
分割區的最上層目錄。
顏色配置:白色 (前景)、藍色 (背景),黑色 (選擇項目),以及淺灰色 (選擇項目的背景)。色彩配置對於開頭顯示畫面沒有作用,只對您可以存取而且可以自定的 GRUB 功能表有作用 (您可以使用 Esc,結束開頭顯示畫面)。
第一個功能表項目 title linux
是預設要啟動的項目。
沒有任何用者輸入,經過 8 秒後,GRUB 會自動啟動預設項目。若要停用自動開機,請刪除 timeout
。如果設定為 timeout 0
,GRUB 會馬上啟動預設項目。
第二個 (最大的) 區塊會列示各種可開機的作業系統。個別作業系統的區段會從 title
開始。
第一個項目 (title linux
) 負責啟動 SUSE Linux Enterprise。核心 (vmlinuz
) 是位在第一個硬碟的第一個邏輯分割區 (啟動分割區)。核心參數,例如根分割區和 VGA 模式,會在此添加。根分割區是根據 Linux 命名慣例 (/dev/hda7/
) 指定的,因為此資訊是由核心讀取,與 GRUB 無關。initrd
也是位在第一個硬碟的第一個邏輯分割區。
第二個項目負責載入 Windows。Windows 是從第一個硬碟的第一個分割區啟動 (hd0,0
)。指令 chainloader +1
會造成 GRUB 載入並執行指定分割區的第一個磁區。
下一個項目允許從磁片開機,無需修改 BIOS 設定。
開機選項 failsafe
會以選擇的核心參數來啟動 Linux,可以啟動發生問題的 Linux 系統。
功能表檔案可以在需要時變更。GRUB 會在下次啟動時使用修改的設定。使用 YaST 或選擇的編輯器,永久地編輯檔案。另一種方法是,使用 GRUB 的編輯功能,以互動方式暫時變更 (請參閱第 21.2.1.3 節「在開機程序期間編輯功能表項目」)。
在圖形化開機功能表中,可以使用方向鍵選取要啟動的作業系統。如果選取 Linux 系統,可以在開機提示時輸入其他啟動參數。若要直接編輯個別功能表項目,請按 Esc 結束開頭顯示畫面,然後跳到 GRUB 文字功能表,再按 E。用此方式所做的變更,只會套用到目前開機,因此不會永久變更。
![]() | 開機程序期間的鍵盤配置 |
---|---|
US 鍵盤配置是啟動時唯一可以使用的鍵盤配置。請參閱圖形 51.1 「美國鍵盤配置」中的圖形。 |
編輯功能表項目有利於修復無法再啟動的缺陷系統,因為開機載入程式錯誤的組態檔,可以手動輸入參數,便得以解決。在開機程序期間手動輸入參數,對於測試新設定但可避免損壞原始系統,有很大的幫助。
啟用編輯模式之後,使用方向鍵選取功能表項目來編輯組態。若要讓組態變成可編輯狀態,請再按 E 一次。使用此方法,在對於開機程序產生負面影響之前編輯錯誤的分割區或路徑指定。按 Enter,結束編輯模式並返回功能表。然後按 B 來啟動此項目。底下的說明文字會顯示進一步可行的動作。
若要永久地輸入變更的開機選項,然後傳送至核心,以 root
身份開啟檔案 menu.lst
,然後將各自的核心參數加入到現有的指令行,並以空格分隔:
title linux kernel (hd0,0)/vmlinuz root=/dev/hda3 additional parameter initrd (hd0,0)/initrd
GRUB 會在下次啟動系統時,使用新參數。另一種方法是,使用 YaST 開機載入程式模組做此變更。將新參數加入至現有的行,並用空格分開。
檔案 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/hd |
在手動變更檔案 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)。