歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux管理 >> Linux問題解決

Linux與Windows雙系統下的Grub引導管理器安裝

大多數人日常工作所用的系統是Windows,如果想嘗試或者轉向Linux,那麼進行Windows與Linux共存的雙系統安裝是個不錯的主意。但雙系統的安裝較之單系統,在磁盤分區和引導管理器兩個方面增加了復雜性,本文對雙系統下引導管理器的安裝來加以介紹。
筆者假定你已經有了一個可以正常運行的Win2k/XP系統,並且已經為Linux准備好了硬盤分區:Windows位於第一塊硬盤的第一個分區,在 Linux下表示為hda1,在Grub下表示為(hd0,0),而Linux位於hdaX,用Grub表示為(hd0, X-1)。——Linux下的硬盤分區計數是從hda1開始的,而Grub的硬盤分區計數是從(hd0,0)開始的,所以hdaX就是(hd0,X- 1)。這裡X如果在1-4之內,說明Linux分區是主分區,如果X大於4,說明Linux分區是邏輯分區,本文並不限定Linux必須位於主分區,它在邏輯分區一樣是可以引導的。
首先說明本文的思路,筆者推薦由Windows到Linux的引導序列,即首先引導Windows的ntloader,然後通過ntloader加載 Linux分區的Grub引導扇區,最後通過Grub引導Linux系統。本文涉及到的引導管理器包括ntloader和Grub,ntloader是 Windows系統自帶的,在安裝Win2k/XP後就已經安裝了,Windows 2000以及Windows Xp就是由ntloader加載的。Grub是Linux系統下很強大的引導管理器,在常見的Linux版本裡都是有的,一般是自動安裝的。
下面具體說明安裝序列:

一、在已經准備好的Linux分區上安裝Grub
這個過程通常是由Linux系統的安裝程序自動進行的,當安裝程序進行到引導管理器的安裝,並就Grub的安裝給出一些提示時,要當心了:我們選擇 Grub,而不是lilo,並且Grub要安裝在該Linux分區,不要安裝到硬盤主引導記錄MBR(master boot record)上。安裝程序詢問Grub的安裝位置時,應該是上文提到的hdaX或者(hd0,X-1),如果你寫成hda或者(hd0),就會安裝到 MBR上。
之所以強調Grub安裝到Linux分區,而不是MBR,因為本文是雙系統安裝,要顧忌到與Windows系統的兼容性(“兼容”在這裡並不准確,實際是共生的意思)。我們的原則,就是把對已經安裝的Windows系統的修改限制到最小的必要的程度,不去進行並非必要的修改,以此保障Linux與 Windows兩個系統的和平共處。“簡潔即美”,“簡單”也會更安全。
如果安裝到MBR,也是可以的,但可能會有下面的問題:
1、如果所安裝的Windows系統修改了MBR的默認設置,那麼再把Grub安裝到MBR,就對MBR的內容進行了修改,可能會導致Windows不能正常啟動。通常的Windows安裝並不會改動MBR的內容,但如果你安裝了一些引導管理程序,它們往往是通過MBR進行設置的。時下很流行的一些“一鍵恢復”程序,有些也是通過MBR設置的;
2、日後重裝Windows系統時,MBR裡的Grub會被擦除,這會造成Linux系統不能引導。雖然這個問題也是可以解決的,但筆者更欣賞一勞永逸的安裝方式,Grub安裝到Linux分區下,可以避免日後的麻煩;
3、在一些個別情形下,Grub不能正常引導系統。這個現象並不常見,但仍有可能發生,要知道Grub目前仍然是版本前的軟件,而將Grub裝到MBR裡,就會把問題弄得更復雜。
當你所安裝的Linux系統不能指定將Grub安裝到Linux的所在分區時,我們的選擇是:
暫將Grub安裝到MBR,如果Linux系統能被Grub加以引導,進入Linux系統後,我們再手工將Grub裝入Linux分區,然後恢復MBR;或者在安裝程序內暫時不進行Grub的安裝,退出安裝程序後手工安裝Grub。
恢復MBR需要用DOS、win98/me的啟動軟盤引導系統,以/mbr參數執行引導軟盤上的磁盤分區程序fdisk.exe,即在DOS命令行(plain dos)下執行A:\>fdisk /mbr。如果機器沒有軟驅,那麼就需要用光盤或者U盤來引導機器進入DOS;在Windows 2k/XP下,一個叫Vfloppy的軟件可以用軟盤鏡像文件來實現對軟盤的虛擬引導,如果你的機器沒有USB接口(或沒有可以引導DOS的U盤),也沒有光驅和軟驅,可以一試。
我曾經用Xubuntu的LiveCD在一台設置了“一鍵恢復”的TCL電腦安裝時,安裝程序沒有給出任何選擇,自動將Grub安裝到了MBR上,結果不能進入任何系統。最後還是用DOS下的A:\ > fdisk /mbr恢復了MBR,能夠正常引導Windows後,手工將Grub裝到了Linux下的根分區,然後通過ntloader加載Grub,才實現了對 Linux的引導。
手工安裝Grub的簡便方法是用一張帶有Grub的Linux LiveCD(比如常見的Knoppix、Morphix、Ubuntu,都是可以的),啟動系統,在Linux的安裝程序內如果能進入shell也是可以的,總之就是為了執行Linux指令,在終端下執行以下指令:
# grub
grub > root (hd0,X-1)
grub > setup (hd0,X-1)
grub > quit
以上指令首先定位Grub所需的/boot目錄在分區(hd0,X-1),然後將Grub的引導代碼寫入(hd0,X-1)分區的第一個扇區,所以你首先應該確保(hd0,X-1)分區內的/boot/grub目錄下已經有stage1、stage2、*_stage*等文件,這些文件可以通過釋放 Grub的打包文件來獲得,或者直接從LiveCD光盤內的/boot/grub目錄復制。
如果LiveCD帶有grub-install腳本,也可以直接執行
# mount /dev/hdaX /mnt
# grub-install --root-directory=/mnt /dev/hdaX
以上指令首先將帶有Grub目錄/boot/grub的/hdaX掛載到/mnt,然後將Grub安裝到/hdaX。

