/boot/grub/menu.lst 文件詳細設置

grub 的設定檔 /boot/grub/menu.lst 與安裝型態

# 與硬碟的關係:
既然 grub 主程式是安裝在 MBR ( super block ) 當中,並且動態去搜尋設定檔的資訊, 所以囉,他必須要認識硬碟纔行啊!那麼 grub 到底是如何認識硬碟的呢? 嘿嘿! grub 對硬碟的代號設定與傳統的 Linux 磁碟代號可完全是不同的! 他的代號有點像:

(hd0,0) 意爲第一個硬盤的第一個分區。

 

grub 是較新的 boot loader ,他的優點很多,包括:

* 認識與支援較多的 filesystem ,並且可以使用 grub 的主程式直接在 filesystem 當中搜尋核心;
* 開機的時候,可以‘自行編輯與修改開機設定項目’,類似 bash 的指令模式;
* 可以動態搜尋設定檔,而不需要在修改設定檔後重新安裝 grub 。亦即是我們只要修改完 /boot/grub/menu.lst 裏頭的設定後,下次開機就生效了!

上面第三點其實就是 Stage 1, Stage 2 分別安裝在 MBR 與 filesystem 當中的原因啦! 好了,接下來,讓我們好好瞭解一下 grub 的設定檔: /boot/grub/menu.lst 這玩意兒吧! 要注意喔,那個 lst 是 LST 的小寫,不要搞錯囉!

夠神了吧?跟 /dev/hda1 風馬牛不相干~怎麼辦啊?其實只要注意幾個東西即可, 那就是:

* 硬碟代號以小括號 ( ) 包起來;
* 硬碟以 hd 表示,後面會接一組數字;
* 以‘搜尋順序’做爲硬碟的編號,而不是依照硬碟排線的排序!(這個重要!搜尋順序在BIOS裏面設定。)
* 第一個搜尋到的硬碟爲 0 號,第二個爲 1 號,以此類推;
* 每顆硬碟的第一個 partition 代號爲 0 ,依序類推。

所以說,第一顆‘搜尋到的硬碟’代號爲:‘(hd0)’,而該顆硬碟的第一號 partition 爲 ‘(hd0,0)’這樣說,容易瞭解了吧!?在傳統的主機板上面, 通常第一顆硬碟就會是 /dev/hda,所以常常我們可能會誤會 /dev/hda 就是 (hd0) , 其實不是喔!要看您 BIOS 的設定值纔行! 有的主機板 BIOS 可以調整開機的硬碟搜尋順序,那麼就要注意了,因爲 grub 的硬碟代號可能會跟著改變吶!留意留意! 所以說,整個硬碟代號爲:

硬碟搜尋順序    在 Grub 當中的代號
第一顆    (hd0) (hd0,0) (hd0,1) (hd0,4)….
第二顆    (hd1) (hd1,0) (hd1,1) (hd1,4)….
第三顆    (hd2) (hd2,0) (hd2,1) (hd2,4)….

這樣應該比較好看出來了吧?第一顆硬碟的 MBR 安裝處的硬碟代號就是‘(hd0)’, (MBR不在任何一個分區裏,MBR在第一個硬盤的第一個磁道里,MBR裏包含分區表。)而第一顆硬碟的第一個 partition 的 Super block 代號就是‘(hd0,0)’第一顆硬碟的第一個 logical partition 的 super block 代號爲‘(hd0,4)’瞭了吧!

# /boot/grub/menu.lst 設定檔:
瞭解了 grub 當中最麻煩的硬碟代號後,接下來,我們就可以瞧一瞧設定檔的內容了。 先看一下鳥哥的 FC4 內的 /boot/grub/menu.lst 好了:

