速讀原著-GRUB_多系統引導(GRUB的配置文件的menu.lst的寫法)

  • 2020 年 2 月 14 日
  • 筆記

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

對於GRUB來說,如果沒有配置menu.lst,無論是Linux版本的GRUB,還是WINGRUB,都會有命令行可用,通過命令行是一樣能把作業系統引導起來的;有些弟兄總以為menu.lst 配置錯了, 或者在機器啟動後出現grub>命令行模式就要重新安裝系統,其實根本沒有這個必要;只要學會GRUB的命令行的用法,根本沒有必要重裝系統;

menu.lst 位於/boot/grub目錄中,也就是/boot/grub/menu.lst 文件;您可以用vi或您喜歡的編輯器來編輯他;如果您不會用vi,還是去學習一下吧;簡單的用法怎麼也得會,對不對?畢竟這個文檔不是講vi的用法的;

有的弟兄會說,我沒有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