GRUB 基礎

move8net發表於2007-09-07

GRUB 基礎

[@more@]

一、GRUB 基礎

1.1 GRUB 簡介

“boot loader”是計算機啟動後第一個執行的軟體。它負責載入一個作業系統的核心,並把控制權交給核心。核心則負責剩下的初始過程。

GRUB 一個很重要的特色就是靈活性;GRUB 可以識別檔案系統和二進位制格式的核心,所以你可以載入任何作業系統,而不需要記錄核心在

磁碟上的物理位置。

1.2 GRUB 的現狀

我不打算介紹 GRUB 的發展歷史,有興趣的朋友可以自己到官方站點或者執行 info grub 自行獲取資訊。我們著眼於 GRUB 當前的現狀。

目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本號是 0.9x 以及之前的版本都稱為 GRUB Legacy ,從 1.x 開始的就稱為 GRUB 2。目前

GRUB Legacy 已經停止開發了,只是出於一個 bug fix 的狀態,不再增加新的功能了,所有的開發都轉移到 GURB 2 之上了。

1.3 GRUB Legacy 和 GRUB 2

GRUB 2 是源自於一個名為 PUPA 的專案,目的是建立下一代的 boot loader。GRUB 2 幾乎是從零開始開始開發的,它和 GRUB Legacy 不

同的地方有很多,例如支援 scripts、國際化語言、動態載入模組、帶有 resuce 模式等等,這些都是 GRUB Legacy 所沒有的。

下面是 GRUB2 新特性的介紹 :(原文請參 )

a)支援指令碼語言,例如條件判斷,迴圈、變數和函式

b)圖形介面

c)在執行時動態載入需要的模組,而不是在 biuld 的時候指定加入那些模組(靜態)

d)可以移植到不同的架構上

e)國際化語言。包括支援非ASCII的字符集和類似 gettext 的訊息分類,字型,圖形控制檯等等。

f)實際記憶體管理。使得 GNU GRUB 更加具有可擴充套件性

g)針對檔案系統、檔案、裝置、驅動、終端、命令、分割槽表、 os loder 的模組化、層次化、基於物件的框架

h)跨平臺的安裝,允許從另外一個架構上安裝 GRUB

i)支援 rescue 模式,可用於系統無法引導的情況。stage 1.5 被取消了

j)修復 GRUB Legacy 設計上的錯誤,同時又保持向後的相容性。

1.4 Multiboot 規範

Multiboot 規範是在 boot loader 和 kernel 之間的一個協議,用於統一各種引導作業系統的方法。Linux 和 BSD 目前並不支援該規範。

1.5 可用資源

GRUB 的 homepage )

info grub

1.6 舊版 GRUB(GRUB Legacy)的功能特色

a)識別多種可執行格式,支援 “a.out” , ELF, symbol tables)

b)支援 non-Multiboot 核心。主要是FreeBSD、NetBSD、OpenBSD、Linux。

c)支援載入多個模組

d)支援配置檔案

e)提供選單介面。選單項的數量並沒有限制,目前版本支援數百個選單條目

f)有一個靈活的命令列介面。如果沒有配置檔案存在,GRUB 會自動進入命令模式

g)支援多種檔案系統格式。主要有BSD FFS”、“DOS FAT 16 、FAT32”,“Minix fs”、ext2/ext3、ReiserFS 、jfs、xfs、VSTa fs

h)支援自動解壓

i)能夠訪問任何已經安裝的裝置上的資料

j)Be independent of drive geometry translations (這個不知道怎麼翻譯好)
Unlike many other boot loaders, GRUB makes the particular drive
translation irrelevant. A drive installed and running with one
translation may be converted to another translation without any
adverse effects or changes in GRUB's configuration.

k)檢測所有已經安裝的 RAM

l)支援 LBA 模式。在傳統的磁碟呼叫(稱為 CHS 模式),存在一個限制 :就是 BIOS 無法訪問在 1024 柱面。之後的內容,所以 BIOS

只能訪問最小 508 MB ,最大8GB 的空間。(這也就是 /boot 分割槽必須在 1024 柱面之前的原因)。GRUB 並不能解決全部問題,因為

並沒有統一的解決方法,不過 GRUB 可以檢測是否支援 LBA 模式,如果支援則使用 LBA 模式。