二、將Grub裝配到ntloader內
Grub已經安裝到了Linux分區內,但它還不能引導系統,我們需要把它和ntloader聯接起來,由ntloader對Grub加以引導。這是通過把hdaX分區內的Grub引導扇區轉換為文件,並裝配到Windows的ntloader內來實施的。
仍然用LiveCD啟動Linux系統(因為你所安裝的Linux系統目前還是不能引導的),或者在安裝程序可以進入shell的情況下,執行以下指令:
# mount -t vfat /dev/hda1 /mnt
# dd if=/dev/hdaX of=/mnt/linux.lnx bs=512 count=1
以上兩條指令將Windows的啟動分區(本文中為hda1)掛載到/mnt下,然後把Linux分區(hdaX)的第一個扇區(大小為512字節)復制為Windows啟動分區根目錄下名為linux.lnx的文件。
注意:如果你的Windows啟動分區(即Windows下的C盤)不是fat32文件系統,而是ntfs文件系統,你需要在軟驅內放入格式化的DOS軟盤,並將第一條指令替換為:
# mount -t msdos /dev/fd0 /mnt
因為ntfs文件系統不經過特殊處理,在Linux下是不可寫的,即使你將指令中的vfat替換為ntfs,實現了掛載,也是一樣,所以我們在這裡把linux.lnx寫入DOS格式的軟盤,然後通過軟盤在Windows下把linux.lnx放入C盤。
接著是在Windows下編輯C盤根目錄下的boot.ini文件,boot.ini通常是隱藏、只讀的系統文件,所以需要把它的“隱藏”、“只讀”屬性去掉,才可以編輯。在“我的電腦”工具菜單“文件夾選項”下的“查看”欄中取消“隱藏受保護的操作系統文件”和“隱藏已知文件類型的擴展名”,並選擇“顯示所有文件和文件夾”,就可以看到C盤根目錄下的boot.ini文件了。在boot.ini內的[operating systems]欄增添一行:
c:\linux.lnx=”Grub Menu”
並將[boot loader]欄內的“timeout=0”,改為“timeout=5”,這樣引導Windows時將會顯示帶有“Grub Menu”字樣的操作系統選擇菜單,並持續5秒鐘,如果選擇Grub Menu,就會進入Grub菜單。