[root@linux ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu

title Fedora Core (2.6.12-1.1456_FC4)
root (hd0,0)
kernel /boot/vmlinuz-2.6.12-1.1456_FC4 ro root=/dev/hda1 quiet vga=787
initrd /boot/initrd-2.6.12-1.1456_FC4.img

title Fedora Core (2.6.11-1.1369_FC4)
root (hd0,0)
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda1 quiet vga=787
initrd /boot/initrd-2.6.11-1.1369_FC4.img

在 title 以前的前四行,都是屬於 grub 的整體設定,包括預設的等待時間與預設的開機項目, 還有顯示的畫面特性等等的項目。至於 title 後面纔是指定開機的核心檔案或者是 boot loader 控制權。 在整體設定方面的項目主要常見的有:

* default=0
這個必須要與 title 作爲對照。以上表爲例,我們不是有兩個 title 嗎?按照前後順序來排列, 第一個 title 代表的是 0 ,第二個 title 代表的是 1 ,以此類推~ 這個 default 說的是,如果開機過程當中,您並沒有選擇其他的項目, 那麼就會用預設值 (第 1 個 title) 來開機啦!

* timeout=5
這個是開機時,不是會顯示選單嗎?如果你在幾秒內(單位就是秒!)沒有按下任何按鍵, 那就會用 default 那個設定值來進行開機!

* splashimage=(hd0,0)/boot/grub/splash.xpm.gz
這個 splashimage 是在選單上面顯示的一些圖片或者是相關的影像資料啦! 這個設定有個地方比較有趣!因爲在開機的過程當中並沒有硬碟, 所以我們必須要明確的指出某個檔案在那個 partition 內的那個目錄; 因此,上面的設定說的是:在 (hd0,0) 那個 partition 內的 /boot/grub/splash.xpm.gz 該檔案爲開機時顯示的畫面啦!更多 splash 可以參考: http://ruslug.rutgers.edu/~mcgrof/grub-images/

* hiddenmenu
這個說的是,開機時,是否要顯示選單?目前 FC4 預設是不要顯示選單, 如果您想要顯示選單,那就將這個設定值註解掉!

 

整體設定的地方大概是這樣,而底下那個 title 則是顯示開機的設定項目。 如同前一小節提到的,開機時,可以選擇(1)直接指定核心檔案開機或 (2)將 boot loader 控制權轉移到下個 loader (此過程稱爲 chain-loader)。每個 title 後面接的是 ‘該開機項目名稱的顯示’,亦即是在選單出現時,選單上面的名稱而已。 那麼這兩種方式的設定有啥不同呢?

# 1. 直接指定核心開機

既然要指定核心開機,所以當然要找到核心檔案啦!此外,有可能還需要用到 initrd 的 RAM Disk 設定檔案 (通常是放置在 /boot 底下啊!)。但是如前說的, 尚未開機完成,所以我們必須要以 grub 的硬碟認識方式找出完整的 kernel 與 initrd 檔名纔行。 因此,我們可能需要有底下的方式來設定纔行!

1. 先指定核心檔案放置的 partition,再讀取檔案 (目錄樹)最後才加入檔案的實際檔名與路徑 (kernel 與 initrd);假設僅有一顆硬碟,且僅劃分出 /dev/hda1 (亦即根目錄爲 /dev/hda1)而已:
root    (hd0,0)    <==代表核心檔案放在那個 partition 當中?
kernel /boot/vmlinuz ro root=/dev/hda1 vga=771
initrd /boot/initrd
# root :代表的是‘核心檔案放置的那個 partition 而不是根目錄’喔!不要搞錯了!
# kernel :至於 kernel 後面接的則是核心的檔名,而在檔名後面接的則是核心的參數,
# 在 kernel 後面接的 root 纔是‘根目錄所在的 partition ’,
# 另外,核心還可以外加很多的參數喔,例如 vga 即是一個解析度參數!
# initrd :就是前面提到的 initrd 製作出 RAM Disk 的檔案檔名啦!

 

2. 直接指定 partition 與檔名,不需要外接 root !

kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1 vga=771
initrd (hd0,0)/boot/initrd

注意到:kernel 後面其實只要接 ‘核心檔案檔名’與 ‘根目錄 (/) 的所在磁碟代號 (用一般 Linux 磁碟代號) 就可以了。 老實說,以第二個方式來書寫你的 title 的內容會比較好一點~ 不會造成兩個 root 是啥意思的紊亂!上面的案例還很好理解,如果是底下的案例呢? 思考看看:

例題:
我的 Linux 主機僅有一顆硬碟,但爲了製作多重開機,所以我將 /boot 獨立出來成爲一個 partition, partition 的對應是‘ /boot → /dev/hda2 ’ ‘ / → /dev/hda1 ’,而且我僅有 kernel file, 檔名爲 /boot/vmlinuz-2.6.11-1.1369_FC4 請問 grub 當中的 title 要如何寫?
答:

只要列出 kernel 的檔名即可!因爲我將 /boot 獨立成爲 /dev/hda2 ,因此,整個核心檔案檔名應該是:

/boot/vmlinuz-2.6.11-1.369FC4 –>
(/dev/hda2)/vmlinuz-2.6.11-1.1369_FC4 –>
(hd0,1)/vmlinuz-2.6.11-1.1369_FC4

因爲 /boot 是一個完整的 partition 嘛!所以說,整個核心檔案的寫法,可以這樣做:

title FC4 default
kernel (hd0,1)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda1

因爲 vmlinuz-2.6.11-1.1369_FC4 這個檔案其實是在 /boot 所在的 partition 上, 而 /boot 是 (hd0,1) ,因此,整個檔名就成爲 (hd0,1)/vmlinuz-2.6.11-1.1369_FC4 了! 只要你能夠瞭解這個檔名的來源,那麼 grub 對你而言,已經沒有什麼大問題了! ^_^

# 2. 利用 chain loader 的方式:

所謂的 chain loader 僅是在將控制權交給下一個 boot loader 而已, 所以 grub 並不需要認識與找出 kernel file ,‘ 他只是將 boot 的控制權交給下一個 super block 或者是 MBR 內的 boot loader 而已 ’ 所以通常他也不需要去查驗下一個 boot loader 的開機磁區啊! 一般來說, chain loader 的設定只要兩個就夠了,一個是指定開機區的 root partition,另一個則是設定 chainloader 在那個磁區上!所以說,假設我的 Windows 磁區在 /dev/hda1 ,且我又只有一顆硬碟, 那麼要 grub 將控制權交給 windows 的 loader 只要這樣就夠了:

[root@linux ~]# vi /boot/grub/menu.lst
….前略….
title Windows partition
root (hd0,0)
chainloader +1

那個 root 代表的就是 Windows 的 C 槽啦!而 chainloader 則是載入 boot loader 的定義值, 那個 +1 代表的是‘第一個 sector ’也可以說成 Super block 啊!這樣說,理解嗎?! 但其實我們的 grub 功能是很強大的!他還可以隱藏某些 partition 呢! 讓您的 Windows 不會去讀取 Linux 的 partition 啊!舉例來說,以上面的例子在延伸, 假設我的 /dev/hda5 是 Linux 的磁碟系統,我想將他隱藏,並且把原先隱藏的 /dev/hda2 開啓,並且不去檢查 /dev/hda1 的開機區,所以,會變成:

[root@linux ~]# vi /boot/grub/menu.lst
….前略….
title Windows partition
unhide (hd0,1)
hide (hd0,4)
rootnoverify (hd0,0)
chainloader +1
makeactive

最後那個 makeactive 是讓開機區的 boot 項目 (記得用 fdisk -l 的顯示結果嗎? ^_^) 具有 active 的標誌而已啦!有沒有加都可以!很簡單吧!
這樣一來,您對於 grub 的硬碟以及 menu.lst 的設定應該有一定程度的認識了吧?好~ 接下來,讓我們實際的依據您的環境來安裝囉~ 在下一小節,我們會以鳥哥自己宿舍的電腦來做解釋呢! ^_^

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