grub 詳解

一、什麼是多重操作系統引導管理器,什麼是GRUB;

 

1、什麼是多重操作系統引導管理器及工作原理;


系統啓動引導管理器,是在計算機啓動後運行的第一個程序,他是用來負責加載、傳輸控制到操作系統的內核,一旦把內核掛載,系統引導管理器的任務就算完成退出,系統引導的其它部份

,比如系統的初始化及啓動過程則完全由內核來控制完成;

Briefly, boot loader is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system

kernel software (such as the Hurd or the Linux). The kernel, in turn, initializes the rest of the operating system (e.g. GNU).

在X86 架構的機器中,Linux、BSD 或其它Unix類的操作系統中GRUB、LILO 是大家最爲常用,應該說是主流;

Windows也有類似的工具NTLOADER;比如我們在機器中安裝了Windows 98後,我們再安裝一個Windows XP ,在機器啓動的會有一個菜單讓我們選擇進入是進入Windows 98 還是進入Windows XP


2、什麼是GRUB;爲什麼我要選擇GRUB;


什麼是GRUB;

GNU GRUB 是一個多重操作系統啓動管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而來。
GNU GRUB is a Multiboot boot loader. It was derived from GRUB, GRand Unified Bootloader, which was originally designed and implemented by Erich Stefan Boleyn.

 


二、GRUB軟件包版本選擇和安裝;

 

1、GRUB的版本選擇,Linux版本的GRUB及Windows版本的GRUB的說明;


如前面所說,目前在在Unix類的操作系統中,大多是都有GRUB;GRUB幾乎能引導所有X86架構的操作系統;功能之強,使用簡單是GRUB最大的賣點;由於Windows 操作系統的先入爲主的優勢,

使得大家對Windows的NTLOADER瞭解的比較多,無論是WINGRUB還是Linux版本的GRUB,最方便的還是對GRUB命令行的操作

 

2、GRUB的Linux版本軟件包的安裝;


[root@localhost ~]# rpm -ivh grub*.rpm

如果是Slackware 您可以用如下的辦法來安裝;


[root@localhost ~]# installpkg grub*.tgz

當然您也可以通過源碼包,在任何Linux的發行版上安裝;至於源碼包的安裝方法;

請參考:《如何編譯安裝源碼包軟件》


[root@localhost ~]#tar zxvf grub*.tar.gz
[root@localhost ~]#cd grub-xxx
[root@localhost ~]#./configure;make;make install

確認您是否成功安裝了GRUB,您可以測試是否有如下兩個命令;


[root@localhost ~]# grub
[root@localhost ~]# grub-install

如果您不能找到這兩個命令,可能您的可執行程序的路徑沒有設置;

請參考:《設置可執行程序路徑》,當然您可以用絕對路徑;比如下面的;


[root@localhost ~]# /usr/sbin/grub
[root@localhost ~]# /usr/sbin/grub-install

如果您還是找不到GRUB軟件包安裝在哪了;您可以用下面的命令來解決和查找;


[root@localhost ~]# updatedb  注:這個要花很長時間;是索引slocate 的庫,然後再通過locate來查找;
[root@localhost ~]# locate grub

比如找到的是有類似如下的;


[root@localhost ~]# locate grub
/sbin/grub-md5-crypt
/sbin/grub
/sbin/grub-install
/sbin/grub-terminfo

三、在Linux中,GRUB的配置中的安裝和寫入硬盤的MBR;

1、在Linux中,GRUB配置過程中的安裝grub-install;


grub-install 命令有何用呢?其實就是把我們前面已經安裝的軟件包中的一些文件複製到 /boot/grub中;對於新安裝GRUB軟件包後,也是一個必經的過程;我們前面所說的GRUB軟件包的安

裝;而現在我們說的是GRUB配置的過程中的安裝;雖然在洋文中都是install ,但表達的意思是不一樣的;

我們首先要運行 fdisk -l 來確認到底是硬盤的標識;

這個過程主要是確認硬盤的標識是哪個調備,到底是/dev/hda還是/dev/hdb 還是其它的;