三、設置menu.lst文件
menu.lst是對Grub進行設置的一個文本文件,可以用文本編輯器加以編輯,位於/boot/grub目錄內。我們在前面雖然已經把Grub安裝到了Linux根分區上,但如果沒有生成menu.lst文件並對它加以設置,Grub是沒有任何作用的。對menu.lst文件進行設置是個復雜的工作,特別是有關kernel和initrd的各種特殊參數,幸而系統安裝的menu.lst文件內通常有詳盡的注釋。並且你的Grub如果是由安裝程序自動設置的,那麼通常menu.lst已經被設置好了,我們僅僅根據自己的需要進行一些修改和調整,而不必重寫menu.lst。即使你的menu.lst不是由安裝程序生成的,也不必擔心,還可以參考、分析安裝光盤或者LiveCD上的menu.lst文件來對Linux分區內的menu.lst加以設置。
如果Grub已經由安裝程序裝到了MBR,並且能夠引導所安裝的Linux,那麼自動生成的Linux系統根分區下的 /boot/grub/menu.lst就已經被配置好了,我們只須把Grub重新安裝到Linux系統根分區,恢復Windows下的原初MBR,按照上文的方法把Linux系統根分區的Grub引導代碼裝載到ntloader就可以了。因為Grub的安裝位置不是在menu.lst文件內指定,而是在 linux shell中執行grub,進入Grub命令行後,應用Grub的內部指令root和setup來指定,或者在可執行的shell腳本文件grub- install中,以參數的形式指定設備文件(如/dev/hda或/dev/hdaX)。
假使所安裝的Linux系統沒有使用Grub,而是使用lilo作為引導管理器,只要lilo能夠實現引導,我們就可以借鑒linux系統內的 /etc/lilo.conf文件來對menu.lst加以設置。Lilo.conf是lilo的配置文件,其格式雖然與menu.lst不同,但關鍵部分是相同的,如指定kernel和initrd的位置,向內核傳遞引導參數,指定缺省引導的系統和延時時長,在lilo.conf中內核參數是在 APPEND後,我們可以將lilo.conf中的參數移植到menu.lst中。

四、Menu.lst的一個實例:
以下作為實例的menu.lst是我在windows 2000系統中安裝的grub4nt的配置文件,所以可以看到(hd0,0)既是Windows的引導分區,又是Grub文件及一些linux內核文件的所在分區。雖然Grub4nt不能在menu.lst中應用savedefault命令外(可能因為grub4nt不支持在fat32文件系統上的寫操作),其他設置與標准的Gnu Grub並無不同,大家可以通過這個實例來具體了解配置文件menu.lst。

default 0
timeout 5
foreground = 333333
background = eeeeee
color light-gray/blue black/light-gray
gfxmenu (hd0,0)/boot/morphix/message

title ubuntu linux
kernel (hd0,2)/vmlinuz ro root=/dev/hda3

title ubuntu linux (rescue mode)
kernel (hd0,2)/vmlinuz ro single root=/dev/hda3

title Other operating systems:
root

title PUD LiveHD
kernel (hd0,0)/boot/pud/linux lang=us ramdisk_size=100000 init=/etc/init apm=power-off vga=791 nomce initrd=miniroot.gz quiet BOOT_IMAGE=knoppix
initrd (hd0,0)/boot/pud/miniroot.gz

title Windows
root (hd0,0) 或者 rootnoverify (hd0,0)
makeactive
chainloader +1

title submenu -> Morphix LiveHD
configfile (hd0,1)/boot/grub/menu.lst

