1. 程式人生 > >GRUB手冊(1)

GRUB手冊(1)

1.       GRUB的簡介

1.1. 概覽

概而言之,當計算機啟動時,啟動載入器是第一個執行的程式。它負責載入並把控制傳遞給作業系統核心(例如Linux或GNU Mach)。核心依次初始化作業系統剩下的部分(即,GNU系統)。

GNU GRUB是一個非常強大的啟動載入器,它可以載入相當多的自由作業系統,以及通過鏈式載入(鏈式載入的機制,通過載入另一個啟動載入器,來載入不支援的作業系統。它主要用於載入DOS或Windows)載入專有作業系統。GRUB被設計來處理個人計算機啟動的複雜性;程式及本手冊緊密地與計算機平臺聯絡,雖然在將來會涉及到其它平臺的移植。

GRUB的一個重要特性是靈活;GRUB理解檔案系統及核心的可執行格式,因此你可以以你喜歡的方式載入任意作業系統,不需要記錄核心在硬碟上的位置。這樣你可以僅指出檔名,以及核心所在的啟動分割槽,來載入核心。

當使用GRUB啟動時,你可以使用命令列介面(參考12.1節【命令列介面】,29頁),或選單介面(參考12.2節【選單介面】,30頁)。使用命令列介面時,需要手工鍵入驅動器及核心檔名。在選單介面中,你只需使用箭頭選擇一個OS。該選單基於你先前準備的一個配置檔案(參考第5章【配置】,11頁)。而在該選單中,你可以切換到命令列模式,反之亦然。你甚至可以在使用選單前編輯它。

在下面的章節中,你將學習到如何向GRUB指定一個驅動器,一個分割槽,及一個檔名(參考第2章【命名規則】,5頁),如何在你的驅動器上安裝GRUB(參考第3章【安裝】,5頁),及如何一步步地啟動你的OS(參考第4章【啟動】,9頁)。

1.2. GRUB的歷史

GRUB源至1995年,當時ErichBoley嘗試引導使用Utah大學的Mach 微核心(現在以GNUMach而聞名)的GNU Hurd。Erich與BrianFord設計了多重啟動規範(Multiboot Specification)(參見TheMultiboot Specification 中的“Motivation”一節),因為他們決定不要增加已經很多的,互不相容的PC啟動方案。

Erich開始修改FreeBSD的啟動載入器,使之可以理解多重啟動。他很快意識到從頭寫自己的啟動載入器,比繼續修改FreeBSD的啟動載入器要簡單得多,因而誕生了GRUB。

Erich向GRUB加入許多特性,但其它優先考慮的事使得他不能跟上GRUB快速增加的使用者群的要求。在1999年,Gordon Matzigkeit與Yoshinori K.Okuji採納GRUB作為正式的一個GNU程式包,並使得最新的原始碼可以通過匿名CVS得到,來開放對其的開發。進一步細節參考附錄A【獲取並構建GRUB】,55頁。

接下來幾年裡,GRUB被擴充套件來滿足許多的需要,但很快事情變得清晰起來,其設計不能跟上對其所提出的擴充套件要求,並且已經到了這一點上——不打破現有的特性,進行進一步的修改非常困難。2002年前後,Yoshinori K. Okuji開始PUPA(GNU GRUB初步通用程式設計架構 - Preliminary Universal ProgrammingArchitecture for GNU GRUB)的工作,致力於重寫GRUB的核心,使它更清晰,更安全,更強壯,以及強大。PUPA最終被重新命名為GRUB 2,而GRUB的最初版本被命名為GRUB Legacy。GRUB Legacy依然有少量的維護,不過最後的版本(0.97)在2005年完成,而在這份文件的製作時刻(譯:指英文版,日期是2011年5月11日),看起來不太可能會有新的版本。

在2007年前後,GNU/Linux發行版開始在有限範圍內使用GRUB 2,而到2009年底,多個主要發行版預設都安裝GRUB 2。