[root@localhost ~]# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         970     7791493+   7  HPFS/NTFS
/dev/hda2             971        9729    70356667+   5  Extended
/dev/hda5             971        2915    15623181    b  W95 FAT32
/dev/hda6            2916        4131     9767488+  83  Linux
/dev/hda7            4132        5590    11719386   83  Linux
/dev/hda8            5591        6806     9767488+  83  Linux
/dev/hda9            6807        9657    22900626   83  Linux
/dev/hda10           9658        9729      578308+  82  Linux swap / Solaris

如果通過fdisk -l 出現有/dev/hda字樣的,我們就要用下面的命令來安裝;


[root@localhost ~]# grub-install /dev/hda
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0)   /dev/fd0
(hd0)   /dev/hda

如果是您fdisk -l 出現的有/dev/hdb呢,那就如下運行;


[root@localhost ~]# grub-install /dev/hdb

如果既有/dev/hda和/dev/hdb 就安裝到/dev/hda中;


[root@localhost ~]# grub-install /dev/hda

值得注意的是如果您有一個/boot分區,應該用如下的辦法來安裝;


[root@localhost ~]#grub-install --root-directory=/boot /dev/hda

[root@localhost ~]#grub-install --root-directory=/boot /dev/hdb

註解:具體是/dev/hda還是/dev/hdb,請以fdisk -l 爲準;如果兩個都有,就看您把/boot分區是放在第一塊硬盤還是第二塊硬盤上了,以實際情況爲準;


2、設定GRUB的/boot分區並寫入MBR;;

在Linux中,GRUB軟件包的安裝,及在配置過程中安裝grub到 /boot中還是不夠的, 還要把GRUB,寫入MBR才行;有時我們重新安裝了Windows,Windows會把MBR 重寫,這樣GRUB就消失了;如

果您出現這樣的情況,就要進行這個過程;


[root@localhost ~]# grub

會出現grub>提示符,這是grub命令行模式 ,如果能在開機中出現提示符,沒有引導不起來的系統,除非您的系統破壞的極爲嚴重。如果僅僅是GRUB被破壞了,GRUB命令行是能讓操作系統引

導起來的;

接着看例子,我們要找到 /boot/grub/stage1的,在grub>後面輸入;


grub> find  /boot/grub/stage1
(hd0,6) 
(fd0)   注:這個是軟驅;現在很少用軟驅了,如果您有這方面的需要,自己看GRUB的DOC吧;

註解:

(hd0,6) 這是/boot所在的分區;不要誤解爲是Linux 的/所在的分區,這是值得注意的;
(fd0) 注:這個是軟驅;現在很少用軟驅了,如果您有這方面的需要,自己看GRUB的DOC吧;


grub>root (hd0,6)    注:這是/boot所在的分區;
grub>setup (hd0)   注:把GRUB寫到MBR上;

註解:

上面這步驟是根據 find /boot/stage1而來的,仔細看一下就明白了;現在我們一般安裝很少會把/boot分區列爲一個單獨的分區;不過有的弟兄可能也喜歡這麼做;所以還是有必要說一下爲

好;


四、GRUB的配置文件的menu.lst的寫法;


對於GRUB來說,如果沒有配置menu.lst,無論是Linux版本的GRUB,還是WINGRUB,都會有命令行可用,通過命令行是一樣能把操作系統引導起來的;有些弟兄總以爲menu.lst 配置錯了, 或

者在機器啓動後出現grub>命令行模式就要重新安裝系統,其實根本沒有這個必要;只要學會GRUB的命令行的用法,根本沒有必要重裝系統;

menu.lst 位於/boot/grub目錄中,也就是/boot/grub/menu.lst 文件;
有的弟兄會說,我沒有menu.lst怎麼辦?那就創建一個;用下面的命令;


[root@localhost ~]# touch  /boot/grub/menu.lst

然後我們再做一個/boot/grub/menu.lst 的鏈接 /boot/grub/grub.conf

[root@localhost ~]# cd /boot/grub
[root@localhost ~]# ln -s menu.lst grub.conf