m)支援網路引導,可以使用 TFTP 協議透過網路載入核心

n)支援遠端終端,目前只支援串列埠

二、命名習慣

首先 GRUB 要求裝置名被括在一個 ( ) 中。fd表示軟盤,hd 表示硬碟(不區分 IDE 還是 SCSI)。其次裝置是從 0 開始編號,分割槽也是如此,

分割槽和裝置之間用一個 ‘,’ 分開。下面給出幾個例子 :

(fd0) :表示整個軟盤

(hd0,1) :表示 BIOS 中的第一個硬碟的第2個分割槽

(hd0,0)/boot/vmlinuz :表示 BIOS 中的第一個硬碟的第一個分割槽下的 boot/ 目錄下的vmlinuz 檔案。

如果沒有指定某個分割槽,則表示使用整個裝置,否則只使用指定的分割槽。


三、安裝 GRUB

3.1 下載 tarball

有兩種方法,一種是 rpm ;一種是 tarball 。rpm 沒有什麼好說的,只是 rpm –Uvh 就可以了。不過一般不會啟用網路引導功能,

所以我們決定採用 tarball 的方式安裝。 首先到下面的地址下載 tarball

上面有 GRUB Legacy 和 GRUB 2 ,就選擇目前 RHEL AS4 用的 0.95 版本做實驗。

不過在安裝之前先要用 rpm –q grub 檢查一下 grub 是否安裝了。如果是的話,用 rpm –e grub 刪除,即使你在安裝時指定不安裝

boot loader ,安裝程式還是會安裝 grub rpm 包的。

3.2 安裝需求

INSTALL 檔案中給出了 build 所需要的軟體包條件 :

GCC :當前版本的 GCC 應該也可以用,不過還是建議用 2.95 或者以上版本的 GCC

GNU Make :生成 Makefiles 所用

GNU binutils 2.9.1.0.23 或者個更高版本

如果你想自己開發 GRUB ,還需要 Texinfo 4.0 或者更高 ,同時還有GNU Autoconf 2.5x ,GNU Automake 1.7 或者更高頒佈。

3.3 引數介紹

下面我們介紹幾個 configure 過程中可能用到的選項,要完整的選項列表,可以參看 INSTALL 檔案和 netboot/README.netboot 檔案.

a)--enable-preset-menu=FILE :預設情況下 grub.conf 和 stage2 檔案是分離的,使用該選項,可以直接把配置檔案嵌入到 stage2 中,

這樣啟動時可以立即獲得配置檔案。對於一些嵌入式的系統來說比較有用,又或者在前面提到的沒有顯示器/鍵盤的主機有用,因為在切

換顯示輸出到你的筆記本之前,你是看不到啟動的畫面的,所以執行切換顯示操作也是在看不到輸出的情況下進行的(切換顯示之後就不會了)。

透過這個選項你可以在 中指定啟動時立即把顯示輸出切換到你的筆記本上了。

b)--enable-diskless :如果使用了該選項,你會得到額外的兩個檔案,nbgrub 和 pxegrub。接下來你需要指定網路卡的驅動程式,

netboot/ 目錄下有較常見的幾種 ,可以看到幾種網路卡可以合用一個驅動。常見的有 :
[Copy to clipboard]
CODE:
Intel Etherexpress Pro/100
--enable-eepro100

Novell NE2100 and NE1500
--enable-ne2100

Realtek 8139
SMC 1211
D-Link DFE530TX+ and DFE538TX
--enable-rtl8139


3Com90x
--enable-3c90x

如果你不想那麼麻煩,則按照下面的過程進行 :
[Copy to clipboard]
CODE:
./configure
make
make install

安裝結束。預設命令會放在 /usr/local/bin 和 /usrlocal/sbin 下。Stage 檔案則放在 /usr/local/share/grub/i386-pc/ 目錄下。

3.4 安裝之後的操作

a)把 /usr/local/share/grub/i386-pc/ 目錄下的所有檔案統統複製到 /boot/grub/ 目錄下。

b)接下來是建立 grub.conf ,並在 /boot/grub/ 目錄下建立一個 menu.lst ,指向 grub.conf。

c)注意,這個 symbol link 在 Redhat 9 是必需的,否則啟動時會直接進入命令模式,即使已經存在 grub.conf ;但在 RHEL AS4 下卻不是。