1.3. 與上一版的差別

GRUB 2是GRUB的一個重寫版本(參考1.2節【歷史】,1頁),雖然它與前一個版本,現在的GRUB Legacy,共享許多特徵。GRUB Legacy的使用者可能需要一些指引來熟悉這個新版本。

l       配置檔案具有一個新的名字(‘grub.cfg’而不是‘menu.lst’或‘grub.conf’),新詞法(參考第5章【配置】,11頁),以及許多新命令(參考14章【命令】,35頁)。配置不能被直接拷貝,雖然絕大多數GRUB Legacy使用者不應該對這個詞法感到驚奇。

l       ‘grub.cfg’通常地由grub-mkconfig自動產生(參考5.1節【簡單配置】,11頁)。這使得處理核心版本的升級更加容易。

l        在GRUB裝置名中的分割槽號現在從1開始,而不是0(參考第2章【命名規則】,5頁)。

l       配置檔案以更接近一個完全指令碼語言的語言來完成:可以使用變數,條件及迴圈。

l       在重啟過程使用GRUB中的save_env及load_env命令,及grub-editenv實用程式,可使用少量永久儲存。這不是在所有的配置中都可用的(參考13.2節【環境塊】,35頁)。

l       GRUB 2有更可靠的方式來找出它自己的檔案,以及在多盤系統上的目標核心,還有命令(參考14.3.40節【search】,44頁)來找出使用檔案系統標籤或全域性唯一識別符號(UUID)的裝置。

l        除了GRUB Legacy支援的PC BOIS系統,GRUB2還可用於其它系統:PC EFI,PC coreboot,PowerPC,SPARC,及MIPSLemote Yeeloong都被支援。

l        支援更多檔案系統,包括但不限於ext4,HFS+,及andNTFS。

l        GRUB 2可以直接從LVM及RAID裝置讀入檔案。

l        有一個圖形化終端及一個圖形化菜單系統。

l        GRUB 2介面,包括選單項名字,可以被翻譯。

l        構成GRUB的映像檔案(參考第10章【映像檔案】,26頁)被重組了,不再有Stage 1,Stage 1.5及Stage2。

l        GRUB 2把許多工具做成動態載入的模組,使得核心映像更小,並允許以更靈活的方式構建核心映像。

1.4. GRUB特性

對GRUB的主要要求是,符合多重啟動規範,這在多重啟動規範的“Motivation”一節中描述。

其它目標,以大致的重要性排列,有:

l        對於終端使用者,基本功能應該簡單明瞭。

l        向核心專家及設計者提供豐富的功能。

l        向後相容啟動FreeBSD,NetBSD,OpenBSD,以及Linux。通過一個鏈式載入功能支援專有核心(比如DOS,Windows NT,及OS/2)。

除了特殊的相容模式(鏈式載入及Linux的piggyback格式),正如多重啟動規範所示,所有核心將以幾乎相同的方式啟動。當前僅支援在1M或以上地址載入核心。任何該邊界以下的載入嘗試,將直接導致失敗,併產生一個報告這個問題的錯誤訊息。

除了上述的要求,GRUB具有如下的特性(注意多重啟動規範不要求GRUB所支援的所有特性):

識別多種可執行格式

支援多種a.out變體,包括ELF。符號表亦被載入。

支援非多重啟動核心

支援多種缺少多重啟動能力的32位自由核心(主要是FreeBSD,NetBSD,OpenBSD,以及Linux)。亦支援其它啟動載入器的鏈式載入。

載入多個模組

完全支援載入多個模組的多重啟動特性。

載入配置檔案

支援一個使用預置啟動命令的可讀的文字配置檔案。你也可以動態地載入另一個配置檔案,以及在一個GRUB映像檔案中嵌入一個預置的配置檔案。這些命令(參考第14章【命令】,35頁)是命令列所支援的一個超集。第5章【配置】,11頁,給出了配置檔案的一個例子。

