2.GRUB (GRand Unified Boot loader)
2.1GRUB基礎(chǔ)
2.1.1. 什么是 GRUB?
GRUB 是引導裝入器 -- 它負責裝入內(nèi)核并引導 Linux 系統(tǒng)。GRUB 還可以引導其它操作系統(tǒng),如 FreeBSD、NetBSD、OpenBSD、GNU HURD 和 DOS,以及 Windows 95、98、NT 和 2000。盡管引導操作系統(tǒng)看上去是件平凡且瑣碎的任務,但它實際上很重要。如果引導裝入器不能很好地完成工作或者不具有彈性,那么就可能鎖住系統(tǒng),而無法引導計算機。另外,好的引導裝入器可以給您靈活性,讓您可以在計算機上安裝多個操作系統(tǒng),而不必處理不必要的麻煩。
2.1.2 GRUB 很棒
幸好,GRUB 是一個很棒的引導裝入器。它有許多功能,可以使引導過程變得非??煽?。例如,它可以直接從 FAT、minix、FFS、ext2 或 ReiserFS 分區(qū)讀取 Linux 內(nèi)核。這就意味著無論怎樣它總能找到內(nèi)核。另外,GRUB 有一個特殊的交互式控制臺方式,可以讓您手工裝入內(nèi)核并選擇引導分區(qū)。這個功能是無價的:假設(shè) GRUB 菜單配置不正確,但仍可以引導系統(tǒng)。哦,對了 -- GRUB 還有一個彩色引導菜單。我們只是剛開始。
2.1.3. 為什么使用 GRUB?
您也許會奇怪,為什么全世界都需要 GRUB -- 畢竟,Linux 世界在很長一段時間里一直使用 LILO 引導裝入器,而且它可以讓上百萬的 Linux 用戶引導系統(tǒng)。是的,的確是這樣,LILO 很有效。但是,LILO 的維修率很高,而且很不靈活。與其花很多時間來描述 GRUB 的優(yōu)點,還不如演示如何創(chuàng)建自己的 GRUB 引導盤以及如何使用它來引導系統(tǒng)。然后,我將說明 GRUB 的一些很“酷”的技術(shù)細節(jié),并指導您完成將 GRUB 安裝到 MBR(主引導記錄)的過程,以使它成為缺省引導裝入器。
如果您有點膽小,不必害怕??梢詫W習本教程的前半部分,創(chuàng)建 GRUB 引導盤,嘗試使用 GRUB 而不必弄亂現(xiàn)有的引導裝入器。或者,可以用其安全的“駐留”方式來熟悉 GRUB。那么,讓我們立即開始吧。
2.2安裝GRUB
2.2.1. 下載 GRUB
要開始探究 GRUB 的精妙之處,首先需要下載、編譯和安裝它。但不要害怕 -- 根本不會修改您的引導記錄 -- 我們只是要編譯和安裝 GRUB,就像其它程序一樣,在此過程中我們可以創(chuàng)建 GRUB 引導盤。請不要擔心;在修改引導過程之前,我會告訴您。
現(xiàn)在開始。訪問
ftp://alpha.gnu.org/gnu/grub/ 并下載可以找到的最新版本的 GRUB tar 壓縮包。我編寫本教程時,最新的 tar 壓縮包是 grub-0.5.96.1.tar.gz。下載了最新版本后,就可以安裝了。
2.2.2 安裝期
這里是從 tar 壓縮包安裝 GRUB 所需輸入的命令。我將在 /tmp 中編譯源文件,并將所有部分都安裝到硬盤的 /usr 目錄下。從 root 用戶,輸入以下命令:
# cd /tmp
# tar xzvf /path/to/archive/here/grub-0.5.96.1.tar.gz
# cd grub-0.5.96.1
# ./configure --prefix=/usr
# make
# make install
現(xiàn)在已經(jīng)安裝了 GRUB,準備開始使用它。
2.2.3. 制作引導盤
要制作引導盤,需執(zhí)行一些簡單的步驟。首先,在新的軟盤上創(chuàng)建 ext2 文件系統(tǒng)。然后,將其安裝,并將一些 GRUB 文件復制到該文件系統(tǒng),最后運行 "grub" 程序,它將負責設(shè)置軟盤的引導扇區(qū)。準備好了嗎?
好,將一張空盤插入 1.44MB 軟驅(qū),輸入:
# mke2fs /dev/fd0
創(chuàng)建了 ext2 文件系統(tǒng)后,需要安裝該文件系統(tǒng):
# mount /dev/fd0 /mnt/floppy
現(xiàn)在,需要創(chuàng)建一些目錄,并將一些關(guān)鍵文件(原先安裝 GRUB 時已安裝了這些文件)復制到軟盤:
# mkdir /mnt/floppy/boot
# mkdir /mnt/floppy/boot/grub
# cp /usr/share/grub/i386-pc/stage1 /mnt/floppy/boot/grub
# cp /usr/share/grub/i386-pc/stage2 /mnt/floppy/boot/grub
只需要再有一個步驟,就能得到可用的引導盤。
解壓、編譯和安裝 GRUB 源 tar壓縮包時,會將程序 grub 放到 /usr/sbin 中。該程序非常有趣并值得注意,因為它實際上是 GRUB 引導裝入器的半功能性版本。是的,盡管 Linux 已經(jīng)啟動并正在運行,您仍可以運行 GRUB 并執(zhí)行某些任務,而且其界面與使用 GRUB 引導盤或?qū)?GRUB 安裝到硬盤 MBR 時看到的界面完全相同。
這是有趣的設(shè)計策略,現(xiàn)在該使用駐留版本的 GRUB 來設(shè)置引導盤的引導扇區(qū)了。從 root 用戶,輸入 "grub"。GRUB 控制臺將啟動,顯示如下:
GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub>
歡迎使用 GRUB 控制臺。現(xiàn)在,研究命令。
在 grub> 提示符處,輸入:
grub> root (fd0)
grub> setup (fd0)
grub> quit
現(xiàn)在,引導盤完成了。在繼續(xù)下一步驟之前,在看一下剛才輸入的命令。第一個 "root" 命令告訴 GRUB 到哪里查找輔助文件 stage1 和 stage2。缺省情況下,GRUB 會在指定的分區(qū)或磁盤上的 /boot/grub 目錄中進行查找。在安裝引導盤時,也就是幾分鐘以前,我們已將這些文件復制到正確的位置。接著,輸入了 setup 命令,它告訴 GRUB 將引導裝入器安裝到軟盤的引導記錄上;我們將在以后詳細討論這一過程。然后退出?,F(xiàn)在,已經(jīng)制作好引導盤,可以開始使用 GRUB 了。
2.3使用GRUB
2.3.1. 準備
使用 GRUB 引導系統(tǒng)之前,需要知道一些信息。首先,應知道哪個分區(qū)保存了 Linux 內(nèi)核,以及 root 文件系統(tǒng)的分區(qū)名稱。然后,應查看現(xiàn)有 LILO 配置來尋找需要傳遞給內(nèi)核的變量,如 "mem=128M"。一旦獲取了這些信息,就可以開始了。
啟動GRUB
要啟動 GRUB,需要關(guān)閉系統(tǒng)并退出引導盤。如果由于某些原因而不能立即關(guān)閉系統(tǒng)(比如上班時在部門的服務器上測試 GRUB),那么只要在提示中輸入 "grub" 并繼續(xù)操作。所有程序的運行情況都不會改變,只是您不能執(zhí)行引導(因為 Linux 正在運行)。
2.3.2 首次接觸
裝入引導盤時,在屏幕頂部將出現(xiàn)一條消息,告訴您正在裝入第一階段和第二階段。幾秒后,將會出現(xiàn)一個熟悉的屏幕,顯示如下:
GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub>
可以看到,這些內(nèi)容與在 Linux 中以駐留方式運行 GRUB 時出現(xiàn)的消息完全相同 -- 只不過現(xiàn)在我們是使用 GRUB 來引導 Linux。
2.3.3. "root"
在 Linux 中,當談到 "root" 文件系統(tǒng)時,通常是指主 Linux 分區(qū)。但是,GRUB 有它自己的 root 分區(qū)定義。GRUB 的 root 分區(qū)是保存 Linux 內(nèi)核的分區(qū)。這可能是您的正式 root 文件系統(tǒng),也可能不是。例如,在 Gentoo Linux 中,有一個單獨的小分區(qū)專用于保存 Linux 內(nèi)核與引導信息。大多數(shù)情況下,我們不安裝這個分區(qū),這樣在系統(tǒng)意外崩潰或重新引導時,就不會把它弄亂。
這些,我們討論的是 GRUB,需要指定 GRUB 的 root 分區(qū)。進入 root 分區(qū)時,GRUB 將把這個分區(qū)安裝成只讀型,這樣就可以從該分區(qū)中裝入 Linux 內(nèi)核。GRUB 的一個很“酷”的功能是它可以讀取本機的 FAT、FFS、minix、ext2 和 ReiserFS 分區(qū),我們很快就會討論這個功能。但現(xiàn)在,讓我們輸入 root 分區(qū)。在提示中輸入 root,但不要按 Enter 鍵:
grub> root (
現(xiàn)在,按一次 Tab 鍵。如果系統(tǒng)中有多個硬盤,GRUB 將顯示可能完成的列表,從 "hd0" 開始。如果只有一個硬盤,GRUB 將插入 "hd0,"。如果有多個硬盤,繼續(xù)進行,在 ("hd2") 中輸入名稱并在名稱后緊跟著輸入逗號,但不要按 Enter 鍵。部分完成的 root 命令看起來如下:
grub> root (hd0,
現(xiàn)在,繼續(xù)操作,再按一次 Tab 鍵。GRUB 將顯示特定硬盤上所有分區(qū)的列表,以及它們的文件系統(tǒng)類型。在我的系統(tǒng)中,按 Tab 鍵時得到以下列表:
grub> root (hd0, (tab)
Possible partitions are:
Partition num: 0, Filesystem type is ext2fs, partition type 0x83
Partition num: 1, Filesystem type unknown, partition type 0x82
Partition num: 2, Filesystem type unknown, partition type 0x7
Partition num: 4, Filesystem type is reiserfs, partition type 0x83
Partition num: 5, Filesystem type is reiserfs, partition type 0x83
如您所見,GRUB 的交互式硬盤和分區(qū)名稱實現(xiàn)功能非常有條理。這些,只需要好好理解 GRUB 新奇的硬盤和分區(qū)命名語法,然后就可以繼續(xù)操作了。
2.3.4. GRUB 命名約定
到目前為止,您可能會感到一點困惑,因為 GRUB 所使用的硬盤/分區(qū)命名約定與 Linux 使用的命名約定不同。在 Linux 中,第一個硬盤的第五個分區(qū)稱作 "hda5"。而 GRUB 把這個分區(qū)稱作 "(hd0,4)"。GRUB 對硬盤和分區(qū)的編號都是從 0 開始計算。另外,硬盤和分區(qū)都用逗號分隔,整個表達式用括號括起?,F(xiàn)在,回來看一下 GRUB 提示,可以發(fā)現(xiàn)如果要引導 Linux 硬盤 hda5,應輸入 "root (hd0,4)"。如果已經(jīng)明白了 GRUB 硬盤/分區(qū)命名,您也許要調(diào)整當前 root 命令行,以使它指向保存 Linux 內(nèi)核的分區(qū)。按以下格式輸完命令,然后按 Enter 鍵:
grub> root (hd0,4) (hit enter)
Filesystem type is reiserfs, partition type 0x83
2.3.5. 裝入內(nèi)核
現(xiàn)在已安裝了 root 文件系統(tǒng),到裝入內(nèi)核的時候了。在 GRUB 提示中,依次輸入 "kernel"、空格、到內(nèi)核的路徑、空格、內(nèi)核參數(shù),如 root 參數(shù)(GRUB 將自動插入適當?shù)?"mem=" 參數(shù))。我在我的系統(tǒng)中輸入:
grub> kernel /boot/bz2.4 root=/dev/hda5
[Linux-bzImage, setup=0x1200, size=0xe1a30]
請留意 "root=" 內(nèi)核參數(shù),它非常重要。它應該指向保存 root 文件系統(tǒng)的 Linux 分區(qū)。您也許要寫下到目前為止輸入的命令,這樣在教程后面講述如何創(chuàng)建 GRUB 引導菜單時,就可以迅速找到它們。
2.3.6. Root,內(nèi)核,引導!
您已經(jīng)安裝了 root 文件系統(tǒng)并裝入了內(nèi)核?,F(xiàn)在,可以引導了。只要輸入 "boot",Linux 引導過程就將開始。
2.4GRUB內(nèi)幕
2.4.1. 重新調(diào)查引導軟盤
如果一切正常,就可以使用使用 GRUB 引導盤來引導當前 Linux 發(fā)行版。如您所見,GRUB 是功能非常強大的引導裝入器,它讓您可以隨意動態(tài)配置以進行引導。我將向您介紹如何創(chuàng)建 GRUB 引導菜單,這樣就可以從菜單中進行 OS 選擇,而不是輸入三行命令來引導 Linux。但在動手之前,現(xiàn)在是深入了解 GRUB 幕后是如何工作的好時機。我將說明引導盤引導過程的工作原理,這樣您就可以對 GRUB 有一個更好的評價和了解。
2.4.2. 兩階段過程
要制作引導軟盤,需要做兩件事 -- 將文件復制到軟盤的 ext2 文件系統(tǒng)的 /boot/grub 目錄中,運行 GRUB 的安裝程序。運行 GRUB 安裝程序時,GRUB 將 "stage 1" 裝入器安裝到軟盤的引導記錄中。它還將 stage 1 裝入器配置成從 ext2 文件系統(tǒng)直接裝入 stage2。通常,GRUB 通過在包含 stage2 數(shù)據(jù)的軟盤上創(chuàng)建一列塊來完成此操作,這樣 stage1 裝入 stage2 時不必知道 ext2 文件系統(tǒng)的任何情況。
但是,大多數(shù)情況下,GRUB 在安裝完 stage1 之后,會立即將 stage1.5 裝入器安裝到引導記錄中。這個特殊的 stage1.5 允許無需使用原始塊列表就能從 ext2 文件系統(tǒng)裝入 stage2,卻要更靈活的標準基于路徑的方法。GRUB 理解文件系統(tǒng)結(jié)構(gòu)的這一能力使 GRUB 比 LILO 更強壯。例如,如果正好在整理引導盤文件系統(tǒng)的碎片,stage1 就可以找到 stage2(歸功于 ext2 stage1.5)。而 LILO 就不能完成此項操作。因為 LILO 只能依賴于映射文件,每次更新內(nèi)核或在磁盤上物理移動數(shù)據(jù)時,即使不更改路徑,也需要重新運行它。
2.4.3. 階段 1、1.5 和 2
您也許會想知道:如果使用 FAT 而不是 ext2 文件系統(tǒng)創(chuàng)建引導盤,GRUB 是否可以工作。是的,它可以工作,因為在輸入 "setup (fd0)" 時,GRUB 會安裝與 root 文件系統(tǒng)類型匹配的 stage1.5。即使沒有沒有空間可以安裝 stage1.5,GRUB 仍可以通過追溯到更原始的塊列表,來裝入 stage2。
2.4.4. 搜索和恢復
在繼續(xù)討論之前,先研究一個與引導軟盤相關(guān)的實用提示。由于 GRUB 的交互式性質(zhì),它為恢復軟盤生成了一個很好的引導裝入器。但是,如果將好的內(nèi)核復制到引導盤上,那它就更好了。那樣,即使硬盤上的內(nèi)核壞了或者被意外刪除了,也可以追溯到引導盤內(nèi)核,并啟動和運行系統(tǒng)。要將備用內(nèi)核復制到引導盤,執(zhí)行以下操作:
# mount /dev/fd0 /mnt/floppy
# cp /path/to/bzImage /mnt/floppy/boot
# umount /dev/fd0
現(xiàn)在,軟盤已包含備用內(nèi)核,可以在 GRUB 中使用它來引導 Linux 發(fā)行版,操作如下:
grub> root (fd0)
grub> kernel /boot/bzImage root=/dev/hda5 (將 /dev/hda5 更改成想要引導的分區(qū)名稱)
grub> boot
2.4.5. 硬盤引導
好,現(xiàn)在如何將 GRUB 安裝到硬盤上?這個過程幾乎與引導盤安裝過程一樣。首先,需要決定哪個硬盤分區(qū)將成為 root GRUB 分區(qū)。在這個分區(qū)上,創(chuàng)建 /boot/grub 目錄,并將 stage1 和 stage2 文件從 /usr/share/grub/i386-pc 復制到該目錄中。可以通過重新引導系統(tǒng)并使用引導盤,或者使用駐留版本的 GRUB 來執(zhí)行后一步操作。在這兩種情況下,啟動 GRUB,并用 root 命令指定 root 分區(qū)。例如,如果將 stage1 和 stage2 文件復制到 hda5 的 /boot/grub 目錄中,應輸入 "root (hd0,4)"?,F(xiàn)在,只差一步。
接著,決定在哪里安裝 GRUB -- 在硬盤的 MBR,或者如果與 GRUB 一起使用另一個“主”引導裝入器,則安裝在特定分區(qū)的引導記錄中。如果安裝到 MBR,則可以指定整個磁盤而不必指定分區(qū),如下(對于 hda):
grub> setup (hd0)
如果要將 GRUB 安裝到 /dev/hda5 的引導記錄中,應輸入:
grub> setup (hd0,4)
現(xiàn)在,已安裝 GRUB。引導系統(tǒng)時,應該立即以 GRUB 的控制臺方式結(jié)束(如果安裝到 MBR)。現(xiàn)在,應創(chuàng)建引導菜單,這樣就不必在每次引導系統(tǒng)時都輸入那些命令。
2.4.6. 引導菜單
要創(chuàng)建菜單,只需在 /boot/grub 中創(chuàng)建一個簡單的文本文件 menu.lst。如果將它放在正確位置,它將在 root GRUB 驅(qū)動器的 stage1 和 stage2 文件的旁邊。這里是一個樣本 menu.lst 文件,可以將它作為一個您的菜單的基礎(chǔ):
default 0
timeout 30
color white/blue blue/green
title=Boot Linux
root (hd0,4)
kernel /boot/bzImage root=/dev/hda5
title=Boot Linux using initrd
root (hd0,5)
kernel /boot/bzImage root=/dev/loop0 init=/initdisk.gz
initrd /initdisk.gz
title=Windows NT
root (hd0,3)
chainloader +1
我將在以下的屏面中說明 menu.lst 格式。
2.4.7. 理解引導菜單
引導菜單很容易理解。前三行設(shè)置缺省菜單項(項目號 0,第一個)、設(shè)置超時值(30 秒),并選擇整個菜單的一些顏色。
接著的三行配置 "Boot Linux" 菜單項。要創(chuàng)建手工引導命令系列之外的菜單項,只要添加一行 "title=" 作為第一行,并從最后一行中除去 "boot" 命令(GRUB 會自動添加這個命令)。
接著的四行顯示了如何使用 GRUB 來引導 initrd(初始 root 磁盤),如果您愿意的話?,F(xiàn)在,討論最后三行……
2.4.8. 鏈式裝入器
這里是示例 menu.lst 的最后三行……
title=Windows NT
root (hd0,3)
chainloader +1
這里,我添加了一項來引導 Windows NT。要完成此操作,GRUB 使用了“鏈式裝入器”。鏈式裝入器從分區(qū) (hd0,3) 的引導記錄中裝入 NT 自己的引導裝入器,然后引導它。這就是這種技術(shù)叫做鏈式裝入的原因 -- 它創(chuàng)建了一個從引導裝入器到另一個的鏈。這種鏈式裝入技術(shù)可以用于引導任何版本的 DOS 或 Windows。
2.6 總結(jié)
2.6.1. GRUB 的彈性
GRUB 最好的優(yōu)點之一就是其強健的設(shè)計 -- 在不斷使用它時請別忘了這點。如果更新內(nèi)核或更改它在磁盤上的位置,不必重新安裝 GRUB。事實上,如有必要,只要更新 menu.lst 文件即可,一切將保持正常。
只有少數(shù)情況下,才需要將 GRUB 引導裝入器重新安裝到引導記錄。首先,如果更改 GRUB root 分區(qū)的分區(qū)類型(例如,從 ext2 改成 ReiserFS),則需要重新安裝?;蛘?,如果更新 /boot/grub 中的 stage1 和 stage2 文件,由于它們來自更新版本的 GRUB,很有可能要重新安裝引導裝入器。其它情況下,可以不必理睬!
2.6.2. 優(yōu)秀的 GRUB 參考資料
我們在這里只是介紹了 GRUB 的一部分。例如,可以使用 GRUB 來執(zhí)行網(wǎng)絡引導,引導 BSD 文件系統(tǒng),或更多操作。另外,GRUB 有許多配置和安全性命令也很有用。如需所有 GRUB 功能的完整描述,請閱讀 GRUB 出色的 GNU 文檔。只要在 bash 提示中輸入 "info grub" 就可以閱讀該文檔。