d)確認 /usr/local/sbin 和 /usr/local/bin 在 PATH 變數的值中。

e)執行 grub-install /dev/hda1 把 stage1 寫入到 /boot 分割槽的引導扇區。

也可以執行 grub 進入 grub shell ,然後透過 root 和 setup 命令來安裝 stage1 。

f)重啟機器,安裝過程到此結束。

四、GRUB 介面

GRUB 除了選單模式,還提供了一個命令模式和 grub shell 。當系統啟動並顯示選單時,按 c 鍵就可以進入命令模式。提示符是 grub> 。

如果你已經成功引導作業系統並登入,可以在 shell 提示符下執行 grub ,這會啟動一個 grub shell。提示符也是 grub> 。

GRUB 能夠象 bash 一樣使用上下鍵來訪問 command history ,ctrl-u、ctrl-k、ctrl-l 等快捷鍵也可以使用。想要編輯選單,可以按下 e 鍵;

想要新增一空白行,可以按下 o 鍵(當前行之後)或者 O 鍵(當前行之前)。想要刪除當前行,按下 d 鍵;ESC 鍵放棄當次修改並返回上級選單。

有些命令只能在命令模式下,有些命令只能用於配置檔案(選單模式),有些命令在兩個模式下都可以使用。下面我們就介紹 GRUB 常用的命令。

五、GRUB 常用命令

5.1 只能用於配置檔案的命令

下面這5個命令只能出現於配置檔案中,分別是 :

a)default :定義預設引導的作業系統。0 表示第一個作業系統,1表示第2個,依此類推

b)fallback :如果 default 所指定的作業系統引導失敗,則預設引導由 fallback 指定的作業系統

c) hiddenmenu :用於啟動時隱藏選單,除非在 timeout 之前按下 ESC 才能看到選單。

d)timeout :定義多少秒內如果使用者沒有按下鍵盤上的某個按鍵,就自動引導 default 所指定的作業系統。

e)title :定義引導專案的名稱。

f)password :用於定義進入 GRUB 命令模式的密碼。你還可以為每個作業系統都定義一個密碼,方法是把 password 命令放在 title行之後。

而且每個作業系統的引導密碼可以不同,也可以和進入命令模式的那個密碼不同,最大程度的保證 GRUB 的安全。

5.2 只能用於命令模式或者 grub shell 的命令

a)device :用於定義 BIOS 中的磁碟裝置和作業系統的磁碟裝置之間的對映關係。

例如 device (hd0)/dev/hdb 把 BIOS 中的第一個硬碟相當於 Linux 的 /dev/hdb

b)serial :用於初始化一個串列埠裝置。

例如 :serial –-unit=0 –-speed=9600 表示初始化 COM1(--unit=0),速率為 9600 Baud

不過 grub shell 下執行該命令會顯示 “無法識別的命令”

c)terminal :用於切換顯示輸出。有兩這個值可選 :console 和 serial 。當你把筆記本接到一個沒有顯示器/鍵盤的主機上時,執行

terminal serial 就可以在你的筆記本上操作這臺主機的 GRUB 了。執行 terminal console 把顯示輸出還原到該主機。

不過 grub shell 下執行該命令會顯示“無法識別的命令”

d)splashimage :用於定義啟動時的背景圖片。例如 splashimage /grub/splash.xpm.gz

經過測試,發現用 tarball 安裝的不支援該命令,這似乎是 redhat grub rpm 專有的。

e)blocklist :用於顯示某個檔案在檔案系統中的位置,以 block list 的形式顯示。例如 blocklist /vmlinuz

f)ca :用於顯示檔案內容。由於 GRUB 可以直接訪問多種檔案系統,所以可以用 cat (hd0,1)/etc/passwd 來在 GRUB 命令模式下檢視 /etc/passwd 檔案

g)root :用於指定含有 stage 檔案的分割槽。如果有 /boot 分割槽,則 root device 就是 /boot 分割槽,否則

就是 / 分割槽。

h)rootnoverify :和 root 類似,但不會嘗試掛載該分割槽。例如用於指定 windows 作業系統所在的分割槽。

i)chainloader :用於載入另外一個 boot loader ,通常是用於載入 windows 的 boot loader 。它的引數是一個 block list ,