這裡不對menu.lst做全面解釋了,只結合實例,介紹幾個重點環節,完整說明請閱讀網上Grub的使用手冊。
Default 0
default用來設置缺省引導系統,數字序列從0開始,本例會在menu.lst內自動尋找以title開始的詞條,並引導第一個title詞條,你可以根據自己的需要改成其他數字,如1(第二個title詞條);
timeout 5
timeout用來設置Grub引導的延時時長,本例中為5秒鐘,系統在等待5秒後用戶如果沒有手動選擇要引導的系統,Grub就會自動引導由default指定的系統;
title ubuntu linux
title用來指示Grub所引導系統的設置的開始,title後面的文字在Grub菜單中會被作為系統的名稱顯示出來,本例中Grub引導菜單會顯示 ubuntu linux、ubuntu linux (rescue mode)、other operating systems、PUD LiveHD、Windows、submenu -> Morphix六個詞條,其中第三個詞條並非一個真實的系統,僅起指示的作用,故其root部分為空;
kernel (hd0,2)/vmlinuz ro root=/dev/hda3
kernel用來指示linux系統的內核文件的所在位置及引導參數,(hd0,2)/vmlinuz指內核為hda3(第一塊硬盤第三個主分區)內根目錄下的vmlinuz文件,根文件系統(/)位於hda3,注意:指示內核文件所用路徑中的分區必須用Grub的表示法,不能用linux的表示法,而根文件系統的位置必須用linux下的設備文件名來表示(本例中為/dev/hda3)。有時,vmlinuz並不是真實的內核文件,而是內核文件的一個鏈結文件(link file),但這不影響Grub的引導,它能根據鏈結文件找到真實的內核並加以引導,這在內核文件帶有很長的版本號時會非常有用,簡化了內核文件名的拼寫,減少了拼寫錯誤的出錯幾率;
kernel的這種設置是最為簡單的方式,也是比較通用的設置方式,使用安裝過的內核直接引導已安裝的根文件系統(即linux系統),而不需進行 initrd的設置;在不清楚內核的特殊設置參數時,可以用這種設置來嘗試引導系統。如果在以上設置中加上single,即改為kernel (hd0,2)/vmlinuz ro root=/dev/hda3 single,則系統引導後會進入單用戶(root用戶)的文本模式,即救援模式(rescue mode),在系統升級、維護或查找、排除故障時會比較有用;
initrd (hd0,0)/boot/pud/miniroot.gz
initrd用來指示initrd文件(即初始內存磁盤文件,linux系統中常用的引導技術)的位置,關於硬盤分區的表示方法與kernel的要求相同,必須用(hd0,0)這種Grub的表示方法;
root (hd0,0)
root用來定位分區,本例中為hda1,Windows系統的所在分區。如果在kernel和initrd之前使用它,可以用來簡化文件位置的表述,比如
kernel (hd0,2)/vmlinuz ro root=/dev/hda3
可以寫成
root (hd0,2)
kernel /vmlinuz ro root=/dev/hda3
而initrd也可如是模仿;
makeactive
makeactive用來激活root所定位的分區,它只能用於主分區,不能用於擴展分區上的邏輯分區,雖然可以用這種技術來引導Grub安裝在了主分區的linux系統但有比較大的局限性,所以通常是用來引導Windows系統;
chainloader +1
chainloader +1用來對makeactive所激活的主分區加以引導,同上:它只能引導主分區,所以通常是用來引導Windows系統,而linux系統可以安裝在擴展分區上的邏輯分區,通常是使用kernel和initrd這種功能更為強大、靈活的引導方式;
configfile (hd0,1)/boot/grub/menu.lst
configfile用來將其他的menu.lst菜單引入Grub菜單,在同一機器上安裝了多個linux系統、存在多個menu.lst文件時,這個語句非常有用,它可以簡化menu.lst文件的設置,不必重抄那些復雜的引導參數,只須把別的系統的menu.lst文件加以引用就可以了,在Grub 引導時選擇這個子菜單,就會進入所引用的menu.lst的引導菜單。
本例中的PUD LiveHD是將PUD(一種中文繁體Debian LiveCD版本)光盤上的內容復制到hda1(在本例中為Windows的C:盤) 中,然後使用grub4nt對其加以引導,這樣就實現了LiveCD到硬盤的移植,我稱之為LiveHD;而Morphix LiveHD則是將Morphix(一種模塊化的Debian LiveCD)光盤上的內容復制到一個單獨的ext2/3分區,本例中為(hd0,1),即hda2,實現LiveHD的引導。很有趣的是,PUD只能放入fat32分區,Morphix只能放入ext2分區,反之則不能引導,這應該是不同版本的LiveCD的內核所支持文件系統的不同所致。
注:Grub4nt是Grub在windows 2k/XP下的擴展,建基於Grub for DOS,/boot/grub目錄放在fat/fat32文件系統內,可以在ntloader內通過一個小文件grldr實現Grub的引導,而無須寫入 MBR,它是中國人的作品,作為一種新穎別致的引導方式,向世界上的linux愛好者展示了中國人的智慧,本文會在後面專門予以介紹。

五、boot.ini文件的調整
boot.ini是一個文本文件,可以用文本編輯器打開,它是win 2k/XP下ntloader的設置文件,下面是我的機器上的boot.ini實例:

