源碼:--------------------------------------------------------------------------------一. GRUB的技術特點:
1. 支持多可執行文件格式
GRUB支持各種a.out格式和ELF格式。
2. 支持不符合Multiboot標準的內核
GRUB能夠直接支持多種并不符合Multiboot標準的自由操作系統內核(主要是FreeBSD,NetBSD,OpenBSD和 linux)。也能通過chainload間接引導非開放的其他操作系統。
3. 支持操作系統模塊裝載。
4. 提供文本格式可手工修改的配置文件。
5. 菜單界面
6. 靈活的命令行界面
7. 多文件系統識別
能夠透明地識別多種文件系統,現在能夠識別的文件系統有BSD FFS,DOS FAT16,FAT32和Linux ext2fs.這個范圍仍然在擴展。
8. 支持壓縮文件的解壓縮。
能夠解壓縮被gzip壓縮的文件,并且這個識別和解壓過程是自動的和對用戶透明的,這個功能大大地減少了文件的大小,減少了load的時間,這個功能對于軟盤上的系統尤其有用。
可能有些內核模塊在裝載時要求是壓縮狀態,這時解壓此模塊可能會畫蛇添足,所以GRUB提供了另一不進行解壓縮的模塊裝載命令。
9. 可以讀取任何已安裝的設備上的數據
支持讀取軟盤,硬盤上的數據,不依賴于根設備上任何的設置。
10. 和磁盤定位的表示方法無關。
11. 能夠使用BIOS所檢測到的所有RAM.
GRUB通常能夠找到PC兼容機上的全部RAM,它采用一種先進的BIOS查詢技術來找到所有的內存空間。
12. 支持硬盤的LBA模式
GRUB通過支持LBA模式,突破1024柱面的限制,能夠訪問8GB以外的全部硬盤空間。
13. 支持網絡
雖然GRUB是一個基于磁盤的引導程序,但是它也支持網絡功能,你可以通過TFTP協議從網絡上得到操作系統映象文件并引導。
GRUB的后繼版本可能會包括一個內置的可編程語言來支持各種內核的引導參數,這還只是一個操作系統引導器嗎?;),并且計劃加入對非PC體系結構的支持。
下載并安裝GRUB
下載GRUB包
你可以到<ftp://alpha.gnu.org/gnu/grub/grub-0.5.94.tar.gz>得到GRUB,然后:
zcat grub-0.5.94.tar.gz | tar xvf -
會生成一個目錄grub-0.5.94,再:
cd grub-0.5.94
./configure
make install
這樣GRUB就安裝好了,下面你需要在你的硬盤或者軟盤引導區上安裝GRUB引導代碼。
制作GRUB引導軟盤:
cd /boot/grub
dd if=stage1 of=/dev/fd0 bs=512 count=1
dd if=stage2 of=/dev/fd0 bs=512 seek=1
制作GRUB硬盤引導:
重啟動用GRUB引導軟盤引導,或者你不想重啟動也可以執行/usr/sbin/grub。兩種情況都會進入命令行界面。 然后,我們首先要設置GRUB的“根設備”,也就是告訴GRUB安裝所在的分區:
grub> root (hd0,0)
這里牽涉到GRUB的設備命名規則,將在下面介紹,此處(hd0,0)是指第一塊硬盤的第一個分區。
如果你不能夠確定安裝GRUB所在的分區號的話,可以通過find指令查找:
grub> find /boot/grub/stage1
GRUB將會查找文件/boot/grub/stage1并顯示包含這個文件的設備名,當然就是我們安裝GRUB所在的分區。下面就可以寫引導記錄了:
grub> setup (hd0)
這條命令將會在第一塊硬盤的MBR安裝GRUB引導,如果你不想在MBR安裝GRUB,而是希望將GRUB安裝在分區的引導扇區的話,你可以用下面指令指定安裝設備:
grub> setup (hd0,0)
這將會在第一塊硬盤的第一個分區的引導扇區安裝GRUB。
OK,現在你就可以重新啟動由GRUB引導你的系統。
設備命名規則
首先GRUB對設備的命名必須包含在小括號內,GRUB不區分IDE硬盤和SCSI硬盤,統一使用hdx,其中x指定BIOS中硬盤的編號,從零開始計數,而且通常計算機內的IDE硬盤編號在SCSI硬盤前。GRUB用fdx指定軟盤設備,x是軟盤驅動器號。具體命名規則如下:
(fd0):第一軟驅,GRUB還可以引導軟盤上的操作系統
(hd0,1): 第一塊硬盤的第二個分區。
(hd1,4): 第二塊硬盤的第一個擴展分區,擴展的分區是從4開始編號的。
(hd0,2,a): 專用于FreeBSD,FreeBSD有一個slice概念,把一個分區進一步分為幾個slice,此處指明是第一塊硬盤的第三個分區中的slice a。你也可以用(hd0,a),這樣GRUB就會在第一塊硬盤上找到第一個FreeBSD分區的slice a。
讓我們再來看看GRUB對于磁盤文件的命名方法:
(hd0,1)/vmlinuz,很簡單只要指定分區號和文件的絕對路徑名就可以了。
引導多系統
現在來看看如何用GRUB引導我們的多操作系統,用GRUB引導后可以進入命令行模式或者菜單模式,你可以通過靈活的命令行模式選擇引導各個分區的操作系統,指定引導參數。
GRUB支持三種引導方法,第一種是直接引導操作系統內核,第二種是通過chainload進行間接引導。
對于GRUB能夠支持的LINUX,FreeBSD,OpenBSD,NetBSD,GUN Mach可以通過直接引導完成,不需要其他的引導扇區了,但是對于GRUB不直接支持的操作系統,需要用第二種方法chainload來完成。另外GRUB還支持網絡引導,我們分別來看看這幾種引導方法:
?。╝) 直接引導:
通常步驟如下:
1.用root命令設置包含操作系統內核的根設備
2.用kernel命令裝載內核映象文件,如果這個內核引導的時候有參數的話,可以直接將參數加在內核文件名的后面。
3.用module或modulenounzip裝載內核模塊。
4.boot開始引導。
?。╞) chainload引導:
1.首先設置GRUB的根設備,用:
grub> rootnoverify (hdx,y)
2.開始引導
grub> chainloader +1
此處'+1'是指示GRUB讀入分區的第一個扇區的引導記錄。
3.執行boot開始引導
以上是一般的chainloader方式,對于DOS和WINDOWS,可以簡單地用兩條指令進行引導:
chainloader (hdx,y)+1,然后boot,其中x,y用來指明所在分區號。
?。╟) 從網絡引導:
為了使GRUB能夠支持從網絡引導,你需要在編譯時打開網絡支持選項,關于這個你可以參考源文件目錄里的.netboot/README.netboot為了從網絡引導,你首先要在網絡設置兩個服務,首先是動態IP配置服務,可以是BOOTP,DHCP或RARP服務器,另一個是TFTP服務。
然后分別針對不同的服務器BOOTP,DHCP或RARP(三個選一個)運行bootp,dhcp,rarp。如果一切設置無誤的話GRUB就會給出IP,IP netmask和TFTP服務器的IP和網關的IP地址。最后,從網上得到操作系統的映象文件,網絡的設備名稱是(nd).如下例:
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
實例
GNU/Hurd
--------
因為GNU/Hurd是符合Multiboot規范的操作系統,所以非常容易引導:
grub> root (hd0,2)
如果你不記得Hurd所在的分區號的話,可以用find /boot/gnumach查找。
grub> kernel /boot/gnumach root=hd0s1
grub> module /boot/serverboot
grub> boot
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
FreeBSD
-------
GRUB能夠直接裝載.ELF和a.out兩種格式的內核,但是由于FreeBSD的內核引導接口有時有較大的變動,所以,對FreeBSD最安全的引導方法是引導/boot/loader
grub> root (hd0,a)
grub> kernel /boot/loader
grub> boot
NetBSD,OpenBSD,NetBSD
-------------------------------------
這三種系統的引導指令序列一樣,如下:
1. 'root'設置根設備.
2. `kernel'裝載內核.
3. `boot'引導.
DOS/Windows
-----------
grub> rootnoverify (hd0,0)
grub> chainloader +1
grub> boot
SCO UnixWare
------------
grub> rootnoverify (hd1,0)
grub> chainloader --force +1
grub> makeactive //注意這條指令將設置UnixWare分區為活動分區,這樣要求你的GRUB安裝在MBR,否則下次啟動時將直接進入UnixWare而不會進入GRUB grub> boot
當然,如果每次引導都需要敲入命令的話實在是太麻煩了,因此,類似于LILO,GRUB提供了一個菜單方式,你需要一個配置文件將這些命令放入配置文件中就可以實現菜單方式的多引導,當然在菜單方式下你可以切換到命令模式下。GRUB引導時查找/boot/grub/menu.lst,如果存在這個文件的話,就根據這個文件生成一個引導菜單,menu.lst文件格式很簡單。
菜單設置
# 等待用戶選擇菜單項的時間(以秒計),超時則引導默認的選項
timeout 30
# 默認選項,第一項
default 0
# 如果第一項出錯,則啟動下面的后備選項
fallback 1
# 引導 GNU Hurd,其中title就是菜單中顯示的提示字符串
title GNU/Hurd
root (hd0,0)
kernel /boot/gnumach.gz root=hd0s1
module /boot/serverboot.gz
# 引導 Linux
title GNU/Linux
root (hd1,0)
kernel /vmlinuz root=/dev/hdb1
# 引導Mach (kernel映象文件放在軟盤)
title Utah Mach4 multiboot
root (hd0,2)
pause Insert the diskette now!!
kernel (fd0)/boot/kernel root=hd0s3
module (fd0)/boot/bootstrap
# 引導 FreeBSD
title FreeBSD 3.4
root (hd0,2,a)
kernel /boot/loader
# 引導 OS/2
title OS/2
root (hd0,1)
makeactive
chainloader +1
# 引導 Windows NT 或者 Windows95,98
title Windows NT / Windows 95,98 boot menu
rootnoverify (hd0,0)
chainloader +1
# 安裝 GRUB 到硬盤MBR
title Install GRUB into the hard disk
root (hd0,0)
setup (hd0)
# 改變顯示菜單的顏色
title Change the colors
color light-green/brown blink-red/blue
用戶界面
GRUB的用戶界面有三種:命令行模式,菜單模式和菜單編輯模式
?。╝) 命令行模式:
進入命令行模式后GRUB會給出一個命令提示符`grub>`,此時就可以鍵入命令,按回車執行。此模式下可執行的命令是在menu.lst中可執行的命令的一個子集。此模式下允許類似于Bash shell的命令行編輯功能:
<C-f>或<右箭頭鍵> 光標右移一個字符
<C-b>或<左箭頭鍵> 光標左移一個字符
<C-a><HOME> 到這一行的開頭
<C-e>或<END> 到行尾
<C-d>或<DEL> 刪除光標處的字符
<C-h>或<BackSpace> 刪除光標左邊的字符
<C-k> 刪除光標右邊的所有字符(包括光標處的字符)
<C-u> 刪除光標左邊的所有字符(包括光標處的字符)
<C-y> 恢復上次刪除的字符串到光標位置
<C-p>或<向上鍵> 歷史記錄中的上一條命令
<C-n>或<向下鍵> 歷史記錄中的下一條命令
在命令行模式下<tab>鍵有補全命令的功能,如果你敲入了命令的前一部分,鍵入<tab>系統將列出所有可能以你給出的字符串開頭的命令。如果你給出了命令,在命令參數的位置按下<tab>鍵,系統將給出這條命令的可能的參數列表,具體的可用命令集將在后面給出。
?。╞) 菜單模式
當存在文件/boot/grub/menu.lst文件時系統啟動自動進入此模式。菜單模式下用戶只需要用上下箭頭來選擇他所想啟動的系統或者執行某個命令塊,菜單的定義在menu.lst文件中,你也可以從菜單模式按<c>鍵進入命令行模式,并且可以按<ESC>鍵從命令行模式返回菜單模式。菜單模式下按<e>鍵將進入菜單編輯模式。
?。╟) 菜單編輯模式
菜單編輯模式用來對菜單項進行編輯改變,其界面和菜單模式的界面十分類似,不同的是菜單中顯示的是對應某個菜單項的命令列表。如果在編輯模式下按下<ESC>,則取消所有當前對菜單的編輯并回到菜單模式下。在編輯模式下選中一個命令行,就可以對這條指令進行修改,修改完畢后按下<RET>,GRUB將提示你確認并完成修改。如果你想在當前命令列表中增加一條命令,按<o>在當前命令的下面增加一條指令,按<O>在當前命令前處增加一條指令。按<d>刪除一條指令。
命令列表
下面是GRUB的可用命令列表:
僅用于菜單的命令(不包括菜單項內部的啟動命令)
==========================================
default num
設置菜單中的默認選項為num(默認為0,即第一個選項),超時將啟動這個選項
fallback num
如果默認菜單項啟動失敗,將啟動這個num后援選項。
password passwd new-config-file
關閉命令行模式和菜單編輯模式,要求輸入口令,如果口令輸入正確,將使用new-conf
ig-file
作為新的配置文件代替menu.lst,并繼續引導。
timeout sec
設置超時,將在sec秒后自動啟動默認選項。
title name ...
開始一個新的菜單項,并以title后的字串作為顯示的菜單名。
在菜單(不包括菜單項內部的命令)和命令行方式下都可用的命令
======================================================
bootp
以BOOTP協議初始化網絡設備
color normal [highlight]
改變菜單的顏色,normal是用于指定菜單中非當前選項的行的顏色,highlight是用于指定當前菜單選項的顏色。如果不指定highlight,GRUB將使用normal的反色來作為highlight顏色。指定顏色的格式是“前景色/背景色”,前景色和背景色的可選列表如下:
* black
* blue
* green
* cyan
* red
* magenta
* brown
* light-gray
下面的顏色只能用于背景色
* dark-gray
* light-blue
* light-green
* light-cyan
* light-red
* light-magenta
* yellow
* white
你可以在前景色前加上前綴"blink-",產生閃爍效果,你可以在menu.lst中加上下面這個選項來改變顏色效果:
title OS-BS like
color magenta/blue black/magenta
device drive file
在GRUB命令行中,把BIOS中的一個驅動器drive映射到一個文件file。你可以用這條命令創建一個磁盤映象或者當GRUB不能真確地判斷驅動器時進行糾正。如下
grub> device (fd0) /floppy-image
grub> device (hd0) /dev/sd0
這條命令只能在命令行方式下使用, 是個例外。
dhcp
用DHCP協議初始化網絡設備。目前而言,這條指令其實就是bootp的別名,效果和bootp一樣。
hide partition
這條指令僅僅對DOS和WINDOWS有用,當在一個硬盤上存在多個DOS/WIN的主分區時,有時需要這條指令隱藏其中的一個或幾個分區,即在分區表中設置“隱藏”位。
rarp
用RARP協議初始化網絡設備。
setkey to_key from_key
改變鍵盤的映射表,將from_key映射到to_key,注意這條指令并不是交換鍵映射,如果你要交換兩個鍵的映射,需要用兩次setkey指令,如下:
grub> setkey capslock control
grub> setkey control capslock
其中的鍵必須是字母,數字或者下面的一些代表某一鍵的字符串:
`escape', `exclam', `at', `numbersign', `dollar', `percent',
`caret', `ampersand', `asterisk', `parenleft', `parenright',
`minus', `underscore', `equal', `plus', `backspace', `tab',
`bracketleft', `braceleft', `bracketright', `braceright', `enter',
`control', `semicolon', `colon', `quote', `doublequote',
`backquote', `tilde', `shift', `backslash', `bar', `comma',
`less', `period', `greater', `slash', `question', `alt', `space',
`capslock', `FX' (`X' is a digit), and `delete'.
下面給出了它們和鍵盤上的鍵的對應關系:
`exclam'=`!'
`at'=`@'
`numbersign'=`#'
`dollar'=`$'
`percent'=`%'
`caret'=`^'
`ampersand'=`&'
`asterisk'=`*'
`parenleft'=`('
`parenright'=`)'
`minus'=`-'
`underscore'=`_'
`equal'=`='
`plus'=`+'
`bracketleft'=`['
`braceleft'=`{'
`bracketright'=`]'
`braceright'=`}'
`semicolon'=`;'
`colon'=`:'
`quote'=`''
`doublequote'=`"'
`backquote'=``'
`tilde'=`~'
`backslash'=`'
`bar'=`|'
`comma'=`,'
`less'=`<'
`period'=`.'
`greater'=`>'
`slash'=`/'
`question'=`?'
`space'=` '
unhide partition
僅僅對DOS/WIN分區有效,清除分區表中的“隱藏”位。
僅用于命令行方式或者菜單項內部的命令
=======================================
blocklist file
顯示文件file在所占磁盤塊的列表。
boot
僅在命令行模式下需要,當參數都設定完成后,用這條指令啟動操作系統
cat file
顯示文件file的內容,可以用來得到某個操作系統的根文件系統所在的分區,如下:
grub> cat /etc/fstab
chainloader [`--force'] file
把file裝入內存進行chainload,除了能夠通過文件系統得到文件外,這條指令也可以用磁盤塊列表的方式讀入磁盤中的數據塊,如'+1`指定從當前分區讀出第一個扇區進行引導。如果指定了`--force`參數,則無論文件是否有合法的簽名都強迫讀入,當你在引導SCO UnixWare時需要用這個參數。
cmp file1 file2
比較文件的內容,如果文件大小不一致,則輸出兩個文件的大小,如下:
Differ in size: 0x1234 [foo], 0x4321 [bar]
如果兩個文件的大小一致但是在某個位置上的字節不同,則打印出不同的字節和他們的
位移:
Differ at the offset 777: 0xbe [foo], 0xef [bar]
如果兩個文件完全一致,則什么都不輸出。
configfile FILE
將FILE作為配置文件替代menu.lst。
embed stage1_5 device
如果device是一個磁盤設備的話,將Stage1_5裝入緊靠MBR的扇區內。如果device是一個FFS文件系統分區的話,則將Stage1_5裝入此分區的第一扇區。如果裝入成功的話,輸出寫入的扇區數。
displaymem
顯示出系統所有內存的地址空間分布圖。
find filename
在所有的分區中尋找指定的文件filename,輸出所有包含這個文件的分區名。參數filename應該給出絕對路徑。
fstest
啟動文件系統測試模式。打開這個模式后,每當有讀設備請求時,輸出向底層例程讀請求的參數和所有讀出的數據。輸出格式如下:
先是由高層程序發出的分區內的讀請求,輸出:<分區內的扇區偏移,偏移(字節數),長度(字節數)>之后由底層程序發出的扇區讀請求,輸出:[磁盤絕對扇區偏移] 可以用install或者testload命令關閉文件系統測試模式。
geometry drive [cylinder head sector [total_sector]]
輸出驅動器drive的信息。
help [pattern ...]
在線命令幫助,列出符合pattern的命令列表,如果不給出參數,則將顯示所有的命令列表。
impsprobe檢測Intel多處理器,啟動并配置找到的所有CPU。
initrd file ...
為Linux格式的啟動映象裝載初始化的ramdisk,并且在內存中的Linux setup area中設置適當的參數。
install stage1_file [`d'] dest_dev stage2_file [addr] [`p'] [config_file] [r
eal_config_file]
這是用來完全安裝GRUB啟動塊的命令,一般很少用到。
ioprobe drive
探測驅動器drive所使用的I/O口,這條命令將會列出所有dirve使用的I/O口。
kernel file ...
裝載內核映象文件(如符合Multiboot的a.out,ELF,Linux zImage或bzImage,FreeBSD a.out,NetBSD
a.out等等)。文件名file后可跟內核啟動時所需要的參數。如果使用了這條指令所有以前裝載的模塊都要重新裝載。
makeactive
使當前的分區成為活躍分區,這條指令的對象只能是PC上的主分區,不能是擴展分區。
map to_drive from_drive
映射驅動器from_drive到to_drive。這條指令當你在chainload一些操作系統的時候可能是必須的,這些操作系統如果不是在第一個硬盤上可能不能正常啟動,所以需要進行映射。如下:
grub> map (hd0) (hd1)
grub> map (hd1) (hd0)
module file ...
對于符合Multiboot規范的操作系統可以用這條指令來裝載模塊文件file,file后可以跟這個module所需要的參數。注意,必須先裝載內核,再裝載模塊,否則裝載的模塊無效。
modulenounzip file ...
同module命令幾乎一樣,唯一的區別是不對module文件進行自動解壓。
pause message ...
輸出字符串message,等待用戶按任意鍵繼續。你可以用<^G>(ASCII碼007)使PC喇叭發聲提醒用戶注意。
quit
退出GRUB shell,GRUB shell類似于啟動時的命令行模式,只是它是在用戶啟動系統后執行/sbin/grub才
進入,兩者差別不大。
read addr
從內存的地址addr處讀出32位的值并以十六進制顯示出來。
root device [hdbias]
將當前根設備設為device,并且試圖mount這個根設備得到分區大小。hdbias參數是用來告訴BSD內核在當前分區所在磁盤的前面還有多少個BIOS磁盤編號。例如,系統有一個IDE硬盤和一個SCSI硬盤,而你的BSD安裝在IDE硬盤上,此時,你就需要指定hdbias參數為1。
rootnoverify device [hdbias]
和root類似,但是不mount該設備。這個命令用在當GRUB不能識別某個硬盤文件系統,但是仍然必須指定根設備。
setup install_device [image_device]
安裝GRUB引導在install_device上。這條指令實際上調用的是更加靈活但是復雜的install指令。如果
image_device也指定了的話,則將在image_device中尋找GRUB的文件映象,否則在當前根設備中查找。
testload file
這條指令是用來測試文件系統代碼的,它以不同的方式讀取文件file的內容,并將得到的結果進行比較,如果正確的話,輸出的`i=X,filepos=Y`中的X,Y的值應該相等,否則就說明有錯誤。通常這條指令正確執行的話,之后我們就可以正確無誤地裝載內核。
uppermem kbytes
強迫GRBU認為高端內存只有kbytes千字節的內存,GRUB自動探測到的結果將變得無效。這條指令很少使用,可能只在一些古老的機器上才有必要。通常GRUB都能夠正確地得到系統的內存數量。