例如 chainloader (hd0,0)0+1 表示載入第一個磁碟的第一個分割槽的第1塊,0 是開始位置(block 從0開始編號),+1 表示總共讀取多少個 block。

所以 chainloader 2+0 表示讀取第3個block (編號為2)

j)find :可以用於在所有分割槽上搜尋檔案。注意,是所有分割槽,而不是某個分割槽。例如 find /vmlinuz 將會在所有分割槽上查詢位於該分割槽的頂級目錄下的

vmlinuz檔案,如果找到就列印該分割槽名,例如 (hd0,1)。

k)geometry :用於顯示或者設定某個硬碟的 CHS 引數,同時還顯示分割槽資訊。例如 geometry (hd0)

l)halt :關機

m)reboot :重啟機器

n)kernel :指定作業系統核心檔案,還可以在核心檔名後加上引數。例如

kernel /vmlinuz ro root=LABEL=/

表示以只讀的方式掛載 / 分割槽,且根分割槽裝置是 label 為 / 的那個裝置;也可以直接給出裝置名。

o)initrd :用於指定 RAM Disk 檔案,例如 initrd /initrd-2.xx.img 。

p)boot :引導 kernel 所指定的核心,對於 linux 來說,必須先載入了 kernel 和 initrd 才能執行 boot 。

q)setup :用於安裝 stage1 到磁碟的 MBR 或者某個分割槽的引導扇區。

六、保護 GRUB 設定

下面是一個例子
[Copy to clipboard]
CODE:
password –-md5
timeout=30
default=0
title “redhat AS 4”
password –-md5
root (hd0,1)
kernel /vmlinuz ro root=LABEL=/
initrd /initrd-xxx.img
title “windows”
password –-md5
rootnoverify (hd0,0)
chainloader +1

當出現 GRUB 選單時,必須按下 p 並輸入 才能進入命令模式,如果選擇 “redhat AS 4”並按下回車,會出現提示資訊,要求輸入密碼,

這時應該輸入 。同樣只有輸入 才能進入 windows 系統。--md5 告訴 GRUB 後面的內容是已經用 md5 演算法加密過的了。所以 GRUB

會將你輸入的口令用 MD5 加密後再與之比較。你可以命令模式下用md5crypt 命令或者在 shell 下執行 grub-md5-cypt 來得出一個字串用 MD5 加密

後的結果,再插入到配置檔案中。為每個引導專案設定 GRUB 密碼有好處也有壞處 :

a)好處是 :你可以禁止使用者隨便引導某個作業系統,即使普通使用者可以接觸GRUB 選單,沒有密碼也沒有用;

b)壞處是 :如果你一旦重啟機器,就必須手工輸入口令,否則會一直停在那裡。如果你是在半夜遠端重啟某個主機的話…. Hoho

c)建議 :只設定 GRUB 密碼,也就是限制使用者進入命令模式,具體選單項不設定密碼。

七、GRUB 和 stage 檔案

GRUB 含有幾個 images 檔案,兩個基礎(必需的)stages 檔案(stage1和 stage2),可選的 stage(也稱為 stage1.5),和兩個網路引導的images 檔案

nxgrub 和 pxegrub)。stage1 是用於引導 GURB 的一個必須的映象檔案。通常它是被嵌入到 MBR。或者一個分割槽的引導扇區之中。因為 PC 的引導扇區是

512 位元組,所以 stage1 也是 512 位元組。stage1 的作用就是從一個本地磁碟載入 stage 2 或者 stage 1.5 。因為大小的限制,stage1 對 stage2 或者

stage 1.5 的位置進行編碼,也就是說,stage1 是無法識別檔案系統格式的。stage2 是 GRUB 的核心映象。它幾乎處理所有的事情(除了載入它自己),

通常可以把他放在檔案系統上,但不是必須的。

一旦你執行了 grub-install 安裝了 boot loader ,stage1 檔案就不是必須的,可以把它移動到任意位置,因為它已經被嵌入到 MBR 或者 PBR 了。

stage1和stage2 檔案一般位於 /boot/grub/ 目錄下,在這個目錄下還有很多 stage 1.5 的檔案,而且都是以檔案系統格式命名的。它們的目的是在 stage1

