linux rescue
sh3.1#
sh3.1#grub
會出現這樣的字元
grub>
我們就可以在這樣的字元後面,輸入
grub>find /boot/grub/stage1 (找到系統分區)
grub>root (hdX,Y)
grub>setup (hd0)
如果成功會有一個successful......
這裡的X,如果是一個盤,就是0,如果你所安裝的linux的根分區在第二個硬碟上,那X就是1了;Y,就是裝有linux系統所在的根分區。 setup (hd0)就是把GRUB寫到硬碟的MBR上。
舉 個例子吧,如果以我的硬碟為例。我在第一個硬碟上裝了XP,在第一個硬碟的hda9個裝了RH73.我總共有兩個硬碟。如果我把GRUB丢了,就用這種辦 法找回來。如果你不知道你的linux安裝到哪個分區上,也就是說,不知道這個Y是多少,這也不要緊,先輸入root (hdX,然後用[TAB]來檢視。
GRUB詳細說明
目錄
GRUB的技術特點
下載下傳并安裝GRUB
裝置命名規則
引導多系統
執行個體
菜單設定
使用者界面
指令清單
一. 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
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還支援網絡引導,我們分别來看看這幾種引導方法:
(a) 直接引導:
通常步驟如下:
1.用root指令設定包含作業系統核心的根裝置
2.用kernel指令裝載核心映象檔案,如果這個核心引導的時候有參數的話,可以直接将參數加在核心檔案名的後面。
3.用module或modulenounzip裝載核心子產品。
4.boot開始引導。
(b) 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用來指明所在分區号。
(c) 從網絡引導:
為了使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
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
FreeBSD
-------
GRUB能夠直接裝載.ELF和a.out兩種格式的核心,但是由于FreeBSD的核心引導接口有時有較大的變動,是以,對FreeBSD最安全的引導方法是引導/boot/loader
grub> root (hd0,a)
grub> kernel /boot/loader
NetBSD,OpenBSD,NetBSD
-------------------------------------
這三種系統的引導指令序列一樣,如下:
1. 'root'設定根裝置.
2. `kernel'裝載核心.
3. `boot'引導.
DOS/Windows
-----------
grub> rootnoverify (hd0,0)
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)
# 安裝 GRUB 到硬碟MBR
title Install GRUB into the hard disk
setup (hd0)
# 改變顯示菜單的顔色
title Change the colors
color light-green/brown blink-red/blue
七、使用者界面
GRUB的使用者界面有三種:指令行模式,菜單模式和菜單編輯模式
(a) 指令行模式:
進入指令行模式後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>鍵,系統将給出這條指令的可能的參數清單,具體的可用指令集将在後面給出。
(b) 菜單模式
當存在檔案/boot/grub/menu.lst檔案時系統啟動自動進入此模式。菜單模式下使用者隻需要用上下箭頭來選擇他所想啟動的系統或者執行某個 指令塊,菜單的定義在menu.lst檔案中,你也可以從菜單模式按<c>鍵進入指令行模式,并且可以按<ESC>鍵從指令行模 式傳回菜單模式。菜單模式下按<e>鍵将進入菜單編輯模式。
(c) 菜單編輯模式
菜單編輯模式用來對菜單項進行編輯 改變,其界面和菜單模式的界面十分類似,不同的是菜單中顯示的是對應某個菜單項的指令清單。如果在編輯模式下按下<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-p_w_picpath
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後可跟核心啟動時所需要的參數。如果使用了這條指令所有以前裝載的子產品都要重新裝載。
使目前的分區成為活躍分區,這條指令的對象隻能是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 [p_w_picpath_device]
安裝GRUB引導在install_device上。這條指令實際上調用的是更加靈活但是複雜的install指令。如果
p_w_picpath_device也指定了的話,則将在p_w_picpath_device中尋找GRUB的檔案映象,否則在目前根裝置中查找。
testload file
這條指令是用來測試檔案系統代碼的,它以不同的方式讀取檔案file的内容,并将得到的結果進行比較,如果正确的話,輸出的`i=X,filepos=Y`中的X,Y的值應該相等,否則就說明有錯誤。通常這條指令正确執行的話,之後我們就可以正确無誤地裝載核心。
uppermem kbytes
強迫GRBU認為高端記憶體隻有kbytes千位元組的記憶體,GRUB自動探測到的結果将變得無效。這條指令很少使用,可能隻在一些古老的機器上才有必要。通常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開始編号的。
(