1. GRUB 介紹
計算機在啓動的時候,首先由BIOS中的程序執行自檢,自檢通過後,就根據CMOS的配置找到第一個可啓動磁盤的MBR中的Boot Loader程序(一般在啓動盤的第一個物理扇區,佔416字節),並把控制權交給Boot Loader,由Boot Loader進一步完成操作系統內核的加載。當Boot Loader找到內核之後,就把控制權交給操作系統內核,由內核繼續完成系統的啓動。
可以看出,Boot Loader 是計算機啓動中第二個要執行的程序,它是引導操作系統的關鍵程序。可以引導操作系統的Boot Loader主要有LiLo、GRUB以及Windows下的MBR程序。其中,GRUB是目前使用最爲廣泛,並且非常優秀的一款啓動引導程序。
(1) GRUB特性
q 提供了圖形和文本兩種操作接口
q 提供文本格式可手工修改的配置文件
q 支持動態加載需要的模塊
q 可以移植到不同的平臺上
q 支持國際化語言,如英文,中文,日文漢文等多字節語言
q 跨平臺的安裝,允許從另一個平臺上安裝GRUB
q 支持rescue模式,可用於系統無法引導的情況
q 支持多種可執行文件格式,支持各種a.out格式和ELF格式
q 多文件系統識別。如BSD FFS,DOS FAT16,FAT32和Linux ext2fs
q 支持壓縮文件的解壓縮。能夠解壓縮被gzip壓縮的文件
q 能夠使用BIOS所檢測到的全部RAM空間
q 支持硬盤的LBA模式,能夠訪問8GB以外的全部硬盤空間
q 支持網絡引導,可以通過TFTP協議從網絡上得到操作系統映象文件並引導
(2) GRUB對設備的命名
首先,GRUB對設備的命名必須包含在小括號( )內;其次,GRUB不區分IDE硬盤和SCSI硬盤,統一使用hdx,其中x指定BIOS中硬盤的編號,並從0開始計數,而且IDE硬盤編號小於SCSI硬盤;第三,GRUB用fdx指定軟盤設備,x是軟盤驅動器號。下面是一些GRUB對設備命名的舉例:
q (fd0)表示第1個軟盤
q (hd0,1)表示第1個硬盤的第2個分區
q (hd0,0)/boot/vmlinuz表示第1個硬盤的第一個分區下的boot/目錄下的vmlinuz文件。如果沒有指定某個分區,則表示使用整個設備,否則只使用指定的分區
q (hd0,2,a)專用於FreeBSD,FreeBSD有一個slice概念,把一個分區進一步分爲幾個slice,此處指明是第1塊硬盤的第3個分區中的slice a
(3) GRUB的執行流程
GRUB的工作原理如圖5.2所示。當系統加電後,固化在BIOS中的程序首先對系統硬件進行自檢,自檢通過後,就加載啓動磁盤上的MBR,並將控制權交給MBR中的程序(stage1),stage1執行,判斷自己是否GRUB,如果是且配置了stage1_5,則加載stage1_5,否則就轉去加載啓動扇區,接着,stage2被加載並執行,由stage2藉助stage1_5驅動文件系統,並查找grub.conf,顯示啓動菜單供用戶選擇,然後根據用戶的選擇或默認配置加載操作系統內核,並將控制權交給操作系統內核,由內核完成操作系統的啓動。
圖4-2 GRUB執行流程
從上面的敘述可以看出,GRUB涉及到幾個重要的文件:
第一個就是stage1。它被安裝在MBR扇區(0面0磁道的第1扇區),大小爲512字節(446字節代碼+64字節分區表+2字節標誌55AA),它負責加載存放於0面0道第2扇區的start程序。
第二個是stage1_5。stage1_5負責識別文件系統和加載stage2,所以stage1_5往往有多個,以支持不同文件系統的讀取。在安裝GRUB的時候,GRUB會根據當前/boot/分區類型,加載相應的stage1_5到0面0磁道的第3扇區。stage1_5是由start加載的。
第三個是stage2。它負責顯示啓動菜單和提供用戶交互接口,並根據用戶選擇或默認配置加載操作系統內核。同前兩個文件不同,stage2是存放在磁盤上/boot/grub下。
第四個是menu.lst(/boot/grub/grub.conf的鏈接)。grub.conf是一個基於腳本的文本文件,其中包含菜單顯示的配置和各個操作系統的內核加載配置。GRUB根據grub.conf顯示啓動菜單,提供同用戶交互界面。GRUB正是根據用戶選擇或默認配置和grub.conf的內核配置加載相應的內核程序,並把控制權交給內核程序,使得內核程序完成真正的操作系統的啓動。
其它重要文件,GRUB除了上面敘述的主要文件之外,還包括支持交互功能的一些磁盤程序。主要包括/sbin/下的grub、grub-install、grub-md5-crypt和grub-terminfo和/usr/bin/mbchk,以及/boot/grub下的設備映像文件(device.map)和菜單背景圖像文件(splash.xpm.gz)。
通過上面的分析總結,可以很容易地看出,GRUB實際上包含兩部分,一部分被安裝在磁盤的特殊扇區,另外一部分則以文件的形式存在。要讓GRUB啓動操作系統,就必須首先把GRUB的stage1和stage1_5(根據文件系統自動選擇是否安裝)安裝到磁盤的特殊扇區,另外,在磁盤的/boot/grub下存在有grub.conf、device.map等文件和支持交互的程序,而且這些程序必須在PATH環境變量指定的路徑中。具備了這些知識,相信不管是安裝、配置、備份或修復GRUB都不是件很難的是情。下面,就來逐個講解這些知識。
2. 編譯安裝GRUB
一般情況下,當完成Linux操作系統的安裝後,系統中已經安裝好了LILO或GRUB引導程序。由於系統出現故障或需要更換LILO爲GRUB時,需全新或重新安裝GRUB。如何安裝和配置GRUB就是下面要介紹的內容。而有時候,GRUB出現了故障,但並不需要重新安裝,從後面的內容中,讀者也可以讀到如何修復GRUB的知識。
(1) 下載安裝包
可以從ftp://alpha.gnu.org/gnu/grub/下載GRUB的源碼。具體安裝方法請參考下面的內容,這裏的安裝過程都是在RHEL 4中進行的。
(2) 檢查是否安裝GRUB
#rpm -q grub
如果顯示grub-0.95-3.5或其它版本的GRUB的信息,說明系統已經安裝了,則執行如下命令首先將其卸載:
#rpm -e grub
(3) 編譯源碼安裝
a.) 編譯條件
要編譯GRUB的源代碼,系統必須具備以下條件:
q GCC2.95或者以上版本
q 安裝了GNU Make
q binutils2.9.1.0.23或者個更高版本
q Texinfo 4.0或者更高版本
q Autoconf 2.5x
q Automake 1.7 或者更高版本
b.) 編譯安裝
這裏,假設下載的GRUB源代碼爲grub-0.95.tar.gz,並放在~/(當前用戶的主目錄)下。通過編譯源代碼安裝GRUB的基本過程如下:
#tar -zxvf grub-0.95.tar.gz #解壓源代碼
#cd grub-0.95 #轉入grub目錄
#./configure #生成Makefile文件
#make install #編譯代碼並安裝
(4) 安裝GRUB到MBR
GRUB的工作目錄是在/boot/grub下,而make install並沒將其安裝到/boot/grub。所以,安裝完成後要執行如下一些操作:
a) 把/usr/local/share/grub/i386-pc/目錄下的所有文件統統拷貝到/boot/grub/目錄下
#cp /usr/local/share/grub/i386-pc/* /boot/grub/
b) 在/boot/grub下創建grub.conf文件,並建立一個到grub.conf的軟鏈接menu.lst
#cd /boot/grub
#touch grub.conf
#ln -s grub.conf menu.lst
注意!如果已經存在grub.conf,就最好不要再次創建,需要時直接修改即可。
c) 確認/usr/local/sbin和/usr/local/bin在PATH變量的值中,執行如下命令檢查
#env |grep PATH
如果發現/usr/local/sbin和/usr/local/bin不在PATH變量中,可以通過如下命令修改:
#export PATH=$PATH /usr/local/sbin:/usr/local/bin
d) 安裝GRUB到MBR
GRUB在啓動中,被BIOS調用,只有放在MBR中才可以被調用,所以,GRUB要讓BIOS調用,就必須安裝在MBR中。實際上是將stage1安裝到MBR中,也可能根據文件系統選擇安裝了stage1_5。下面,提供幾個安裝GRUB的例子:
#grub-install /dev/hda //將GRUB安裝到第1塊IDE硬盤的MBR
#grub-install /dev/sda //將GRUB安裝到第1塊SCSI硬盤的MBR
#grub-install /dev/fd0 //將GRUB安裝到軟盤
#grub-install /dev/hda1 //將GRUB安裝到第1快硬盤的0扇區,當用其它引導程序引導系統時,往往選擇這種方式,以免覆蓋其它引導程序。
e) 在GRUB的命令行模式下安裝GRUB
關於GRUB命令行模式及其操作方法請參考3小節的內容。在系統顯示啓動菜單時候按下c鍵,或者系統啓動後在命令行執行/usr/sbin/grub程序,都可以進入GRUB的命令行模式。命令行模式下安裝GRUB的基本過程如下:
q 指定啓動設備
grub>root (hd0,0) #除了root後必須有空格,別的位置均不能有空格!
此處(hd0,0)是指第1塊硬盤的第1個分區。如果不能確定包含GRUB的stage1文件的分區,可以通過find指令查找確定:
grub> find /boot/grub/stage1 #查找stage1
GRUB將會查找文件/boot/grub/stage1並顯示包含這個文件的設備名,這個設備就是上面要用到的設備。
q 安裝GRUB
grub> setup (hd0) #除了setup後必須有空格,別的位置均不能有空格!
這條命令將會在第1塊硬盤的MBR安裝GRUB,如果不想在MBR安裝GRUB,而是希望將GRUB安裝在某分區的引導扇區的話,可以用下面的命令安裝:
grub> setup (hd0,0) #除了setup後必須有空格,別的位置均不能有空格!
這將會在第1塊硬盤的第1個分區的引導扇區安裝GRUB。
q 退出GRUB
grub>quit
f) 重啓機器,新安裝的GRUB生效
3. GRUB的交互操作
爲了方便用戶交互使用GRUB,GRUB提供了交互模式,下面分別作一介紹:
(1) 命令行模式
登陸Linux系統後,在命令行中輸入grub,便可以進入到命令行模式。如圖4-3所示。進入命令行模式後GRUB會給出一個命令提示符“grub>”,此時就可以鍵入命令,按回車執行。此模式下允許類似於Bash shell的命令行編輯功能:
q <C-f>或<右箭頭鍵> 光標右移一個字符
q <C-b>或<左箭頭鍵> 光標左移一個字符
q <C-a><HOME> 到這一行的開頭
q <C-e>或<END> 到行尾
q <C-d>或<DEL> 刪除光標處的字符
q <C-h>或<BackSpace> 刪除光標左邊的字符
q <C-k> 刪除光標右邊的所有字符(包括光標處的字符)
q <C-u> 刪除光標左邊的所有字符(包括光標處的字符)
q <C-y> 恢復上次刪除的字符串到光標位置
q <C-p>或<向上鍵> 歷史記錄中的上一條命令
q <C-n>或<向下鍵> 歷史記錄中的下一條命令
圖4-2 啓動時GRUB命令行模式
在命令行模式下<tab>鍵有補全命令的功能,如果你敲入了命令的前一部分,鍵入<tab>系統將列出所有可能以你給出的字符串開頭的命令。如果你給出了命令,在命令參數的位置按下<tab>鍵,系統將給出這條命令的可能的參數列表。
在計算機啓動的時候,GRUB首先顯示啓動菜單,這是如果用戶按鍵盤的“c”鍵,便進入如圖4-4所示的命令行模式,它的操作和在Linux的命令行模式是一樣的。
(2) 菜單模式
系統在啓動時,如果找到/boot/grub/menu.lst,則grub顯示grub並進入菜單模式,如圖4-4所示。菜單模式下用戶可以選擇要啓動的操作系統,或者修改配置。菜單的定義在menu.lst文件中,也可以從菜單模式按<c>鍵進入命令行模式,並且可以按<ESC>鍵從命令行模式返回菜單模式。菜單模式下按<e>鍵將進入菜單編輯模式。
(3) 菜單編輯模式
菜單編輯模式用來對菜單項進行編輯改變,其界面和菜單模式的界面十分類似,不同的是菜單中顯示的是對應某個菜單項的命令列表。如果在編輯模式下按下<ESC>,則取消所有當前對菜單的編輯並回到菜單模式下。在編輯模式下選中一個命令行,就可以對這條指令進行修改,修改完畢後按下回車,GRUB將提示你確認並完成修改。如果你想在當前命令列表中增加一條命令,按<o>在當前命令的下面增加一條指令,按<O>在當前命令前處增加一條指令,按<d>刪除一條指令。
在實際中,菜單模式用於選擇要啓動的操作系統,菜單編輯模式用於臨時修改編輯啓動菜單,這樣的修改可疑通過命令寫入MBR活指定的分區,但並不影響grub.conf。命令行模式也是一樣,可以通過命令方式動態啓動一個操作系統,同時也不影響grub.conf。所以,菜單編輯模式和命令行模式常常用來安裝GRUB到MBR或動態引導一個操作系統。而GRUB的配置文件,則是系統啓動時GRUB程序必須加載的配置文件,這個文件中有關於GRUB的各種配置。不需要用戶每次啓動都執行繁瑣的命令了。
4. GRUB配置文件
grub.conf是GRUB的配置文件,其結構比較簡單,可以分爲兩部分,第一步分是全局配置,另外一部分就是每個操作系統的啓動配置。其中可以有多個操作系統的菜單配置。下面就是一個具體的例子。
#=================/boot/grub/grub.conf文件範例==================
timeout 30 # 等待用戶選擇菜單項的時間(以秒計),超時則引導默認的選項
default 0 # 默認選項,第一項
fallback 1 # 如果第一項出錯,則啓動下面的後備選項
splashimage=(hd0,0)/grub/splash.xpm.gz #GRUB啓動畫面
#以下是啓動Linux的配置
titleRed Hat Linux Enterprise AS3 for syd168 #啓動項的菜單標題
root (hd0,0) #指定根文件系統,第1塊硬盤第1個扇區中的/boot。
kernel /vmlinuz-
initrd /initrd-
#以下是啓動Windows的配置,如果只有Linux就不需要
title Windows2003 Enterprise for syd168 #Windows啓動菜單標題
root noverify(hd0,1) #該操作系統在hd0的第二分區,不mount
chainloader +1 #從第一個硬盤的第二個分區引導Windows
#=================/boot/grub/grub.conf文件範例==================
上面的例子,只是簡單說明了GRUB中啓動Linux和Windows的配置方法。更多的啓動配置請參考下面內容。
5. 引導多系統配置
GRUB支持多操作系統引導。用GRUB引導後可以進入命令行模式或者菜單模式,可以通過靈活的命令行模式選擇引導各個分區的操作系統,指定引導參數。GRUB支持三種引導方法,一種是直接引導操作系統內核,另一種是通過chainload進行間接引導,第三種就是通過網絡引導操作系統。
對於GRUB能夠支持的Linux,FreeBSD,OpenBSD,NetBSD,GUN Mach等可以通過直接引導完成,但是對於GRUB不支持的操作系統(如Windows),需要用第二種方法chainload來完成。下面就分別來看看這幾種引導方法:
(1) 直接引導
配置過程通常如下:
a) 用root命令設置包含操作系統內核的根設備
b) 用kernel命令裝載內核映象文件,如果這個內核引導的時有參數的話,可以直接將參數加在內核文件名的後面
c) 用module或modulenounzip裝載內核模塊
d) boot開始引導
(2) chainload引導
a) 設置GRUB的根設備,用rootnoverify (hdx,y)指定
b) 開始引導,用chainloader +1指定,此處“+1”是指示GRUB讀入分區的第一個扇區的引導記錄。
c) 執行boot開始引導
以上是一般的chainloader方式,對於DOS和WINDOWS,可以簡單地用兩條指令進行引導:chainloader (hdx,y)+1,然後boot,其中x,y用來指明所在分區號。
(3) 從網絡引導:
爲了使GRUB能夠支持從網絡引導,需要在編譯時打開網絡支持選項(請參考源文件中的netboot/README.netboot)。另外,要在網絡中設置兩個服務:動態IP服務(BOOTP、DHCP或RARP)和FTP服務。然後,分別針對不同的服務器BOOTP,DHCP或RARP運行bootp,dhcp或rarp。如果一切設置無誤的話GRUB就會給出IP,IP netmask和TFTP服務器的IP和網關的IP地址。最後,從網上得到操作系統的映象文件。下面是一個例子:
grub> bootp
Probing...[NE*000]
NE2000 base ...
Address: 192.168.110.23 Netmask: 255.255.255.0
Server: 192.168.110.14 Gateway: 192.168.110.1
grub> root (nd)
grub> kernel /tftproot/gnumach.gz root=sd0s1
grub> module /tftproot/serverboot.gz
grub> boot
(4) 操作系統引導距離
a) GNU/Linux
grub> root (hd1,3)
grub> kernel /vmlinuz root=/dev/hda1
如果你需要指定內核啓動參數的話,可以直接加到命令的最後面如:
grub> kernel /vmlinuz root=/dev/hda1 vga=ext
如果你使用initrd的話,在kernel命令之後執行:
grub> initrd /initrd
grub> boot
b) FreeBSD
GRUB能夠直接裝載.ELF和a.out兩種格式的內核,但是由於FreeBSD的內核引導接口有時有較大的變動,所以,對FreeBSD最安全的引導方法是引導/boot/loader。
grub> root (hd0,a)
grub> kernel /boot/loader
grub> boot
c) NetBSD,OpenBSD,NetBSD
這三種系統的引導指令序列一樣,如下:
q 用root命令設置根設備
q 用kernel裝載內核
q 用boot'引導系統
d) DOS/Windows
grub> rootnoverify (hd0,0)
grub> chainloader +1
grub> boot
e) SCO UnixWare
grub> rootnoverify (hd1,0)
grub> chainloader --force +1
grub> makeactive
注意,最後的這條指令將設置Unix Ware分區爲活動分區,這樣要求你的GRUB安裝在MBR,否則下次啓動時將直接進入UnixWare而不會進入GRUB grub>
當然,如果每次引導都需要敲入命令的話實在是太麻煩了,因此,類似於LILO,GRUB提供了一個菜單方式,只要將這些命令放入配置文件中就可以實現菜單方式的多引導。當然在菜單方式下你可以切換到命令模式下。GRUB引導時查找/boot/grub/menu.lst,如果存在這個文件的話,就根據這個文件生成一個引導菜單,menu.lst文件格式請參考後面的內容。
6. GRUB的安全配置
對於Linux系統,root帳號有着之高無尚的權限。但即使root帳號沒有被盜竊,黑客照樣可能登陸系統竊取機密。可以在啓動的時候,通過在Linux啓動菜單的kernel行最後加入“1”或“single”進入單用戶模式,直接可以修改root密碼。另外,有時候一臺計算機上安裝了多個操作系統,有些系統必須在授權後纔可以啓動。
爲了保護GRUB在未被授權下的修改和一些系統在授權下才可啓動的目的,GRUB提供了密碼驗證功能,只有通過密碼驗證才能在啓動時候進入命令行狀態修改GRUB或啓動需要密碼驗證的操作系統。
GRUB的菜單密碼是在grub.conf配置文件中實現的。GRUB提供的密碼級別有兩種,一種是全局的密碼,即進入命令行前都必須輸入的密碼,另外就是隻針對修改特定菜單項時必須輸入的密碼。GRUB密碼可以是明文的或MD5加密的。
如果是明文密碼,格式爲:password 明文密碼串,如:
password 123456;
如果是MD5加密的密碼,格式爲:password --md5 md5密碼串,如:
password --md5 XJjfsddf33444%%$^$^$###。下面是一個具體的例子:
#=================包含密碼的grub.conf文件範例==================
password --md5 <進入GRUB命令行模式的密碼>
timeout=30
default=0
title “Red Hat Enterprise Linux 4 for syd168”
password --md5 <啓動RHEL 4驗證密碼>
root (hd0,1)
kernel /vmlinuz ro root=LABEL=/
initrd /initrd-xxx.img
title “Windows 2003 Enterprise Edition for syd168”
password --md5 <啓動Windows 2003驗證密碼>
rootnoverify (hd0,0)
chainloader +1
#=================包含密碼的grub.conf文件範例==================
對於這個配置,當GRUB顯示菜單的時候,必須按下p並輸入對應的密碼才能進入命令模式,如果選擇 “Red Hat Enterprise Linux 4 for syd168”並按下回車,會出現提示信息,要求輸入密碼,這時應該輸入密碼,密碼正確後纔可以啓動該系統。
--md5告訴GRUB後面的內容是已經用md5算法加密過的了。所以GRUB會將用戶輸入的口令用MD5(由grub-crypt完成)加密後再與之比較。要產生MD5密碼,可以把在命令模式下用md5crypt命令或在shell下執行grub-md5-crypt得到的MD5加密串複製到配置文件中即可。
7. GRUB的修復
GRUB雖然提供了方便的啓動管理功能,但某些情況下,可能因爲誤操作或者系統故障導致GRUB被破壞或丟失。如何恢復被破壞的GRUB是很多讀者頭痛的問題。其實GRUB的修復並不是很難,只要懂得GRUB的基本工作原理,就可以很容易地修復它。
下面,我們介紹兩種修復GRUB的方法,即用安裝光盤和用備份軟盤修復的方法。
(1) 用安裝光盤修復GRUB
a.) 用安裝光盤啓動計算機
首先修改計算機的CMOS配置,並準備好RHEL 4的安裝光盤。然後啓動計算機,系統會自動從光盤啓動。
b.) 選擇rescue修復模式
當計算機啓動後,會顯示如圖4-5所示的畫面,在最後行輸入如下命令並按回車:
boot:linux rescue
這時候,安裝程序會自動進入緊急修復模式。首先顯示語言,鍵盤等基本配置。建議語言選擇中選擇簡體中文,後面會出現網絡配置,可以選擇不配置網絡。隨後會出現圖4-6的畫面,提示查找系統中安裝的RHEL 4並將其掛載在/mnt/sysimage下。這裏直接按回車即可,隨後出現圖4-7,表示找到已經安裝的RHEL 4,並要將其掛在在/mnt/sysimage下,而且提示可以將其切換爲根。這裏也是按回車即可。然後就進入Linux 的命令行狀態。
c.) 改變根路徑
按照上面的提示,首先切換目錄/mnt/sysimage爲根。輸入如下命令即可:
#chroot /mnt/sysimage
這時候,/就和正常的Linux一樣了。
d.) 運行grub修復GRUB
現在,就可以開始修復GRUB了。只要執行如下幾個命令即可:
#grub #執行grub交互程序
grub>find /boot/grub/stage1 #查找stage1所在的設備
(hd0,0) #顯示查到的結果
grub>root (hd0,0) #設置根設備
grub>setup (hd0) #安裝GRUB 到MBR
grub>quit #退出GRUB
e.) 退出系統並重新啓動系統
#exit #退出chroot
#exit #退出linux並重新啓動
執行完上述兩條命令後,系統就會重新啓動。丟失的GRUB就再次出現了。當然,如果GRUB的破壞很利害,導致很多文件都丟失。則可以按照前面的指示,重新安裝GRUB。在RHEL 4的安裝光盤中本身就包含GRUB的安裝包。
當然,也可以通過啓動軟盤修復GRUB。但現在計算機上使用軟盤的機率已經很小了,所以這裏就不再囉嗦了。當然,也可以通過可啓動的U盤修復硬盤上的GRUB,由於篇幅的關係,這裏討論了。感興趣的讀者可以參考網絡上的資料。
8. GRUB網絡引導
GRUB 不僅可以從本地硬盤引導操作系統,還可以通過網絡引導操作系統內核。假使你由於某種原因,無法啓動操作系統。這時你需要在別的空閒的機器上先build一份GRUB,並安裝到一張軟盤上不過由於要支持網絡功能,所以./configure時有所不同了,必須指定啓用網絡功能,和故障機器網卡芯片的型號(具體參考netboot/README.netboot 文件)。假設機器的網卡芯片是RTL-8139,執行configure時加上–-enable-rtl8139:
# rpm –e grub #刪除原來的GRUB,如果沒有裝就不用執行該命令了
# ./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
# 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文件,把disable改爲no)。
2、檢查防火牆配置,確保故障主機可以順利訪問該TFTP服務器
3、找出一臺和故障機器具有相同內核的主機,把/boot/vmlinuz-2.xx和/boot/initrd-2.xx.img拷貝到TFTP服務器的/tftpboot/boot目錄下
4、把這張軟盤插入故障機器的軟驅並用它啓動機器,就會自動進入GRUB命令模式。
5、執行ifconfig命令將會顯示IP配置畫面
6、設置ip信息
7、現在網卡 ip 和 TFTP 服務器的地址都已經設置了。
8、設置 root device、kernel、initrd 。注意 root 括號中是nd。
當你執行boot 時,內核將被解壓並執行,一切就和往常一樣。補充 :如果你的網絡有 dhcp 服務器,則可以直接執行 dhcp 命令來代替 ifconfig 命令獲取 ip 信息
9. GRUB常用命令
(1) 僅用於配置文件中配置菜單的命令
命令 |
說 明 |
default num |
設置默認啓動的項目。num爲0表示第一項,爲1表示第二項 |
fallback num |
設置默認項啓動失敗後啓動的項 |
hiddenmenu |
隱藏該菜單項,除非在timeout內用戶按下了ESC鍵 |
timeout second |
設置啓動默認操作系統前,等待用戶按鍵時間,單位爲秒 |
title description |
設置菜單顯示的提示信息。 |
(2) 在菜單(不包括菜單項內部的命令)和命令行方式下都可用的命令
命令 |
說 明 |
|
device |
定義BIOS中的磁盤設備和操作系統的磁盤設備之間的映射關係 |
|
serial |
用於初始化一個串口設備 |
|
terminal |
用於切換顯示輸出 |
|
splashimage |
用於定義啓動時的背景圖片。例如splashimage grub/splash.xpm.gz |
|
blocklist |
用於顯示某個文件在文件系統中的位置,以block list的形式顯示 |
|
root |
用於指定含有stage文件的分區 |
|
rootnoverify |
和root類似,但不會嘗試掛載該分區。 |
|
chainloader |
用於加載另外一個Boot loader,通常是用於加載windows的Boot loader |
|
geometry |
用於顯示或者設置某個硬盤的 CHS 參數,同時還顯示分區信息 |
|
halt |
關機 |
|
reboot |
重啓機器 |
|
kernel |
指定操作系統內核文件,還可以在內核文件名後加上參數 |
|
initrd |
用於指定 RAM Disk 文件,例如 initrd /initrd-2.xx.img |
|
boot |
引導kernel所指定的內核 |
|
setup |
用於安裝stage1到磁盤的MBR或者某個分區的引導扇區 |
|
(3) 菜單內部和命令行下通用命令
命令 |
說 明 |
|
bootp |
以BOOTP協議初始化網絡設備。 |
|
color normal |
改變菜單的顏色。 |
|
dhcp |
用DHCP協議初始化網絡設備。 |
|
rarp |
用RARP協議初始化網絡設備。 |
|
(4) 僅用於命令行方式或者菜單項內部的命令
命令 |
說 明 |
|
boot |
在命令行模式用這條指令啓動操作系統 |
|
chainloader |
把file裝入內存進行chainload |
|
configfile |
將FILE作爲配置文件替代menu.lst。 |
|
initrd file |
爲Linux格式的啓動映象裝載初始化的ramdisk |
|
kernel file |
裝載內核映象文件 |
|
makeactive |
使當前的分區成爲活躍分區 |
|
quit |
退出GRUB shell |
|
root device |
將當前根設備設爲device |
|
rootnoverify |
和root類似,但是不mount該設備。 |
|
setup |
安裝GRUB引導在install_device上。 |
|
10. GRUB 常見錯誤信息
出錯信息可以分成3類,stage1階段的、stage 1.5階段的、stage2階段。後兩個可以合在一起。
(1) Stage1 階段可能出現的錯誤
GRUB 對於該階段出現的錯誤一般是打印一個出錯信息並掛起機器,除非按CTRL-ALT-DEL重啓。
a)Hard Disk Error:表示無法判讀stage1_5文件所在的磁盤的大小和CHS參數
b)Floppy Error:表示無法stage1_5文件所在的軟盤的大小和CHS參數
c)Read Error:表示無法讀取stage1_5文件或者stage2文件
d)Geom Error :stage2或者stage1_5位於 BIOS 的 read 調用可以訪問的範圍之外。
(2) Stage1_5/2 階段可能出現的錯誤
一般會打印一個“Error <N>”的錯誤信息,並根據錯誤的嚴重程度看是否繼續進行。
11. 編譯參數
在編譯的時候,可能根據需要配置編譯參數,下面就介紹幾個configure過程中可能用到的選項,要獲得完整的選項列表,可以參看GRUB源代碼中的INSTALL文件和netboot中的README.netboot文件。
q --enable-preset-menu=FILE:默認情況下grub.conf和stage2文件是分離的,使用該選項,可以直接把配置文件嵌入到stage2中,這樣啓動時可以立即獲得配置文件。對於一些嵌入式的系統來說比較有用。
q --enable-diskless:如果使用了該選項,會得到額外的兩個文件,nbgrub和pxegrub。同時需要如下支持網絡驅動(netboot目錄包含支持的網卡驅動)選項的某一個,如:
l --enable-eepro100 #Intel Etherexpress Pro/100
l --enable-ne2100 #Novell NE2100 and NE1500
l --enable-rtl8139 #Realtek 8139、SMC 1211、DFE538TX
l --enable-3c90x #3Com90x
安裝結束後,GRUB默認被安裝在/usr/local/bin和/usr/local/sbin下。stage文件則放在/usr/local/share/grub/i386-pc/目錄下。如果要修改默認安裝位置,可以在.configure後添加參數—prefix=PATH參數,這裏的PATH是要安裝的路徑。