和 stage2之間搭建一個橋樑,也就是 stage 1 載入 stage 1.5, stage 1.5 載入 stage2。stage1 和 stage 1.5 的不同之處是 stage1 無法識別檔案系統,

stage 1.5 可以。因為 Stage2 太大了,無法被嵌入到某個固定的區域,而 Stage1.5可以安裝在 MBR 之後的位置。

至於 nxgrub 和 pxegrub 我們在第10節才介紹。

八、GRUB 常見錯誤資訊

我們把出錯資訊分成3類,stage1 階段的、stage 1.5 階段的、stage2 階段。後兩個可以合在一起。

8.1 Stage1 階段可能出現的錯誤 :

GRUB 對於該階段出現的錯誤一般是列印一個出錯資訊並掛起機器,除非按CTRL-ALT-DEL 重啟。

a) Hard Disk Error :表示無法判讀 stage 1.5 檔案所在的磁碟的大小和 CHS 引數

b)Floppy Error :表示無法 stage 1.5 檔案所在的軟盤的大小和 CHS 引數

c)Read Error :表示無法讀取 stage 1.5 檔案或者 stage2 檔案

d)Geom Error :stage2 或者 stage 1.5 位於 BIOS 的 read 呼叫可以訪問的範圍之外。

8.2 Stage 1.5/2 階段可能出現的錯誤 :

一般會列印一個 “Error “的錯誤資訊,並根據錯誤的嚴重程度看是否繼續進行。
QUOTE:
1 : Filename must be either an absolute filename or blocklist
解釋 :1號錯誤表示檔名格式錯誤。在 GRUB 中要麼是以絕對路徑給出檔案
例子 :
grub> kernel vmlinuz root=label=/
Error 1: Filename must be either an absolute pathname or blocklist
grub>


QUOTE:
2 : Bad file or directory type
解釋 :2號錯誤表示命令期望的是一個普通檔案,但相應檔名的物件是一個符號連結、目錄、FIFO
例子 :
grub> kernel /testdir root=LABEL=/
Error 2: Bad file or directory type
grub>


QUOTE:
3 : Bad or corrupt data while decompressing file

解釋 :3號錯誤表示解壓檔案時發生錯誤。可能是因為這個檔案被損壞了


QUOTE:
4 : Bad or incompatible header in compressed file
解釋 :4號錯誤表示壓縮檔案的頭部格式不被相容或者錯誤


QUOTE:
5 : Partition table invalid or corrupt
解釋 :5 號錯誤表示分割槽表無效或者被破壞。這是一個不好的預兆


QUOTE:
6 : Mismatched or corrupt version of stage1/stage2
解釋 :6號錯誤表示 install 命令發現 stage1 和 stage2 的頒佈號不被相容


QUOTE:
7 : Loading below 1MB is not supported
解釋 :This error is returned if the lowest address in a kernel is below
the 1MB boundary. The Linux zImage format is a special case and
can be handled since it has a fixed loading address and maximum size


QUOTE:
8 : Kernel must be loaded before booting
解釋 :8號錯誤表示執行 boot 命令之前沒有先執行 kernel 命令


QUOTE:
9 : Unknown boot failure
解釋 :9 號錯誤表示未知的引導錯誤


QUOTE:
10 : Unsupported Multiboot features requested
解釋 :10 號錯誤表示請求 Multiboot header 所要求功能不被 GRUB 所支援。


QUOTE:
11 : Unrecognized device string
解釋 :11 號錯誤表示無法識別的裝置字串。
例子 :
grub> root hd0
Error 11: Unrecognized device string
grub>


QUOTE:
12 : Invalid device requested
解釋 :12 號錯誤表示請求的裝置無效
例子 :
grub> root (hd2)
Error 21: Selected disk does not exist
grub> kernel /grub/grub.conf root=LABEL=/
Error 12: Invalid device requested
grub>


QUOTE:
13 : Invalid or unsupported executable format
解釋 :13 號錯誤表示無效或者無法識別的可執行格式
例子 :
grub> kernel /grub/grub.conf root=LABEL=/
Error 13: Invalid or unsupported executable format
grub>


QUOTE:
14 : Filesystem compatibility error, cannot read whole file
解釋 :14 號錯誤表示檔案系統相容性錯誤,無法讀取整個檔案


QUOTE:
15 : File not found
解釋 :請求的檔案無法找到
例子 :
grub> find /grub-noexist/grub.conf
Error 15: File not found
grub>