現在我們來寫GRUB的menu.lst了,因爲/boot/grub/grub.conf是 /boot/grub/menu.lst的鏈接文件,改哪個都行。鏈接文件相當於Windows的快捷方式,這樣可能能更好的理解;


1、menu.lst的寫法之一;


首先我們看一下我的Fedora 4.0 中的/boot/grub/menu.lst 的內容;


default=0
timeout=5
#splashimage=(hd0,6)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.11-1.1369_FC4)
        root (hd0,6)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd /boot/initrd-2.6.11-1.1369_FC4.img
title WinXp
        rootnoverify (hd0,0)
        chainloader +1

註解:


default=0

default=0 是默認啓動哪個系統,從0開始;每個操作系統的啓動的定義都從title開始的,第一個title 在GRUB的啓動菜單上顯示爲0,第二個啓動爲1,以此類推;

timeout=5

注:表示在開機後,GRUB畫面出現幾秒後開始以默認啓動;如果在啓動時,移動上下鍵,則解除這一規則;
#splashimage=(hd0,6)/boot/grub/splash.xpm.gz 注:GRUB的背景畫面,這個是可選項;我不喜歡GRUB的背景畫面,所以加#號注掉,也可以刪除;

hiddenmenu

註解:隱藏GRUB的啓動菜單,這項也是可選的,也可以用#號注掉;

一般的情況下對Linux操作系統的啓動,一般要包括四行;title 行;root行;kernel 行;initrd 行;


1)在menu.lst中 ,通過 root (hd[0-n],y)來指定/boot 所在的分區;


title XXXXX 注:title 後面加一個空格,title 是小寫的,後面可以自己定義;比如FC4,自己定義一個名字就行;
root (hd[0-n],y) ,在本例中,我們看到的是root (hd0,6) ,root (hd[0-n],y)表示的是/boot所在的分區;有時我們安裝Linux的時候,大多是不設置/boot的,這時/boot和/所在的同一個

分區; 這個root (hd[0-n],y)很重要,因爲/boot目錄中雖然有grub目錄,最爲重要的是還有kernel 和initrd文件,這是Linux能啓動起來最爲重要東西;

有的弟兄會問,root (hd[0-n],y)是怎麼來的?

請參考:《在Linux系統中存儲設備的兩種表示方法》

2)在menu.lst中,kernel 命令行的寫法;


kernel 一行,是通指定內核及Linux的/分區所在位置;

比如例子中是;


kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

在這裏以kernel 起始,指定Linux的內核的文件所處的絕對路徑;因爲內核是處在/boot目錄中的, 如果/boot是獨立的一個分區,則需要把boot省略;如果/boot是獨立的分區,這行要寫成:

kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ 

因爲/boot所處的分區已經在title 下一行root (hd[0-n],y)中指定了,所以就無需要再指明內核處在哪個分區了;另外Linux系統的硬盤分區的掛載配置文件在/etc/fstab ,原理是通過

mount /dev/hd[a-z]X /boot 來進行的;您可以對照着來理解;

ro 表示只讀; root=LABEL=/ 來表示Linux的根所處的分區。LABEL=/ 這是硬盤分區格式化爲相應文件系統後所加的標籤;如果您不瞭解什麼是標籤,也可以直接以/dev/hd[a-z]X 或

者/dev/sd[a-z]X來表示;就看您的Linux是根分區是在哪個分區了。比如我的是在/dev/hda7 , 那這裏就可以寫成root=/dev/hda7;

如果查看系統運行所掛載的分區,請用 df -lh 來查看,就能明白是不是/boot是獨立的分區,或者查看/etc/fstab也能知道;


[root@localhost ~]# df -lh
Filesystem            容量  已用 可用 已用% 掛載點
/dev/hda7              11G  9.2G  1.2G  90% /
/dev/shm              236M     0  236M   0% /dev/shm

在這個例子中,我們可以發現 /boot並沒有出現只有/dev/hda7,這表示/boot並不是獨立的一個分區;所有的東西都包含在/中;於是我們在/boot中查看內核版本;