提供一個選單介面

可使用一個列出預置的啟動命令的,具有可程式設計超時的選單介面。 對啟動項的數目沒有硬性的限制,當前的實現可以容納數以百計的項。

具有一個靈活的命令列介面

一個相當靈活的命令列介面,可從選單訪問,可編輯任意預設的命令,或從頭編寫一個啟動命令集。如果配置檔案沒有出現,GRUB退至命令列。這些命令(參考第14章【命令】,35頁)是配置檔案所支援的一個子集。命令編輯非常類似於Bash命令列(參考Bash特性中“命令列編輯”一節),可使用TAB補全的命令、裝置、分割槽,及在一個依賴於上下文目錄中的檔案。

支援多種檔案系統

支援多種檔案系統,包括一個有用的顯式塊列表記法。當前支援的檔案系統有Amiga快速檔案系統(AFFS),AtheOS fs,BeFS,cpio,Linux ext2/ext3/ext4,DOSFAT12 / FAT16 / FAT32,HFS,HFS+,ISO9660,JFS,Minix fs,nilfs2,NTFS,ReiserFS,Amiga智慧檔案系統(SFS),tar,UDF,BSDUFS/UFS2,及XFS。更多資訊參見第11章【檔案系統】,28頁。

支援自動解壓縮

可以解壓縮由gzip或xz(僅支援CRC32資料完整性檢查(xz的預設是CRC64,因此應該使用-check=crc32選項),支援LZMA BCJ過濾器)壓縮的檔案。這個功能對於使用者是透明且自動可用的(即所有功能工作於指定檔案的非壓縮內容上)。這大大減少了檔案大小及載入時間,尤其對於軟盤(有某些病態的情形,載入組織得非常糟的ELF核心要花更長的時間,不過實際上這不會發生)。可以想見,某些核心模組應該以壓縮狀態載入,因此應該指定一個不同的模組載入命令來避免解壓縮該模組。

訪問任意已安裝裝置的資料

支援從任意或所有由BIOS組織的軟盤或硬碟讀資料,這不依賴於root裝置的設定。

獨立於驅動幾何資料的解釋

不像許多其它的啟動載入器,GRUB使得所指定驅動的幾何資料的解釋無關要旨。一個已安裝並以一種解釋執行的驅動,可以被轉換為另一種解釋,而不會對GRUB的配置產生任何不良影響。

檢測所有已安裝的ram

GRUB通常可以找出在一臺PC相容機器上所有已安裝的ram。它使用一個先進的BIOS查詢技術來查詢所有的記憶體區域。如多重啟動規範所描述的(參考多重啟動規範的“動機”一節 ),不是所有的核心都使用這個資訊,不過GRUB為使用的核心提供這個資訊。

支援邏輯塊地址模式

在傳統的硬碟呼叫中(稱為CHS模式),幾何資料的解釋存在一個問題,即,BIOS不能訪問超過1024個柱面,因而可訪問的空間被限制為最少508 MB,最多8GB。GRUB不能統一地處理這個問題,因為沒有一個標準的介面可用於所有的機器。不過,某些新式的機器具有新的介面,即,邏輯塊地址(LBA)模式。GRUB自動地檢測LBA模式是否可用,如果可用就使用之。在LBA模式中,GRUB可用訪問整個硬碟。

支援網路啟動

GRUB主要是一個基於硬碟的啟動載入器,不過也同樣具有網路支援。你可以通過使用TFTP協議,從網路載入OS映像。

支援遠端客戶端

為了支援沒有控制檯的計算機,GRUB提供了遠端客戶端支援,因此你可以從一臺遠端主機控制GRUB。目前僅支援序列客戶端。

1.5. 啟動載入器的角色

以下引用自GordonMatzigkeit,一個GRUB狂熱愛好者:

某些人當談及他們的電腦時,傾向於確認作業系統及核心,因此他們可能會說他們使用“GNU/Linux”或“GNU/Hurd”。其他人看起來認為核心是系統最重要的部分,因此,他們傾向於稱呼他們的GNU作業系統為“Linux系統”。

我,個人地,相信這是一個極為不公正的判斷,因為啟動載入器才是所有中最重要的軟體。我習慣把上面的系統稱為“LILO”或“GRUB”系統。

很不幸,沒有人能明白我在說什麼;現在我只使用“GNU”這個詞作為GRUB的一個別名。

因此,如果你曾經聽到人們討論他們所宣稱的“GNU”系統,記住他們實際上是在向最好的啟動載入器GRUB致敬!

2.       命名規則

GRUB中使用的驅動器記法,與你之前在你的作業系統中看到的有一點不同,你需要了解它,使得你可以指定一個驅動器或分割槽。

考慮下面的例子及解釋:

(fd0)

首先,GRUB要求驅動器名必須封裝在‘(’及‘)’之間。‘fd’部分表示這是一個軟盤。數字‘0’是驅動器號,它從0開始計數。這個表示式表示GRUB將使用整個軟盤。

(hd0,msdos2)

在這裡,‘hd’表示這是一個硬碟驅動器。第一個整數‘0’表示驅動器號,即,第一個硬碟,字串‘msdos’顯示分割槽規劃,而第二個整數‘2’表示分割槽號(或按BSD術語,pc的片號碼(slicenumber))。分割槽號從1開始計數,而不是從0開始(前一個版本GRUB的做法)。這個表示式表示第一個硬碟驅動器的第二個分割槽。在這個情形下,GRUB使用該硬碟的一個分割槽,而不是整個硬碟。

(hd0,msdos5)

這表示第一個硬碟驅動器的第一個擴充套件分割槽。注意擴充套件分割槽的分割槽號從‘5’開始計數,而不管在你硬碟上實際主分割槽的數目。

(hd1,msdos1,bsd1)

這表示BSD第二個硬碟的第一個P片號碼的‘a’分割槽。

顯然,要使用GRUB真正訪問硬碟或分割槽,你需要在一個命令中具體說明驅動器,就像‘set root=(fd0)’或‘parttool (hd0,msdos3) hidden-’。為了幫助你找出哪個號碼指定你所需要的分割槽,GRUB命令列(參考12.1節【命令列介面】,29頁)選項具有引數完成功能。這意味著,比如,你只需要鍵入