QUOTE:
16 : Inconsistent filesystem structure
解釋 :16 號錯誤表示不一致的檔案系統結構。可能是檔案系統結構被破壞了。


QUOTE:
17 : Cannot mount selected partition
解釋 :17號錯誤表示無法掛載指定分割槽。例如 swap 分割槽
例子 :
grub> root (hd0,2) 這是一個 swap 分割槽
Filesystem type unknown, partition type 0x82
grub> kernel /vmlinuz
Error 17: Cannot mount selected partition
grub>


QUOTE:
18 : Selected cylinder exceeds maximum supported by BIOS
解釋 :18 號錯誤表示選擇的柱面超過了 BIOS 支援的最大能力。這通常發生在不支援 LBA 模式
的硬碟上。


QUOTE:
19 : Linux kernel must be loaded before initrd
解釋 :19 號錯誤表示執行 initrd 命令前必須先執行 kernel 命令


QUOTE:
20 : Multiboot kernel must be loaded before modules
解釋 :20 號錯誤表示執行 module 或者 moduleunzip 命令前必須先執行 kernel 命令


QUOTE:
21 : Selected disk does not exist
解釋 :21 號錯誤表示選擇的磁碟不存在
例子 :
grub> root (hd2)
Error 21: Selected disk does not exist
grub>


QUOTE:
22 : No such partition
解釋 :22 號錯誤表示分割槽不存在
例子 :
grub> root (hd0,10)
Error 22: No such partition
grub>


QUOTE:
23 : Error while parsing number
解釋 :23 號錯誤表示引數解釋錯誤,希望是一個數值,但引數卻是其他型別
例子 :
grub> root (hda,0)
Error 23: Error while parsing number
grub>


QUOTE:
24 : Attempt to access block outside partition
解釋 :24 號錯誤表示嘗試訪問的 block 超出了分割槽


QUOTE:
25 : Disk read error
解釋 :25 號錯誤表示磁碟讀錯誤


QUOTE:
26 : Too many symbolic links
解釋 :26 號錯誤表示太多的符號連線(預設最多允許5個)


QUOTE:
27 : Unrecognized command
解釋 :無法識別的命令


QUOTE:
28 : Selected item cannot fit into memory
解釋 :選擇的物件無法被載入到記憶體中。
例子 :
[root@monitor boot]# dd if=/dev/zero of=vmlinuz-2.4.20-31.9 bs=1024 count=1 seek=1
讀入了 1+0 個塊
輸出了 1+0 個塊

[root@monitor boot]#grub
grub> kernel /vmlinuz-2.4.20-31.9 root=label=/
[Linux-bzImage, setup=0x1400, size=0xfffff200]

Error 28: Selected item cannot fit into memory

grub>


QUOTE:
29 : Disk write error
解釋 :磁碟寫錯誤


QUOTE:
30 : Invalid argument
解釋 :無效引數
例子 :
grub> serial --noarg=0
Error 30: Invalid argument
grub>


QUOTE:
31 : File is not sector aligned
解釋 :This error may occur only when you access a ReiserFS partition by
block-lists (e.g. the command `install'). In this case, you should
mount the partition with the `-o notail' option.


QUOTE:
32 : Must be authenticated
解釋 :要求輸入口令才能繼續進行下面的操作。例如配置檔案中有 password 或者 lock 命令
例子 :
password root1234
title DOS
lock
rootnoverify (hd0,0)
chainloader +1


QUOTE:
33 : Serial device not configured
解釋 :33 號錯誤表示串列埠還沒有配置。這一般發生在你執行 terminal serial 的時候


QUOTE:
34 : No spare sectors on the disk
解釋 :磁碟自由空間不足。可能發生在把 stage 1.5 嵌入到 MBR 之後的空間的時候。但這部分空間可能已經被分割槽表使用了

九、製作 GRUB 引導軟盤

GRUB 不僅可以安裝在硬碟上,也可以安裝在軟盤。有兩種方式可用於建立 GRUB 引導軟盤,區別在於後者帶有檔案系統,而前者只有

boot loader 本身。如果你誤刪除那些 stage 檔案,後一種方式就大大有用了。

第一種 :用 dd 命令建立 GRUB 軟盤
[Copy to clipboard]
CODE:
a)按照 ./configure , make ,make install 的步驟安裝 GRUB