[root@localhost ~]# ls /boot/vmlinuz*
/boot/vmlinuz-2.6.11-1.1369_FC4   注:看到內核vmlinuz所處的目錄;

於是我們就可以這樣kernel 這行了;


kernel /boot/vmlinuz-2.6.11-1.1369_FC4  ro root=/dev/hda7


3)initrd 命令行的寫法;


如果是/boot獨立一個分區,initrd 一行要把/boot中省略;如果/boot不是處於一個分區,而是和Linux的/分區處於同一分區,不應該省略;

比如我們在2)中用的例子;現在拿到這裏,我們應該首先查看 /boot中的initrd的文件名到底是什麼;


[root@localhost ~]# ls /boot/initrd*
/boot/initrd-2.6.11-1.1369_FC4.img

如果是通過df -lh 得知或查看/etc/fstab 也行, 得知/boot是獨立的分區;這時initrd 應該寫成;


initrd  /initrd-2.6.11-1.1369_FC4.img

如果是 /boot不是獨處一個分區,而是在/同一處一個分區, 則要寫成;


initrd  /boot/initrd-2.6.11-1.1369_FC4.img


4)menu.lst第一種寫法的總結和實踐;

 

1]用fdisk -l ;df -lh ;more /etc/fstab來確認分區情況;

我們過fdisk -l ;df -lh ; more /etc/fstab 來確認/boot所在的分區,及Linux的根分區所在位置;

比如我們確認/boot和Linux的/分區同處一個分區;


[root@localhost ~]# df -lh
Filesystem            容量  已用 可用 已用% 掛載點
/dev/hda7              11G  9.2G  1.2G  90% /
/dev/shm              236M     0  236M   0% /dev/shm

然後我們/etc/fstab 中,查看/分所在的分區或分區標籤是什麼;


[root@localhost ~]# more /etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
LABEL=/                 /                       ext3    defaults        1 1
/dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0
/dev/shm                /dev/shm                tmpfs   defaults        0 0
/dev/proc               /proc                   proc    defaults        0 0
/dev/sys                /sys                    sysfs   defaults        0 0
LABEL=SWAP-hda1         swap                    swap    defaults        0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,managed 0 0

經過上面的df -lh 和more /etc/fstab 的對照中得知,/boot並是獨處一個分區,而是和/在同一個分區;這個Linux系統安裝在/dev/hda7上,文件系統(此分區)的標籤爲LABEL=/ ,/boot

也是處於/dev/hda7 ,/dev/hda7也可以說是 root (hd0,6);

2]查看內核vmlinuz的和initrd文件名的全稱;

 

[root@localhost ~]# ls -lh /boot/vmlinuz*
-rw-r--r--  1 root root 1.6M 2005-06-03  /boot/vmlinuz-2.6.11-1.1369_FC4
[root@localhost ~]# ls -lh /boot/initrd*
-rw-r--r--  1 root root 1.1M 11月 26 22:30 /boot/initrd-2.6.11-1.1369_FC4.img


3]開始寫menu.lst ;


我們根據上面所提到的,可以寫成如下的樣子;


default=0 
timeout=5
title FC4
        root (hd0,6)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd /boot/initrd-2.6.11-1.1369_FC4.img

也可以寫成;


default=0 
timeout=5
title FC4
        root (hd0,6)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
        initrd /boot/initrd-2.6.11-1.1369_FC4.img

註解:上面兩個不同之處在於一指定Linux的根/所在的分區時,一個是用了文件系統的標籤,另一個沒有用標籤;

2、menu.lst的寫法之二,精簡型;


本寫法主要是把指定/boot所位於的所分區直接寫入kernel 指令行;這樣就省略了通過root (hd[0-n],y)來指定/boot所位於的分區;


1)第一種情況:/boot和Linux的/根分區在同一個分區;


有前面的那麼多的講解,menu.lst寫法之二就好理解多了;也得分兩種情況,咱們先把/boot並不是獨處一個分區,而是和Linux的根分區處於同一個分區;我們以 4)menu.lst第一種方法的

