1、一個GRUB配置文件 2、解讀grub.conf文件 3、配置grub 4、GRUB的交互性 5、常見grub除錯方法的思路 1 一個GRUB配置文件 基於本例的分區如下: hda 15G hda1 8G / RED HAT LINUX8.0 hda5 7G /home hdc 20G hdc1 6.4G WinXP hdc5 6.4G hdc6 6.4G hdc7 6.4G #fdisk -l # Disk /dev/hdc: 255 heads, 63 sectors, 2434 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hdc1 * 1 894 7181023+ b Win95 FAT32 /dev/hdc2 895 2434 12370050 f Win95 Extd (LBA) /dev/hdc5 895 1787 7172991 b Win95 FAT32 /dev/hdc6 1788 2434 5196996 b Win95 FAT32 Disk /dev/hda: 255 heads, 63 sectors, 1867 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 1020 8193118+ 83 Linux /dev/hda2 1021 1802 6281415 83 Linux /dev/hda3 1803 1867 522112+ 82 Linux swap grub.conf,這個文件位於;/boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda default=0 timeout=3 splashimage=(hd0,0)/boot/grub/splash.xpm.gz title Red Hat Linux (2.4.18-14) root (hd0,0) kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ initrd /boot/initrd-2.4.18-14.img title Microsoft Windows XP map (hd0) (hd1) map (hd1) (hd0) root (hd1,0) chainloader (hd1,0)+1 makeactive boot
2 解讀grub.conf文件 我們將來看看grub.conf文件內語句,(注:...)內的東西是我們的解讀內容. # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda (注:以上以符號井"#"開頭的行表示被註釋掉,沒有任何意義) default=0 (注:默認的操作系統就是由default控制的。default后加一個數字n,表明是第 n+1個。需要注意的是,GRUB中,計數是從0開始的,第一個硬碟是hd0,第一 個軟碟機是fd0,等等。所以,default 0 表示默認的操作系統在這兒是 Red Hat Linux (2.4.18-14)如果你修改成1就是WinXP了) timeout=3 (注:timeout表示默認等待的時間,這兒是3秒鐘。超過3秒,用戶還沒有作出選 擇的話,系統將自動選擇默認的操作系統;當然你可以改成任何你樂意的時間) splashimage=(hd0,0)/boot/grub/splash.xpm.gz (注:指定開機畫面文件splash.xpm.gz的位置,也可以splash /boot/logo/800x600x8.img) title Red Hat Linux (2.4.18-14) (注:表示Red Hat Linux的菜單項) root (hd0,0) (注:表示第一個硬碟第一個分區,這裡的root和系 統內的root不是一碼事!詳細如下說明) kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ (注:指定內核的位置,詳細說明如下 文) initrd /boot/initrd-2.4.18-14.img (注:初始化) title Microsoft Windows XP (注:表示Microsoft Windows XP的菜單項) map (hd0) (hd1) (注:map是命令,詳細如下) map (hd1) (hd0) root (hd1,0) (注:這是指第二個硬碟(從硬碟)上第一個分區) chainloader (hd1,0)+1 (注:鏈式裝入器,裝入一個扇區的數據然後把引導 權交給它。詳細說明如下) makeactive boot (注:在 Linux 中,當談到 "root" 文件系統時,通常是指主 Linux 分區。但是,GRUB 有它自己的 root 分區定義。GRUB 的 root 分區是保存 Linux 內核的分區。這可能是您的正式 root 文件系統,也可能不是。我們討論的是 GRUB,需要指定 GRUB 的 root 分區。進入 root 分區時,GRUB 將把這個分區安裝成只讀型,這樣就可以從該分區中裝入 Linux 內核。GRUB 的一個很「酷」的功能是它可以讀取本機的 FAT、FFS、minix、ext2 和 ReiserFS 分區.到目前為止,您可能會感到一點疑惑,因為 GRUB 所使用的硬碟/分區命名約定與 Linux 使用的命名約定不同。在Linux 中,第一個硬碟的第五個分區稱作 "hda5"。而 GRUB 把這個分區稱作 "(hd0,4)"。GRUB 對硬碟和分區的編號都是從 0 開始計算。另外,硬碟和分區都用逗號分隔,整個表達式用括弧括起。現在,可以發現如果要引導 Linux 硬碟 hda5,應輸入 "root (hd0,4)"。 知道了內核在哪兒,還要具體指出哪個文件是內核文件,這就是kernel的工作。 kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/說明/boot/vmlinuz-2.4.18-14就是要載入的內核。後面的都是傳遞給內核的參數。root=LABEL=/就是linux的硬碟分區表示法,ro是readonly的意思。initrd用來初始的linux image,並設置相應的參數。 命令map:當你有兩塊硬碟,一個無法從第二塊硬碟啟動的操作系統,例如Windowsxp,就可以使用map命令.你能夠將hd0映射為hd1,將hd1映射為hd0。換句話說,你可以虛擬的交換兩個硬碟而啟動所需要的操作系統 。命令形式如下: grub> map (hd0) (hd1) grub> map (hd1) (hd0) GRUB 使用了「鏈式裝入器」(chainloader)。鏈式裝入器從分區 (hd1,0) 的引導記錄中裝入winxp自己的引導裝入器,然後引導它。這就是這種技術叫做鏈式裝入的原因 -- 它創建了一個從引導裝入器到另一個的鏈。這種鏈式裝入技術可以用於引導任何版本的 DOS 或 Windows。 GRUB的配置文件要簡單就這麼簡單,如果你要更個性化一點,試一試把「color light-gray/blue 」加在default語句的下面,下一次啟動GRUB時,看看有什麼變化,再試一試「color light-blue/red",驚喜嗎? 有趣吧! )
3 配置grub grub啟動時會在/boot/grub/中尋找一個名字為menu.lst的配置文件,如果找不到此文件則不進入菜單模式而直接進入命令行模式。 現在,我們來看一下如何在啟動後進入各種操作系統,如何建立menu.conf文件。我們就從GRUB支持的啟動過程開始。可以有兩種方法來完成啟動過程: •A.通過調用內核本地啟動 •B.連續啟動或者將控制轉給另一個引導器 A模式啟動過程 1.配置跟設備或者告訴GRUB你的根文件系統。 2.告訴GRUB你的內核影像的位置,然後將參數傳送給內核。 3.重新啟動,試一下。 為了啟動Linux,將內核以bzImage的文件名放在/boot/目錄中,跟文件系統是 /dev/hda1,或者GRUB中的(hd0,0)。啟動過程如下: 1.root (hd0,0) [This sets the root partition] 2.kernel /boot/bzImage root=/dev/hda1 [This sets the kernel] B模式啟動過程(這種模式假設當前的分區中安裝了另一個啟動管理器,例如LILO 或者NTLDR): 1.設置根分區但不要安裝它 2.激活這個分區 3.配置需要啟動的分區的第一個扇區 4.重新啟動,看一下效果。 我們在試試啟動安裝在/dev/hdc1或者(hd1,0)的windows。啟動windows的過程如下: 1.rootnoverify (hd1,0) 2.makeactive 3.chainloader +1 [+1 sets the first sector of the current root partition] 4.boot [transfers the control and quits GRUB] menu.conf文件:它用於建立啟動多操作系統時的菜單。建立menu.conf並不難。它使用簡單的英語,就象你在這一節看到的那樣。 所有的菜單項目都以沒有逗號分隔的「title TITLENAME」開頭。你可以隨意設置 TITLENAME。 設置Linux啟動菜單步驟如下: 1.設置標題 2.設置根分區 3.設置內核的相應參數 4.啟動 一個菜單例子: title Red Hat Linux (2.4.18-14) root (hd0,0) kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ initrd /boot/initrd-2.4.18-14.img 前面有#的行是一個註釋。 建立啟動Windows 或者 DOS的菜單: title Windoze rootnoverify (hd0,0) makeactive chainloader +1 boot #---- 又或者: title Microsoft Windows XP map (hd0) (hd1) map (hd1) (hd0) root (hd1,0) chainloader (hd1,0)+1 makeactive boot ---- 注意:root和rootnoverify都是一樣的,把rootnoverify改成root也行。不過經過實踐來看。有時引導win時,系統安裝好后,是rootnoverify (hdX.Y)這樣形式的,這樣會出現windows起不來,出現什麼windows什麼文件損壞的情況。這時,我們就要把在grub中,引導windows的那段中的rootnoverify改為root root英文的意思就是根的意思,在這裡是讓linux知道自己所處的位置,也就是我們所安裝linux的/根分區所在的位置 。
4 GRUB的交互性 GRUB 最好的優點之一就是其強健的設計 -- 在不斷使用它時請別忘了這點。如果更新內核或更改它在磁碟上的位置,不必重新安裝 GRUB。事實上,如有必要,只要更新 menu.lst 文件即可,一切將保持正常。 只有少數情況下,才需要將 GRUB 引導裝入器重新安裝到引導記錄。首先,如果更改 GRUB root 分區的分區類型(例如,從 ext2 改成 ReiserFS),則需要重新安裝。或者,如果更新 /boot/grub 中的 stage1 和 stage2 文件,由於它們來自更新版本的 GRUB,很有可能要重新安裝引導裝入器。其它情況下,可以不必理睬! GRUB的最大的特點就是交互性特彆強。在開機時,按一下「c」,將進入GRUB 控制台。顯示如下: GRUB version 0.5.96.1 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename. ] grub> 歡迎使用 GRUB 控制台。現在,再研究命令: 將通過GRUB 控制台繞過lilo來啟動RedHat linux, grub> root (h 現在,按一次 Tab 鍵。如果系統中有多個硬碟,GRUB 將顯示可能完成的列表,從 "hd0" 開始。如果只有一個硬碟,GRUB 將插入 "hd0,"。如果有多個硬碟,繼續進行,在 ("hd2") 中輸入名稱並在名稱后緊跟著輸入逗號,但不要按 Enter 鍵。部分完成的 root 命令看起來如下: grub> root (hd0, 現在,繼續操作,再按一次 Tab 鍵。GRUB 將顯示特定硬碟上所有分區的列表,以及它們的文件系統類型。在我的系統中,按 Tab 鍵時得到以下列表: grub> root (hd0, (tab,按tab一下鍵) Possible partitions are: Partition num: 0, Filesystem type is fat, partition type 0x6 Partition num: 2, Filesystem type is ext2fs, partition type 0x83 Partition num: 4, Filesystem type unknown, partition type 0x7 Partition num: 5, Filesystem type is ext2fs, partition type 0x83 Partition num: 6, Filesystem type is fat, partition type 0xb Partition num: 7, Filesystem type is fat, partition type 0xb Partition num: 8, Filesystem type is ext2fs, partition type 0x83 Partition num: 9, Filesystem type unknown, partition type 0x82 如您所見,GRUB 的互動式硬碟和分區名稱實現功能非常有條理。這些,只需要好好理解 GRUB 新奇的硬碟和分區命名語法,然後就可以繼續操作了 grub> root (hd0, 現在已安裝了 root 文件系統,到裝入內核的時候了 grub> kernel /boot/vmlinuz-2.4.2 root=/dev/hda5 ro [Linux-bzImage, setup=0x1200, size=0xe1a30] 您已經安裝了 root 文件系統並裝入了內核。現在,可以引導了。只要輸入 "boot",Linux 引導過程就將開始。是不是很cool啊,GRUB的menu.lst更像一個linux下的腳本程序。 5 常見grub除錯方法的思路 首先進去Linux的rescue模式! 用軟盤或光碟啟動,然後在啟動的提示符輸入:linux rescue 按照提示進入一個Shell狀態,你可以到/mnt/下面看到一個sysimage這麼目錄,進去以後,就是你安裝linux的/分區. 使用命令將根分區變為當前目錄的根分區:chroot /mnt/sysimage 然後轉到/sbin/這個目錄中. 使用fdisk -l 顯示當前分區情況,然後使用#grub-install /dev/hdx(x為你使用的是那塊硬碟安裝的,一般情況下是hda) 使用exit推出chroot,再使用exit退出linux rescue模式,系統將重新啟動!取出光碟,應該可以看到grub安裝好了. 在具體的環境中,編輯/boot/grub/grub.conf文件和menu.lst文件