b)dd if=/usr/local/share/grub/i386-pc/stage1 of=/dev/fd0

c)dd if=/usr/local/share/grub/i386-pc/stage2 of=/dev/fd0 seek=1

d)這樣就建立好一張 GRUB 引導軟盤了。

第二種 :用 grub-install 建立帶檔案系統的 GRUB 引導軟盤
[Copy to clipboard]
CODE:
a)同樣是先安裝 GRUB

b)mke2fs /dev/fd0

c)mount /dev/fd0 /mnt/floppy

d)grub-install –-root-directory=/mnt/floppy ‘(fd0)’

e)這樣軟盤上就會有一個 /boot/grub/ 目錄,下面就是那些 stage 檔案了。

f)上面的兩種方法做出來的軟盤都只能進入 GRUB 命令模式,你可能會覺得不爽,是否可以直接進入選單呢?答案是可以的,只需要多一個步驟 :

g)把 /boot/grub/ 目錄下的 device.map ,grub.conf ,menu.lst 統統複製到 /mnt/floppy/boot/grub 目錄下,這樣就可以了。因為之前 GRUB

在軟盤上找不到配置檔案,所以自動進入命令模式,現在用它啟動機器就可以直接進入選單模式了。

十、使用 GRUB 透過網路引導作業系統

GRUB 不僅可以從本地硬碟引導作業系統,還可以透過網路引導作業系統核心。

假使你由於某種原因,無法啟動作業系統。這時你需要在別的空閒的機器上先 build 一份GRUB ,並安裝到一張軟盤上。

不過由於要支援網路功能,所以 ./configure 時有所不同了 :你必須指定啟用網路功能,和網路卡晶片的型號 :(具體參考 netboot/README.netboot 檔案)。

由於測試機器的網路卡晶片是 RTL-8139 ,所以加上 –-enable-rtl8139 ,整個過程就是(在別的空閒的機器上進行的) :
[Copy to clipboard]
CODE:
# rpm –e grub (刪除原來的 GRUB rpm,如果沒有裝就不用了)
# ./configure –-enable-diskless –-enable-rtl8139 (這是故障主機的網路卡型號)
# make
# make install
# cp –fa /usr/local/share/grub/i386-pc/* /boot/grub/
# grub-install /dev/hda
# mke2fs /dev/fd0 (格式化軟盤,建立 ext2 檔案系統)
# mount /dev/fd0 /mnt/floppy
# grub-install –-root-directory=/mnt/floppy ‘(fd0)’

檢查 /mnt/floppy 下是否有 nbgrub 和 pxegrub 兩個檔案,這兩個檔案就是用於網路啟動的。如果

沒有,就從 /boot/grub/ 目錄複製到 /mnt/floppy/boot/grub/ 目錄下。切記切記!!

這樣你就製作好了一張帶有 stage 檔案,支援網路引導,且帶有網路卡驅動的 GRUB 引導盤了。

接下來就是 TFTP 伺服器方面的工作了 :


-)1、啟動 TFTP 伺服器(編輯 /etc/xinetd.d/tftp 檔案,把 disalbe改為 no)。

-)2、檢查防火牆配置,確保故障主機可以順利訪問該 TFTP 伺服器

-)3、找出一臺和故障機器具有相同核心的主機,把 /boot/vmlinuz-2.xx 和 /boot/initrd-2.xx.img 複製到 TFTP 伺服器的 /tftpboot/boot 目錄下

-)4、把這張軟盤插入故障機器的軟碟機並用它啟動機器,就會自動進入 GRUB 命令模式。

-)5、執行 ifconfig 命令將會顯示下面的畫面



-)6、下面開始設定 ip 資訊了 :(ifconfig 命令可以分成多次執行)

-)7、現在網路卡 ip 和 TFTP 伺服器的地址都已經設定了。

-)8、下面設定 root device、kernel、initrd 。注意 root 括號中是 nd ,切記切記!!!

當你執行 boot 時,核心將被解壓並執行,一切就和往常一樣。


補充 :如果你的網路有 dhcp 伺服器,則可以直接執行 dhcp 命令來代替 ifconfig 命令獲取 ip 資訊

十一、把配置檔案嵌入到 GRUB 中