寫法總結 的實例爲例子;


default=0 
timeout=5
title FC4x
        kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
        initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img

註解:

title FC4x 注:自己爲這個Linux 起個簡單的名,以title開頭,然後一個空格,後面就自己發揮吧,FC4或FC4x都行;

kernel 空格 (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 空格 ro 空格 root=/dev/hda7

kernel 這行這樣理解 kernel (boot所在的分區)/boot/內核文件件全稱 ro root=Linux根所位於的分區或標籤

initrd 空格 (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img
initrd 這行可以這樣理解 initrd (/boot所在的分區)/boot/內核文件名全稱


2)第二種情況:/boot獨立一個分區,和Linux的根分區不是同一個分區;


比如我們查看到df -lh 得到的是


[root@localhost ~]# df -lh
Filesystem            容量  已用 可用 已用% 掛載點
/dev/hda6              200M  120M  80M  60% /boot
/dev/hda7              11G  9.2G  1.2G  90% /

我們再進一行查看/etc/fstab 得知;


LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2

所以我們應該寫成如下的;


title FC4x
        kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

因爲Linux的根分區是/dev/hda7,通過/etc/fstab和df -h的內容得知標籤爲 LABEL=/的分區就是/dev/hda7 ,所以有;


title FC4x
        kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
        initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img


五、通過GRUB命令行來啓動Linux操作系統;


GRUB的命令行纔是王道,如果知道怎麼用命令行來啓動操作系統,那理解menu.lst的寫法也不難;也就是說在開機的時候,不用GRUB的菜單,通過GRUB的命令也是一樣能把操作系統引導起來

因爲menu.lst的內容就是GRUB的一個一個的指令集合;是不是Linux這玩意很神奇?

1、爲什麼需要學習GRUB的命令行;

當我們把GRUB的menu.lst寫錯的時候,或者丟掉了menu.lst的時,比如在開機的時候,GRUB會出現grub>類似的命令提示符,這時需要我們用命令行啓動系統;當然您可以不用定義GRUB的菜單

,直接用命令行來啓動系統,比如我現在就是,爲了寫GRUB的文檔,就把menu.lst 刪除了,直接用命令來啓動系統;

2、用命令行來引導Linux操作系統的步驟;


1)進入GRUB的命令行模式 grub>

如果開機時,GRUB出現的是grub>,說明你沒有/etc/grub/menu.lst ,您需要自己寫一個纔會GRUB的菜單,讓我們來選擇進入哪個系統。如果有GRUB的菜單,您可以按Ctrl+c組合鍵進入GRUB

的命令行模式,會出現grub> 提示符;


grub>


2)獲取幫助GRUB的 help


只要您在grub>提示符的後面輸入help 就能得到GRUB所有的命令提示;