[boot loader]
timeout=0
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
c:\ubuntu.lnx=Xubuntu Linux
c:\morphix.lnx=Morphix LiveHD
c:\grldr=Grub Menu
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Win2k" /fastdetect

我們逐行來對它加以解釋。
[boot loader]一節用來指定缺省引導的系統及其等待時間,本例中缺省引導第一塊IDE硬盤的第一個分區(表示為multi(0)disk(0)rdisk (0)partition(1),而如果你的windows Xp系統在硬盤的第二個分區,則表示為multi(0)disk(0)rdisk(0)partition(2)\WINDOWS,這種表示法不同於 linux,它不區別主分區和邏輯分區,而依據分區在磁盤上的順序從數字1開始計數)內的windows 2000系統,沒有延時,立即引導。
若把Timeout的值從0改為5,則延時5秒,供用戶選擇boot菜單;改為-1,則系統不進行自動引導,始終等待著用戶的鍵盤輸入來進行選擇。
[operating systems]一節用來描述boot菜單中要引導的不同系統,“=”後面的字符是boot菜單的顯示內容,而“=”前面的部分是ntloader實際引導的內容,multi(0)disk(0)rdisk(0)partition(1)\WINNT指ntloader所要引導的windows系統位於第一塊硬盤的第一個分區內的\winnt目錄,c:\ubuntu.lnx和c:\morphix.lnx則是應用dd命令在linux下將grub在根分區內的引導扇區轉換生成的文件,而c:\grldr是grub4nt的引導文件,用來實現grub在ntloader的引導。
[operating systems]內的不同詞條的順序是可以調整的,例如我們可以將c:\grldr=Grub Menu從本節第三行改為第一行,這樣Grub Menu就會在boot菜單的第一行顯示。
而缺省引導的系統也是可以改變的,例如我們可以將[boot loader]內的multi(0)disk(0)rdisk(0)partition(1)\WINNT改為c:\grldr,這樣缺省引導的就是 grub4nt的Grub菜單,而不是windows 2000了。這裡要注意:c:\grldr放入[boot loader]一節時,正確的寫法應該是
default=c:\grldr
一定不要將“=Grub Menu”帶上,否則boot菜單的顯示效果將不是我們所想要的,切記!

六、grub4nt的使用
將grub加載到ntloader裡的方法,除了上文第二部分所介紹的將Linux根分區內的Grub引導扇區轉換為ntloader可以引導的文件,還有另外一種方法,就是使用grub4nt。grub4nt通過grldr這個小文件,使ntloader直接加載Windows系統C:盤下的\boot \grub\menu.lst(新版本的grub4nt會尋找根目錄的\menu.lst)。
在windows下的boot.ini文件內[operating systems]一節增添一行如下:
c:\grldr=grub4nt
對grub4nt的menu.lst設置,既可以把Linux系統根分區內的/boot/grub/menu.lst直接移植過來(GNU Grub下的savedefault在grub4nt下不能使用,會導致grub4nt的出錯),也可以在grub4nt的menu.lst文件內通過 configfile直接引入Linux系統根分區內的/boot/grub/menu.lst菜單,而後者不失為一種簡單安全的方法,省掉了對內核引導參數的復雜設置。
即在grub4nt的menu.lst文件內這樣設置:
title GNU Grub menu
configfile (hda0,X)/boot/grub/menu.lst

七、總結
本文對Windows與Linux並存於同一機器時引導管理器的安裝給出了描述,可以看出,筆者推薦的是以Windows 2k/XP下的ntloader為主引導器,通過ntloader來加載Grub,最後由Grub實現Linux的引導。這樣一種引導序列的特點是,對 Windows的引導幾乎沒有加以改動,僅僅在其中插入了對Grub的加載。當然,相反的序列也是可以的,即首先引導Grub(可以將Grub裝入MBR 或者處於激活狀態的主分區),由Grub來加載ntloader(通過chainloader +1命令),然後實現對Windows的引導。但後者可能會引發其他的問題。
無論如何,本文中Linux的引導都是通過Grub進行的,不管是將Grub裝入Linux根分區、由ntloader加載Linux根分區的Grub引導扇區,還是通過grub4nt的grldr、由ntloader加載grldr來實現對Grub的引導。其實,Grub的引導扇區文件和grldr只是對Grub加載的不同實現方式罷了
Copyright © Linux教程網 All Rights Reserved