這裡介紹一種比較少見的情況。有時我們會遇到主機不帶顯示器/鍵盤,但由於某些原因需要重啟主機並訪問 GRUB,

這時怎麼辦?你可能會說用串列埠連線。不錯,透過串列埠的確可以控制 GRUB ,但有一個問題,即使你把筆記本連線到該主機上,

但啟動時 GRUB 並不會自動使用筆記本的鍵盤,又如何透過筆記本控制GRUB 呢?

GRUB 支援一個功能叫做 preset menu(預設選單),工作原理 :

a)GRUB 檢查是否啟用了 preset menu 功能,如果是的話,載入 preset menu 檔案(不是 grub.conf)

b)GRUB 載入 grub.conf ,這個過程是一定會執行的,不管有沒有 preset menu 存在。

c)在 grub.conf 被載入後,不管 grub.conf 有沒有引導專案,只要 preset menu 含有任何引導條目,都會被清掉。只有 grub.conf

檔案不可用時,preset menu 的內容才會被保留。

看到這裡,我想你應該明白 preset menu 怎麼用了。我們可以定義一個檔案 pre-menu.conf ,內容是把顯示切換到 COM1 上 ,grub.conf 則是正常的內容。

然後把筆記本接到故障主機的 COM1,啟動超級終端。再啟動故障主機,GRUB 會先把顯示切換到 COM1 ,然後載入 grub.conf ,後面的過程就和普通情況沒

有什麼不同。
[Copy to clipboard]
CODE:
要使用 preset-menu ,你必須在執行 configure 指令碼時指定 –-preset-menu ,例如
#./configure –-preset-menu=pre-menu.conf
# make
# make install
pre-menu.conf 檔案的內容就是下面兩句 :
serial –-unit=0 –-speed=9600
terminal –-timeout=0 serial

注意,當核心開始執行時,顯示也就交回給原來的主機,而不再是你的筆記本了。要解決該問題,

可以在顯示選單是進入命令模式,在 kernel 行後面加上 console=ttyS0,這樣 boot 時就可以在超級終端上看到啟動的資訊了。

不過在 login 提示符出現時,顯示輸出又會回到原來的故障主機上了。這時你可以用 secureCRT 來登入了,不需要再用到超級終端了。

整體效果如下圖 :(透過串列埠看的)

選擇引導 Red Hat 9 專案 :

一旦你不想使用preset-menu了,是否直接刪除 pre-menu.conf 就可以呢?

不可以。因為 pre-menu.conf 已經被嵌入到 grub 中了,這時留在硬碟上的 pre-menu.conf 檔案其實已經沒有用了。要象取消 preset-menu 功能,

必須重新 congfiure ,並去掉 –-enable-preset-menu 選項,再重新安裝 GRUB 。

十二、總結

寫了這麼多,現在總結一下大概的內容

a)GRUB 是一種 boot loader ,它分成兩個階段 :stage1 和 stage2(中間可能有 stage 1.5)

b)stage1 嵌入到 MBR 或者 PBR 中,stage2 留在檔案系統中。

c)build GRUB三部曲 :configure 、make、make install、

d)grub-install 和 grub shell 都可以用於安裝 stage1 ,但 grub-install 功能更加強大

e)GRUB 支援選單模式、命令模式。命令模式下的快捷鍵 :c、o、O、e、d、ESC

f)使用 GRUB 口令保護 GRUB 設定

g)GRUB 支援從網路引導作業系統,不過在編譯時事先指定 –-enable-diskless 和網路卡驅動。可惜的是,GRUB 支援的網路卡驅動不多。

h)GRUB 支援透過串列埠來訪問 GRUB 的命令和選單模式

i)GRUB 可以把配置檔案事先嵌入到 GRUB ,但刪除時也需要重灌 GRUB 。

十三、個人建議

當安裝好作業系統後,應該做好下面幾項工作

a)安裝光碟(建議刻成 ISO 檔案便於儲存)

b)製作一張 bootdisk 用於引導作業系統

c)製作一張帶檔案系統的 GRUB 引導盤用於引導 GRUB,也可以自帶配置檔案。

d)將 MBR 或者 PBR 備份成檔案

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/161840/viewspace-968285/,如需轉載,請註明出處,否則將追究法律責任。

相關文章