grub> help
blocklist FILE                         boot
cat FILE                               chainloader [--force] FILE
clear                                  color NORMAL [HIGHLIGHT]
configfile FILE                        device DRIVE DEVICE
displayapm                             displaymem
find FILENAME                          geometry DRIVE [CYLINDER HEAD SECTOR [
halt [--no-apm]                        help [--all] [PATTERN ...]
hide PARTITION                         initrd FILE [ARG ...]
kernel [--no-mem-option] [--type=TYPE] makeactive
map TO_DRIVE FROM_DRIVE                md5crypt
module FILE [ARG ...]                  modulenounzip FILE [ARG ...]
pager [FLAG]                           partnew PART TYPE START LEN
parttype PART TYPE                     quit
reboot                                 root [DEVICE [HDBIAS]]
rootnoverify [DEVICE [HDBIAS]]         serial [--unit=UNIT] [--port=PORT] [--
setkey [TO_KEY FROM_KEY]               setup [--prefix=DIR] [--stage2=STAGE2_
terminal [--dumb] [--no-echo] [--no-ed terminfo [--name=NAME --cursor-address
testvbe MODE                           unhide PARTITION
uppermem KBYTES                        vbeprobe [MODE]

如果需要得到某個指令的幫助,就在 help 後面空一格,然後輸入指令,比如;


grub>help kernel 


3)cat的用法;


cat指令是用來查看文件內容的,有時我們不知道Linux的/boot分區,以及/根分區所在的位置,要查看/etc/fstab的內容來得知,這時,我們就要用到cat (hd[0-n],y)/etc/fstab 來獲得這

些內容;注意要學會用tab鍵命令補齊的功能;


grub> cat (     按tab 鍵會出來hd0或hd1之類的;
grub> cat (hd0, 注:輸入hd0,然後再按tab鍵;會出來分區之類的;
grub> cat (hd0,6)
Possible partitions are:
   Partition num: 0,  Filesystem type unknown, partition type 0x7
   Partition num: 4,  Filesystem type is fat, partition type 0xb
   Partition num: 5,  Filesystem type is reiserfs, partition type 0x83
   Partition num: 6,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 7,  Filesystem type unknown, partition type 0x83
   Partition num: 8,  Filesystem type is reiserfs, partition type 0x83
   Partition num: 9,  Filesystem type unknown, partition type 0x82

grub> cat (hd0,6)/etc/fstab 注:比如我想查看一下 (hd0,6)/etc/fstab的內容就這樣輸入;

LABEL=/                 /                       ext3    defaults        1 1
/dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0
/dev/shm                /dev/shm                tmpfs   defaults        0 0
/dev/proc               /proc                   proc    defaults        0 0
/dev/sys                /sys                    sysfs   defaults        0 0
LABEL=SWAP-hda1         swap                    swap    defaults        0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,
managed 0 0

有的弟兄可能會說,我不知道Linux安裝在了哪個分區。那根據文件系統來判斷一個一個的嘗試總可以吧我;只要能cat出/etc/fstab就能爲以後引導帶來方便;

主要查看/etc/fstab中的內容,主要是Linux的/分區及/boot是否是獨立的分區;如果沒有/boot類似的行,證明/boot和Linux的/處於同一個硬盤分區;比如上面的例子中LABEL=/ 這行是極爲

重要的;說明Linux系統就安在標籤爲LABEL=/的分區中;

如果您的Linux系統/boot和/沒有位於同一個分區,可能cat (hd[a-n],y) 查到的是類似下面的;


LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2


4) root (hd[0-n,y) 指令來指定/boot所在的分區;


其實這個root (hd[0,n],y)是可以省略的,如果省略了,我們要在kerenl 命令中指定;我們前面已經說過 (hd[0-n],y) 硬盤分區的表示方法的用途;主要是用來指定 /boot所在的分區;

比如我們確認/boot和 (hd0,6),所以就可以這樣來輸入root (hd0,6)


grub> root (hd0,6)

如果發現不對,可以重新來過;沒有什麼大不了的;


5) kernel 指令,用來指定Linux的內核,及/所在的分區;


kernel 這個指令可能初學者有點怕,不知道內核在哪個分區,及內核文件名的全稱是什麼。不要忘記tab鍵的命令補齊的應用;

如果我們已經通過root (hd[0-n],y) 指定了/boot所在的分區,語法有兩個:

如果/boot和Linux的/位於同一個分區,應該是下面的一種格式;

kernel /boot/vmlinuz在這裏按tab鍵來補齊,就看到內核全稱了 ro root=/dev/hd[a-z]X

如果/boot有自己獨立的分區,應該是;

kernel /vmlinuz在這裏按tab鍵來補齊,就看到內核全稱了 ro root=/dev/hd[a-z]X


在這裏 root=/dev/hd[a-z]X 是Linux 的/根所位於的分區,如果不知道是哪個分區,就用tab出來的來計算,一個一個的嘗試;或用cat (hd[0-n],y)/etc/fstab 中得到Linux的/所在的分區

或分區的標籤;


grub> kernel /boot/在這裏按tab鍵;這樣就列出/boot中的文件了;
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369
_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK memtest86+-1.55
.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ 
   [Linux-bzImage, setup=0x1e00, size=0x18e473]


註解: root=LABEL=/ 是Linux的/所在的分區的文件系統的標籤;如果您知道Linux的/在哪個具體的分區,用root=/dev/hd[a-z]X來指定也行。比如下面的一行也是可以的;


grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

也可以把/boot所在的分區的指定 root (hd[0-n],y)這行省掉,直接在kernel 中指定/boot所在的分區;所以就在下面的語法;

如果是/boot和Linux的根同處一個分區;


kernel (hd[0-n],y)/boot/vmlinuz ro root=/dev/hd[a-z]X

比如:


grub>kernel

如果是/boot和Linux所在的根不在一個分區;則是;


kernel (hd[0-n],y)/vmlinuz  ro root=/dev/hd[a-z]X


grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
   [Linux-bzImage, setup=0x1e00, size=0x18e473]

或下面的輸入,以cat 出/etc/fstab內容爲準;


grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
   [Linux-bzImage, setup=0x1e00, size=0x18e473]


6)initrd 命令行來指定initrd文件;

 

grub> initrd /boot/initrd在這裏tab 來補齊;
grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img
   [Linux-initrd @ 0x2e1000, 0x10e685 bytes]

如果/boot是獨立的一個分區,應該是如下樣子的語法;比如下面的;


grub> initrd /initrd在這裏tab 來補齊;
grub> initrd /initrd-2.6.11-1.1369_FC4.img
   [Linux-initrd @ 0x2e1000, 0x10e685 bytes]


7)boot 引導系統;

 

grub>boot

前面的幾個步驟都弄好 。就進入引導;嘗試一下就知道了。。

8)引導Linux系統實例全程回放;


實例:/boot和Linux的/處於同一個硬盤分區;


grub> cat (hd0,6)/etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
LABEL=/                 /                       ext3    defaults        1 1
/dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0
/dev/shm                /dev/shm                tmpfs   defaults        0 0
/dev/proc               /proc                   proc    defaults        0 0
/dev/sys                /sys                    sysfs   defaults        0 0
LABEL=SWAP-hda1         swap                    swap    defaults        0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,managed 0 0

grub> root (hd0,6)
Filesystem type is ext2fs, partition type 0x83

grub> kernel /boot/在這裏按tab補齊,全列出/boot所有的文件;
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 
memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7  注:輸入
   [Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/在這裏按tab補齊
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 
memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;輸入intrd文件名的全名;
   [Linux-initrd @ 0x2e1000, 0x10e685 bytes]

grub> boot

我們指定Linux的根時,可以用cat出來的fstab的內容中Linux的/分區文件系統標籤來替代;也就是kernel 那行中 root=/dev/hd[a-z]X;


grub> cat (hd0,6)/etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
LABEL=/                 /                       ext3    defaults        1 1
/dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0
/dev/shm                /dev/shm                tmpfs   defaults        0 0
/dev/proc               /proc                   proc    defaults        0 0
/dev/sys                /sys                    sysfs   defaults        0 0
LABEL=SWAP-hda1         swap                    swap    defaults        0 0

/dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,managed 0 0

grub> root (hd0,6)
Filesystem type is ext2fs, partition type 0x83

grub> kernel /boot/在這裏按tab補齊,全列出/boot所有的文件;
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 
memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ 
   [Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/在這裏按tab補齊
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK
memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;輸入intrd文件名的全名;
   [Linux-initrd @ 0x2e1000, 0x10e685 bytes]

grub> boot

如果是/boot和Linux的根分區不在同一個分區,要把kernel和initrd 指令中的/boot去掉,也就是/vmlinuzMMMMMM 或 /initrdNNNN

也可以不用root (hd[0-n]來指定/boot所在分區,要在kernel 和initrd 中指定;比如Linux的/根所位於的分區和/boot所位於的分區都是(hd0,6),並且我們cat出來的/etc/fstab是Linux的/

根分區的文件系統的標籤爲LABEL=/,引導操作系統的例子如下;


grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img
grub>boot


grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img
grub>boot

如果/boot位於 /dev/hda6,也就是(hd0,5),Linux的根/位於分區/dev/hda7,並且我們cat 出來的/etc/fstab 中/分區的標籤爲 LABEL=/。下面的兩種方法都可以引導;


grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img
grub>boot


grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img
grub>boot


六、通過GRUB引導Windows操作系統;


1、通過編輯 menu.lst 來引導Windows 系統;


如果您的Windows所處於的分區在(hd0,0),可以在menu.lst 加如下的一段就能引導起來了;


title WinXp
        rootnoverify (hd0,0)
        chainloader +1

如果您的機器有兩塊硬盤,而Windows 位於第二個硬盤的第一個分區,也就是(hd1,0)

您可以用grub的map來指令來操作把兩塊硬盤的序列對調,這樣就不用在BIOS中設置了;在menu.lst中加如下的內容,比如下面的;


title WinXp
        map (hd0) (hd1)
        map (hd1) (hd0)
        rootnoverify (hd0,0)
        chainloader +1
  makeactive

如果Windows的分區不位於硬盤的第一個分區怎麼辦呢?比如在(hd0,2);

這個也好辦吧,把rootnoverify 這行的(hd0,0)改爲 (hd0,2)


title WinXp
        rootnoverify (hd0,2)
        chainloader +1
  makeactive

如果Windows的在第二個硬盤的某個分區,比如說是位於(hd1,2),則要用到map指令;


title WinXp
        map (hd0) (hd1)
        map (hd1) (hd0)
        rootnoverify (hd1,2)
        chainloader +1
  makeactive

如果有多個Windows 系統,怎麼才能引導出來呢?應該用hide 和unhide指令操作;比如我們安裝了兩個Windows ,一個是位於(hd0,0)的windows 98 ,另一個是安裝的是位於(hd0,1)的

WindowsXP;這時我們就要用到hide指令了;


title Win98
         unhide (hd0,0)
         hide (hd0,1)
        rootnoverify (hd0,0)
        chainloader +1
  makeactive

title WinXP
        unhide (hd0,1)
        hide (hd0,0)
        rootnoverify (hd0,1)
        chainloader +1
  makeactive


2、通過GRUB指令來引導Windows ;


其實我們會寫menu.lst了,在menu.lst中的除了title外,都是一條條指令;如果我們啓動Windows ,只是輸入指令就行了;

比如 Windows的分區在 (hd0,0),我們在開機後,按ctrl+c ,進入GRUB的命令模式;就可以用下面的


grub> rootnoverify (hd0,0)
grub> chainloader +1
grub> boot

其它同理... ...

七、GRUB丟失或損壞的應對策略;


如果GRUB是Linux版本纔出會這樣的問題;WINGRUB可以不寫在MBR上;所以不會出現這樣的問題。WINGRUB用起來比較簡單。menu.lst 和命令行的用法和Linux版本的GRUB是一樣的;


1、由於重新安裝Windows或其它未知原因而導致GRUB的丟失;

您可以通過系統安裝盤、livecd進入修復模式;

請參考:《Linux 系統的單用戶模式、修復模式、跨控制檯登錄在系統修復中的運用》

首先:您根據前面所說grub-install來安裝GRUB到/boot所在的分區;要仔細看文檔,/boot是不是處於一個獨立的分區是重要的,執行的命令也不同;

其次:要執行grub ,然後通過 root (hd[0-n],y)來指定/boot所位於的分區,然後接着執行 setup (hd0),這樣就寫入MBR了,比如下面的例子;


grub>root (hd0,6)
grub>setup (hd0)
grub>quit

重新引導就會再次出現MBR的菜單了或命令行的提示符了;


2、如果出現GRUB提示符,而不出現GRUB的菜單,如何引導系統;


存在的問題可能是/boot/grub/menu.lst丟失,要自己寫一個才行;您可以用命令行來啓動系統,進入系統後寫一寫menu.lst就OK了。前面已經談過了;

寫好後還要建一個grub.conf的鏈接,如下:


[root@localhost ~]# cd /boot/grub
[root@localhost grub]# ln -s menu.lst grub.conf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章