set root=(

接著鍵入一個TAB,GRUB將顯示驅動器,分割槽,或檔名的列表。因此確定目標分割槽的名字相當簡單,就算只略懂這個詞法。

注意到GRUB不區分IDE與SCSI – 它只是簡單地從0開始計算驅動器號,而不考慮其型別。通常地,IDE驅動器號小於SCSI驅動器號,雖然如果你在你的BIOS中交換IDE及SCSI驅動器的啟動順序,會改變這個事實。

現在問題是,如何指定一個檔案?再次的,考慮一個例子:

(hd0,msdos1)/vmlinuz

這指定名為‘vmlinuz’,在第一個硬碟驅動器的第一個分割槽的檔案。注意到引數完成也能用於檔名。

應該承認這很簡單。現在閱讀下一章,看如何真正地在你的驅動器上安裝GRUB。

3.       安裝

為了把GRUB安裝為你的啟動載入器,首先你需要在你的類unix作業系統下安裝GRUB系統及實用程式(參考附錄A【獲取及構建GRUB】,55頁)。你可以從原始碼tarball或針對你的OS的軟體包,來做到這一點。

在完成之後,你需要使用程式grub-install在一個類unixOS的一個驅動器(軟碟機或硬碟)上安裝啟動載入器(參考第19章【呼叫grub-install】,53頁)。

GRUB帶有啟動映像,這些映像通常放在目錄‘/usr/lib/grub/<cpu>-<platform>’下面(對於基於BIOS的系統,為‘/usr/lib/grub/i386-pc’)。此後,GRUB映像最初被放入的目錄(通常是‘/usr/lib/grub/<cpu>-<platform>’)將被稱為映像目錄,而啟動載入器需要在其中查詢它們的目錄(通常是‘/boot’)將被稱為啟動目錄。

3.1. 使用grub-install安裝GRUB

至於在PCBIOS平臺上,GRUB應該被安裝在何處的資訊,參考3.4節【BIOS安裝】,8頁。

為了在一個類UNIXOS(例如gnu)下安裝GRUB,以超級使用者(root)呼叫grub-install(參考第19章【呼叫grub-install】,53頁)。

其用法大致說來非常簡單。你僅需要向這個程式指定一個引數,也就是,何處安裝這個啟動載入器。這個引數必須是一個啟動檔案(如‘/dev/hda’)。例如,在Linux下,以下將把GRUB安裝如第一個IDE硬碟的MBR:

# grub-install /dev/hda

類似的,在GNU/Hurd下,這有相同的效果:

# grub-install /dev/hd0

但是上面的例子假設GRUB應該把映像放入‘/boot’目錄。如果你希望GRUB把映像放入‘/boot’以外的目錄,你需要指定選項‘--boot-directory’。典型的用法是你建立了帶有一個檔案系統的GRUB啟動軟碟機。這裡是一個例子:

# mke2fs /dev/fd0

# mount -t ext2 /dev/fd0 /mnt

# mkdir /mnt/boot

# grub-install --boot-directory=/mnt/boot /dev/fd0

# umount /mnt

某些BIOS有一個bug,把USB驅動的第一個分割槽視為一個軟碟機,而不是一個硬碟(它們稱其為“USB-FDD”啟動)。在這種情形下,你需要這樣來安裝:

# losetup /dev/loop0 /dev/sdb1

# mount /dev/loop0 /mnt/usb

# grub-install --boot-directory=/mnt/usb/bugbios --force--allow-floppy /dev/loop0

這個安裝不會與標準安裝衝突,只要它們在不同的目錄中。

注意到grub-install實際上只是一個shell指令碼,而真正的工作由grub-mkimage及grub-setup完成。因此,你可以不使用grub-install,直接執行這些命令來安裝GRUB。不過,不要這樣做,除非你非常熟悉GRUB的內部構造。在一個執行中的OS上安裝一個啟動載入器可能非常危險。

3.2. 製作一個GRUB可啟動的CD-ROM

GRUB支援ElTorito規範(用於使用BIOS功能的可啟動CD的規範)的非模擬模式。這意味著你可以從GRUB使用整個CD-ROM,並且你不需要製作一個軟碟機或硬碟映像檔案,這個檔案會導致相容問題。

至於從一個CD-ROM啟動,GRUB使用一個稱為‘cdboot.img’的特殊映像,它與‘core.img’連結。用於這個目的的‘core.img’應該至少構建有‘iso9660’及‘biosdisk’模組。你的可啟動CD-ROM通常也需要包括一個配置檔案‘grub.cfg’以及某些其它的GRUB模組。

為了製作一個簡單通用的GRUB救援CD,你可以使用grub-mkrescue程式(參考第22章【呼叫grub-mkrescue】,54頁):

$ grub-mkrescue -o grub.iso

你將經常需要在你的映像檔案中包括其它檔案。為了這樣做,首先為可啟動映像構建一個頂層目錄,比如‘iso’:

$ mkdir iso

為GRUB構建一個目錄:

$ mkdir -p iso/boot/grub

如果需要,在‘iso/boot/grub’下製作配置檔案‘grub.cfg’(參考第5章【配置】,11頁),並拷貝用於這個光碟的所有檔案、目錄到目錄‘iso/’。

最後,製作映像檔案:

$ grub-mkrescue -o grub.iso iso

這產生一個名為‘grub.iso’的檔案,然後它可以被燒入一個CD(DVD)中,或寫入一個USB儲存裝置。

在進入配置檔案‘grub.cfg’時,將正確建立根裝置,因而你可以在CD上引用檔名,而不需要使用一個顯式的裝置名。這使得製作可在光碟及USB上工作的救援映像更加容易。

3.3. BIOS裝置與OS裝置之間的對映

grub-mkdevicemap程式可以用於構建裝置對映。如果裝置對映檔案不存在,它通常為例如grub-install的工具所執行。首選檔名為‘/boot/grub/device.map’。

如果存在裝置對映檔案,GRUB實用程式(grub-probe,grub-setup等)讀入它來把BIOS裝置對映到OS裝置。這個檔案包含像這樣的行:

device file

device是以GRUB詞法所指定的一個裝置(參考11.1節【裝置詞法】,28頁),而file是一個OS檔案,它通常是一個裝置檔案。

以往,使用裝置對映檔案是因為GRUB裝置名要使用在配置檔案中,並且它們從BIOS裝置號匯出。BIOS裝置與OS裝置之間的對映不總是能正確地猜出:例如,如果在BIOS中交換了IDE與SCSI的啟動次序,GRUB將得到錯誤的次序。

不幸的是,OS裝置名甚至不是一成不變的。Linux核心的新版本可能每次啟動以不同的次序搜尋裝置,而且字首(‘/dev/hd*’與‘/dev/sd*’) 依賴於所使用的裝置子系統,可能會改變。結果,裝置對映檔案,在某些系統上,要求頻繁地修改。

現在,GRUB通過在產生‘grub.cfg’時使用UUID或檔案系統標記,避免了這個問題,並且我們建議在你製作的定製選單項中也這樣做。如果裝置對映檔案不存在,那麼GRUB實用程式將採用一個隨時更新的臨時裝置對映檔案。這通常足夠好,特別在常見的單硬碟系統上。

不過,裝置對映檔案也還沒完全過時,仍然有一些情形要求它的存在。如果grub-mkdevicemap產生了一個錯誤,這時,如有必要,你可以編輯這個檔案。你可以在檔案中加入任意需要的註釋,因為GRUB實用程式假定第一個字元是‘#’的行是註釋。

3.4. BIOS安裝

MBR

通常用在PCBIOS平臺上的分割槽表格式被稱為主啟動記錄(MBR)格式;這個格式允許最多四個主分割槽及一個額外擴充套件分割槽。使用這個分割槽表格式,有兩種方式安裝GRUB:它可以被嵌入到MBR與第一個分割槽之間的區域(有多種名字稱呼,比如“boot track”,“MBR gap”,或“embedding area”,通常至少31 KiB),或者core映像可以被安裝在一個檔案系統中,而構成它的塊列表可以被儲存在該分割槽的第一個扇區。

每種方式都有自己的問題。沒有完全安全的方法來保留嵌入區域內的空間,某些專有軟體已知會使用它,使得使用者難以繞過許可證限制;而且系統有時不在第一個分割槽之前留出足夠的空間。另一方面,安裝到一個檔案系統意味著GRUB容易受到檔案系統功能所傷害,比如尾整理,移動其資料塊,甚至過分的fsck,因此這個方式相當脆弱;並且這個方式僅當‘/boot’檔案系統在啟動BIOS的硬碟上時,才可以使用,這樣GRUB才不需要猜測BIOS裝置號。

GRUB開發團隊通常建議在第一個分割槽嵌入GRUB,除非你有特殊的要求。你必須確保第一個分割槽至少離硬碟開始位置31 KiB(63個扇區);在現代硬碟上,分割槽對齊在更大的邊界會帶來效能上的好處,因此第一個分割槽可能離硬碟開始位置1 MiB以外。

GPT

某些更新式的系統使用GUID分割槽表(GPT)格式。這個格式被規定為可擴充套件韌體介面(EFI)的一部分,不過如果系統軟體支援,它也可以用在BIOS平臺上;例如,GRUB及GNU/Linux可被用在這個配置中。通過這個格式,可以為GRUB保留被稱為BIOS啟動分割槽的一整個分割槽。然後GRUB可以嵌入到這個分割槽,而不會有被其它軟體改寫的風險,也不需要包含在可能會移動它資料塊的檔案系統中。

當在一個GPT系統上構建一個BIOS啟動分割槽時,你應該確保它至少有31 KiB大小(GPT格式化硬碟通常不會那麼小,因而我們建議你構建得大一些,比如1 Mib,以允許足夠的增長空間)。你還必須確保它有正確的分割槽型別。使用GNU Parted,你可以使用類似下面的命令設定它:

# parted /dev/disk set partition-number bios_grub on

如果你正在使用gdisk,把分割槽型別設定為‘0xEF02’。使用要求直接設定GUID的分割槽程式,它應該是‘21686148-6449-6e6f-744e656564454649’。

注意:小心你選擇的分割槽!當GRUB在安裝期間找到一個BIOS啟動分割槽,它將自動地覆蓋其中部分。確保該分割槽不包含其它資料。

4.       啟動

GRUB可以一致的方式載入多重啟動相容的核心,但對於某些自由作業系統,你需要使用某些OS特別的魔數。

4.1. 如何啟動作業系統

GRUB具有兩種不同的啟動方法。一個是直接載入一個作業系統,而另一個是鏈式載入另一個啟動載入器,它然後將真正載入一個作業系統。概括而言,前者是更期望的,因為你不需要安裝或維護其它啟動載入器,並且GRUB足夠靈活,能從任意硬碟、分割槽載入一個作業系統。不過,後者有時也是需要的,因為GRUB不是天然地支援所有現存的作業系統。

4.1.1. 如何使用GRUB直接啟動一個OS

多重啟動(參考多重啟動規範中的“動機”一節)是GRUB支援的原有格式。出於方便的緣故,還有對Linux,FreeBSD,NetBSD及OpenBSD的支援。如果你希望啟動其它作業系統,你將要鏈式載入它們(參考4.1.2節【鏈式載入】,9頁)。

FIXME:這一節未完成。

  1. 執行命令列啟動(參考14.3.4節【boot】,38頁)。

不過,DOS及Windows有某些缺陷,因此你可能不得不使用更復雜的指令。更多內容參考4.2.3節【DOS/Windows】,11頁。

4.1.2. 鏈式載入一個OS

不支援多重啟動,並且在GRUB中沒有特殊支援的作業系統(存在對Linux,FreeBSD,NetBSD及OpenBSD的特殊支援)必須被鏈式載入,這涉及載入另一個啟動載入器,然後在真實模式中跳轉至它。

鏈式載入器命令(參考14.3.6節【chainloader】,38頁)用於這個目的。通常也需要載入某些GRUB模組來設定合適的根裝置。綜合起來,我們得到像這樣結論,對於在第一個硬碟的第一個分割槽上的一個Windows系統:

menuentry"Windows" {

insmod chain

insmod ntfs

set root=(hd0,1)

chainloader +1

}

在具有多個硬碟的系統上,可能要求一個額外的變通方案。參考4.2.3節【DOS/Windows】,11頁。

鏈式載入僅在PCBIOS及EFI平臺上支援。

4.2. OS特定問題的一些告誡

在這裡,我們描述關於幾個作業系統的一些告誡。

4.2.1. GNU/Hurd

因為GNU/Hurd是多重啟動相容的,很容易啟動它;對此這裡沒有什麼特殊。但不要忘記你必須向核心指定一個根分割槽。

1.       設定GRUB的根裝置為與GNU/Hurd的相同。命令search --file --set/boot/gnumach.gz或類似的命令可能可幫助你(參考14.3.40節【search】,44頁)。

2.       像這樣載入核心及模組:

grub> multiboot /boot/gnumach.gz root=device:hd0s1

grub> module /hurd/ext2fs.static ext2fs --readonly \

--multiboot-command-line=’${kernel-command-line}’ \

--host-priv-port=’${host-port}’ \

--device-master-port=’${device-port}’ \

--exec-server-task=’${exec-task}’ -T typed ‘${root}’ \

‘$(task-create)’ ‘$(task-resume)’

grub> module /lib/ld.so.1 exec /hurd/exec ‘$(exec-task=task-create)’

3.       最後,執行啟動命令(參考14.3.4節【boot】,38頁)。

4.2.2. GNU/Linux

從GRUB啟動GNU/Linux相對簡單,因為它有點類似於啟動一個多重啟動相容OS。

1.       設定 GRUB的根裝置為與GNU/Linux的相同。命令search --file --set /vmlinuz或類似的命令可能可幫助你(參考14.3.40節【search】,44頁)。

2.       使用命令linux載入核心(參考14.3.24節【linux】,41頁):

grub> linux /vmlinuz root=/dev/sda1

如果你需要指定某些核心引數,只要把它們附加到命令上。例如,把‘acpi’設定到‘off’,要這樣做:

grub> linux /vmlinuz root=/dev/sda1 acpi=off

至於可用選項的完整資訊,參考Linux原始碼樹中的文件。

在linux命令裡,GRUB使用32位協議。在這個協議中某些BIOS服務,象APM或EDD不可用。在這種情況下,你需要使用linux16:

grub> linux16 /vmlinuz root=/dev/sda1 acpi=off

3.       如果你使用一個initrd,在linux後執行命令initrd(參考14.3.20節【initrd】,41頁):

grub> initrd /initrd

如果你使用linux16,你需要使用initrd16:

grub> initrd16 /initrd

4.       最後,執行命令boot(參考14.3.4節【boot】,38頁)。

注意:如果你使用一個initrd,並向核心指定‘mem=’選項,使得它使用少於真實大小的記憶體,你將也要向GRUB指定相同的記憶體大小。為了使GRUB知道這個大小,在載入核心之前,執行命令uppermem。更多內容參考14.3.45節【uppermem】,48頁。

4.2.3. DOS/Windows

GRUB不能直接啟動DOS或Windows,因此你必須鏈式載入它們(參考4.1.2節【鏈式載入】,7頁)。不過,它們的啟動載入器有某些關鍵性的缺陷,因此僅鏈式載入它們可能不能工作。為了對付這個問題,GRUB為你提供了兩個協助函式。

如果你已經在第一個硬碟以外安裝了DOS(或Windows),你必須使用硬碟交換技術,因為OS只能從第一個硬啟動。GRUB所使用的變通方案是命令drivemap(參考14.3.12節【drivemap】,39頁),象這樣:

drivemap -s (hd0) (hd1)

這在你的第一個及第二個硬碟間執行一個虛擬交換。

注意:僅當DOS(或Windows)使用BIOS來訪問交換硬碟時,這才起作用。如果OS為硬碟使用一個特殊的驅動器,這可能不能工作。

如果你在硬碟上安裝了多個DOS或Windows,會引起另一個問題,因為如果有多個用於DOS/Windows的主分割槽,會引起混淆。毫無疑問你應該避免這樣做,不過如果你想這樣做,有一個解決方案。使用分割槽隱藏/解隱藏技術。

如果GRUB隱藏了一個DOS(或Windows)分割槽(參考14.3.32節【parttool】,43頁),DOS(或Windows)將忽略這個分割槽。如果GRUB解隱藏一個DOS(或Windows)分割槽,DOS(或Windows)將檢測到這個分割槽。這樣,如果你已經在第一個硬碟的第一、第二分割槽上安裝了DOS(或Windows),並且希望從第一個分割槽上啟動,像下面那樣做:

parttool (hd0,1) hidden-

parttool (hd0,2) hidden+

set root=(hd0,1)

chainloader +1

parttool ${root} boot+

boot