閒聊

GRUB FOR DOS 0.4.3中文手冊

來源

GRUB for DOS 0.4.3

一、免費下載:

http://grub4dos.sourceforge.net/

http://grub4dos.freespaces.com/

http://download.gna.org/grub4dos/

http://sarovar.org/projects/grub4dos/

http://grub4dos.jot.com/

二、教學:

http://grub4dos.sourceforge.net/wiki/index.php/Grub4dos_tutorial

http://grub4dos.sourceforge.net/wiki/

三、其他連結(含論壇):

http://sarovar.org/projects/grub4dos

http://freshmeat.net/projects/grub4dos/

http://marc.herbert.free.fr/linux/win2linstall.html

http://www.cn-dos.net/forum/forumdisplay.php?fid=11(United DOS Forum ,DOS聯盟論壇啟動盤室)

http://www.znpc.net/bbs/forumdisplay.php?fid=4(SYSOFT時空論壇,中文)

四、Other Resources(其他資源):
Ralf Brown’s Interrupt List: It’s cool.

http://www.ctyme.com/rbrown.htm

A Disk Editor View of the NTFS Boot Sector and 「Bootstrap Code” http://www.therdcom.com/asm/mbr/NTFSbrHexEd.htm
The Second Extended File System(Internal Layout)

http://www.nongnu.org/ext2-doc/ext2.html

OSD: PC bootstrap

http://my.execpc.com/CE/AC/geezer/osd/boot/

eXtended Memory Specification:

http://freedos.sourceforge.net/freedos/news/press/1991-xms30.html

High-res high-speed VESA tutorial

http://www.monstersoft.com/tutorial1/

BIOS Data Area

http://www.bioscentral.com/misc/bda.htm

Hardware and Software Documentation

http://www.o3one.org/hwdocs.html

五、簡介:
GRUB for DOS(一般簡寫為GRUB4DOS)是GNU GRUB的DOS編譯版本(準確的說,GRUB4DOS是一個基於GNU GRUB Legacy的二次開發版本),它可以運行於真實模式的DOS環境下,而且它還具有很多新功能,例如:它可以通過Windows(NT)的boot.ini((使用grldr檔)、Linux的kexec(使用grub.exe檔)、lilo來啟動。另外,相對於GNU GRUB來說,它的虛擬磁碟功能是另一個重大改進,通過BIOS使用這個內建功能,可以從軟碟或者硬碟映射檔中啟動傳統的DOS/Windows9x系統。

六、特色:
1.GNU GRUB主要是突破boot loader原先512 bytes限制,利用3 stages方法擴大成多重開機及彈性開機,把GRUB安裝到硬碟MBR的傳統方法是:先運行root (xxx,x),然後setup (xxx)——前面一句是指定一個分區partition,該分區須存放有/boot/stage1和/boot/stage2文件,後面的setup (xxx) 是將引導代碼寫入指定磁片的MBR。這樣安裝的GRUB,其MBR引導代碼被設置為從固定的分區載入stage2,一旦該分區出了問題,系統便無法引導;如果我們想刪除該分區,或格式化分區,或者做一些會引起該分區序號改變的操作,就需要預先重新安裝一次grub,重新指定存放stage檔的分區,否則也會引導失敗。這一點上grub顯得不夠靈活。

而GRUB4DOS採取了新的策略:其MBR引導代碼並非固定地指向某個分區,而是搜索所有分區的 root 目錄,查找並載入grldr,只要某分區上存有一份grldr,就能啟動。而且安裝時可以將原微軟的MBR備份,啟動時如果找不到grldr,便自動載入備份的MBR。顯然這種方式更加靈活、穩健,所以GRUB4DOS雖然保留了GNU GRUB的全部命令和功能,包括setup命令,但不推薦使用傳統的安裝方式。而且它的引導代碼雖然可以搜索硬碟,但識別檔系統的能力有限,目前僅限於FAT12/FAT16/FAT32/NTFS/EXT2/EXT3這幾種,所以可能需要專門設一個分區來存放grldr。

2.GNU GRUB主要是為啟動Linux系統設計,但同時可借用Windows的boot manager來啟動Windows系統。而GRUB for DOS則兩邊都可以。一種使用grub.exe檔,可以從Linux或DOS文字介面執行,另一種使用grldr檔,可以從MBR/partition boot sector或Windows NT/2000/XP/2003/Vista boot manager進行啟動,也可以當作bootable CDROM的eltorito boot file。

3.GRUB for DOS改良加強GNU GRUB的MAP指令,可以透過image files用來創造虛擬硬碟或軟碟,甚至DOS開啟後,這些虛擬設備仍可存取。

4.圖片背景支援:相信大多數用戶都樂於使用圖片背景來代替單調的黑白畫面。雖然僅能支持 640×480@14位色,但也總比兩色好得多。

5.簡體中文支援:GRUB4DOS中同時發佈有支持簡體中文的grldr和grub.exe,大大方便了中文用戶。

6.光碟機支援:該功能使得用戶可以再GRUB環境下訪問光碟機,並可由光碟機啟動,很實用。

七、安裝方式:

1.Install to MBR

把GRUB4DOS啟動代碼安裝到MBR後,開機後便能直接進入GRUB4DOS。

以下使用bootlace.com(可以運行於DOS/Linux、Windows 95/98/Me、虛擬硬碟)
(1)MBR of first hard drive under DOS, Windows 95/98/Me
bootlace 0x80
(2)MBR of IDE channel 0, primary drive under Linux
bootlace /dev/hda
(3)MBR of hard drive image file aa.dsk
bootlace aa.dsk

以下使用 grubinst.exe(可以運行於FreeBSD/Linux、Windows NT/2000/XP/2003/Vista、虛擬硬碟)
(4)MBR of first hard drive under Windows NT family OSs(Windows NT/2000/XP/2003/Vista)
grubinst (hd0)
(5)MBR of IDE channel 0, primary drive under Linux/FreeBSD
grubinst 「(hd0)”
或是用Device Name如下:
grubinst /dev/hda (Linux)
grubinst /dev/ad0 (FreeBSD)
(6)MBR of hard drive image file aa.dsk
grubinst aa.dsk
注意:grubinst有圖形介面grubinst_gui,利用它可以更簡單地把啟動代碼安裝到MBR/啟動磁區裡。

安裝啟動代碼到MBR後,還需要把grldr和menu.lst拷貝到硬碟上任意一個FAT16/FAT32/NTFS/EXT2分區的根目錄裡。
———————————
本方案的優點:
•不依賴於作業系統
•能夠自動搜索硬碟上各個分區的grldr檔
———————————–

2.Install to partition boot sector

GRUB4DOS的啟動代碼也可以安裝到某一FAT16/FAT32/NTFS/EXT2分區的啟動磁區中。當從該分區啟動時,會引導GRUB4DOS。

(1)first primary partition of the first hard drive
grubinst (hd0,0)
or
grubinst –install-partition=0 (hd0)
or
grubinst -p=0 (hd0)
(2)first primary partition of the hard drive image file aa.dsk
grubinst –install-partition=0 aa.dsk
or
grubinst -p=0 aa.dsk

安裝啟動代碼到啟動磁區後,還需要把grldr和menu.lst拷貝到該分區的根目錄裡。

本方案的優點:
•不依賴於作業系統
•不需要修改MBR,因而可以使GRUB4DOS和其他的啟動管理器共存

—————————————————————————————–
下面的這些啟動方式都不會改變硬碟的主引導記錄(MBR)或者分區的引導磁區。

3.Starting from DOS

(1)在DOS/Windows9x的CONFIG.SYS中使用下列方式:

install=c:somewheregrub.exe –config-file=FILE

(2)在DOS命令行中直接執行GRUB.EXE。

grub.exe –config-file=FILE

如果沒有使用–config-file選項,缺省的功能表檔是 (hd0,0)/menu.lst。
FILE可以功能表檔的名字,也可以是功能表的內容。例如:

grub.exe –config-file=”root (hd0,0);chainloader +1〞

在DOS下啟動GRUB4DOS後,可以用quit命令返回到DOS中。

4.Booting via the Windows NT/2000/XP/2003 boot manager

在Windows NT系列作業系統(NT/2000/XP/2003)的c:boot.ini(此為隱藏檔)最後面增加下面一項:

c:grldr=”Start GRUB4DOS”

如果boot.ini中的timeout值為零,把它設置為大於0的數位,例如timeout=30,然後將boot.ini存檔。把grldr和menu.lst拷貝到C:。
下一次啟動Windows時,你會發現啟動畫面中多了Start GRUB4DOS這一選項,使用它便可啟動GRUB4DOS。
注意:boot.ini檔一般是隱藏的,你需要在資料夾選項中設置顯示所有檔,或者在cmd中使用以下命令來去掉boot.ini的隱藏屬性:

attrib -s -r -h c:boot.ini

5.Booting via the Windows Vista boot manager

首先,把grldr.mbr拷貝到C:下,然後在cmd中使用如下面四個指令:

bcdedit /create /d 「GRUB4DOS” /application bootsector
bcdedit /set {id} device boot
bcdedit /set {id} path grldr.mbr
bcdedit /displayorder {id} /addlast

其中第二、三、以及四個指令不是真的要輸入 {id},在第一個指令輸入之後,電腦會輸出一個類似 {xxxx-xxxx-xxxx-xxxx} 的 ID,請你把這個 {xxxx-xxxx-xxxx-xxxx} 帶入第二、三、以及四個指令內。

然後把grldr和menu.lst拷貝到任意一個FAT16/FAT32/NTFS/EXT2分區的根目錄。
該方案也可應用於Windows NT/2000/XP/2003,但這些系統中修改啟動功能表不是使用bcdedit,而是通過在boot.ini的最後加上這樣的一行:

c:grldr.mbr=”Start GRUB4DOS”

下一次啟動Windows時,你會發現啟動畫面中多了Start GRUB4DOS這一選項,使用它便可啟動GRUB4DOS。
該方案的優點:
—————————————
•不需要修改MBR和啟動磁區
•能夠自動搜索硬碟上各個分區的grldr檔
—————————————

6.Starting from Linux

首先使用kexec patch指令更新你的Linux kernel。
其次鍵入下列指令:

kexec -l grub.exe
kexec -e

7.Loading GRUB for DOS using other boot loader

在下列boot loader中,grub.exe可以當作linux kernel使用。
(1)syslinux
可以在syslinux.cfg中寫入下列段落:
label GRUB4DOS
KERNEL grub.exe
(2)Grub或是另一個GRUB for DOS
可以在menu.lst中寫入下列段落:
title Load GRUB4DOS
kernel /grub.exe(或是kernel (DEVICE)/PATH/grub.exe,例如:kernel (hd0,4)/boot/grub/grub.exe)

八、Windows開機選項(menu.lst)寫法:
在GRUB for DOS的menu.lst中,一般寫法
1.DOS, Windows 95/98/Me: (MSDOS 7+)
title DOS, Windows 95/98/Me
root (hd0,0)
chainloader (hd0,0)/io.sys

2.Windows NT/2000/XP/2003:
title Windows NT/2000/XP/2003
root (hd0,0)
chainloader (hd0,0)/ntldr

3.Windows Vista:
title Windows Vista bootmgr
root (hd0,0)
chainloader (hd0,0)/bootmgr

4.啟動Windows NT的恢復控制臺的CMLDR:
title CMLDR of Windows NT/2K/XP
root (DEVICE)
chainloader (DEVICE)/cmldr

(一)配置檔menu.lst的基本結構

GRUB4DOS的配置檔和GRUB一樣,都是menu.lst。以下是一個例子:

default 0

title Boot First Partition
root (hd0,0)
chainloader +1

title Boot Second Partition
root (hd0,1)
chainloader +1

菜單項是由title來指定,該例子中有兩個title,就是說GRUB4DOS器啟動時會顯示兩個功能表項,功能表的標題是title的參數,也就是 Boot First Partition 和 Boot Second Partition。在第一個title前的命令是全局命令,它們在顯示功能表之前執行。
menu.lst一般放在和啟動檔GRLDR同樣的目錄裡。
以下是該配置檔在啟動時的畫面:
BootScreen1.jpg
高亮的功能表項是當前選擇的功能表,用上下方向鍵可以在不同功能表中切換。如果按下回車鍵,便會以當前功能表中的命令來啟動系統。
在功能表介面按下c鍵,會進入命令行介面:
BootScreen2.jpg
在命令行介面下,你可以手動輸入各個命令。在命令行介面下,按鍵便可以回到功能表介面。

(二)基本命令

以下是一些最為常用的命令

1.help
用來顯示其他命令的用法,例子:
help root

2.default
指定缺省的菜單項,由0開始算起,例子: default 0 該命令必須在第一個title之前指定

3.timeout
缺省的等待時間,如果在指定的時間(以秒為單位)不按任何鍵,則會啟動缺省的功能表項,例子: timeout 10 該命令必須在第一個title之前指定

4.root
用來指定根設備,例子: root (hd0,0)

5.rootnoverify
該命令也可以用來指定根設備。root在設置根設備前,先測試一下該分區的檔系統是否可以識別,而rootnoverify則省略這一測試。 rootnoverify (hd0,0)

6.chainloader
把啟動磁區的內容裝入記憶體,參數+1指的是把分區的第一個磁區,例子: chainloader +1

7.boot
啟動作業系統。在使用該命令前,必須用kernel或者chainloader把系統內核或者啟動磁區/啟動檔裝入記憶體。例子: boot
在配置檔中不需要使用這個命令。這是因為GRUB在執行了功能表項的所有命令後,會自動加上boot。該命令一般在命令行介面裡使用。

(三)設備名字

在GRUB中,硬碟設備用以下的方法來命名:
(hdm)
m是硬碟的序號。序號0相對於BIOS的第一隻硬碟。
硬碟上的分區用以下的方法來命名:
(hdm,n)
n是硬碟m裡分區的序號。主分區最多有4個,其序號為0-3,擴展分區的序號從4開始。例子:
硬碟0上的第一個主分區: (hd0,0)
硬碟1上的第一個擴展分區: (hd1,4)
設備也可以用相應的BIOS設備號來表示。例如,第一隻硬碟設備的設備號是0x80,因此,以下的表示是等價的: (hd0,0), (0x80,0), (128,0)。
另外,對於一些檔系統來說,例如FreeBSD中使用的ffs,或者是Solaris中使用的ufs,在分區中還繼續劃分為子分區。子分區的表示是在分區表示的基礎上加上從a開始計算的子分區序號。例如:
硬碟0上的第一個主分區裡的第一個子分區: (hd0,0,a)
軟碟設備用以下的方法來命名:
(fdm)
m是軟碟的序號。序號0相對於BIOS的第一隻軟碟。
軟碟設備後面同樣可以加上分區或者子分區的序號。
GRUB還有其他一些設備,比如說(cd)是光碟設備,(nd)是網路設備,等等。不過它們在特定的情形下才可以使用。

(四)檔案名字

GRUB的檔案名字是在設備名字的基礎上加上檔的路徑,例子:硬碟0上第一個主分區根目錄裡的aa.img文件: (hd0,0)/aa.img
軟碟0上boot目錄裡的aa.img文件: (fd0)/boot/aa.img
注意:目錄的分隔符號是 / ,而不是Windows/DOS下常用的 。
另外,你還可以用磁區的位移和數量來指定資料,比如:
(hd0,0)0+100,200+1,300+300
表示硬碟0上第一個主分區裡,從磁區0起的100個磁區,然後是從磁區200起的1個磁區,最後是從磁區300起的300個磁區。當位移為零時,可以省略不寫,因此,
(hd0,0)+1
表示的是硬碟0上第一個主分區裡從磁區0起的1個磁區,也就是分區的第一個磁區。
GRUB中紀錄了一個根設備,它由root命令來指定,例如:
root (hd0,0)
根設備上的檔可以省略設備名,例如,使用了以上的root命令後,檔案名 +1 就等同於 (hd0,0)+1。
注意:在GRUB4DOS的擴展中,map命令中使用的檔案名的意義和以上所說的有所不同。在map命令裡,(hd0,0)+1表示的不是硬碟0上第一個主分區的第一個磁區,而是整個分區。

(五)啟動作業系統

1.啟動一般系統

一般來說,作業系統會在其所在分區的第一個磁區裡放入啟動代碼。因此,用以下的一組命令一般可以啟動硬碟0第一主分區上的作業系統:
rootnoverify (hd0,0)
chainloader +1
boot
對於不同的分區,只要修改設備名(hd0,0)就可以了。
注意:大部分的作業系統需要在第一隻硬碟的主分區裡才能正常啟動。
注意:當把該組命令作為menu.lst裡某一功能表項的內容時,最後的命令boot可以省略。
注意:該方法是通用的,它可以用來啟動以下提到的系統,只要分區的第一個磁區中存在啟動代碼。

2.啟動DOS/Windows 95/98/Me

在GRUB4DOS中,chainloader命令可以裝載DOS/Windows 95/98/Me中的io.sys。因此,可以使用類似於以下的一組命令來啟動這些系統:
rootnoverify (hd0,0)
chainloader (hd0,0)/io.sys
boot

3.啟動Windows NT/2000/XP/2003/Vista

在GRUB4DOS中,chainloader命令也可以裝載Windows NT/2000/XP/2003中的ntldr和Windows Vista中的bootmanager。因此,可以使用類似於以下的一組命令來啟動這些系統:

啟動Windows NT/2000/XP/2003:
rootnoverify (hd0,0)
chainloader (hd0,0)/ntldr
boot

啟動Windows Vista:
rootnoverify (hd0,0)
chainloader (hd0,0)/bootmanager
boot

4.啟動Linux

可以用kernel指令裝載Linux內核:

rootnoverify (hd0,0)
kernel (hd0,0)/vmlinuz
boot

在內核(hd0,0)/vmlinuz後可以加上啟動的參數。
當啟動Linux內核時,可以使initrd指令來裝載初始的內存檔。
rootnoverify (hd0,0)
kernel (hd0,0)/vmlinuz
initrd (hd0,0)/initrd
boot
注意:chainloader用於裝載啟動磁區和特定的啟動檔如io.sys和ntldr,而kernel用於裝載Linux內核和符合其標準的啟動檔。在一組啟動命令中,兩者不能同時使用。

(六)修改介面的顏色

GRUB介面的顏色可以用color指令來指定。color中指定了兩組顏色,第一組是正常文本的顏色,第二組是加亮文本(當前選擇的功能表項)的顏色。對應於每組顏色,又需要指定兩種顏色。第一種是前景的顏色,第二種是背景的顏色。因此,在color總共需要指定四種顏色,分別是,正常文本前景,正常文本背景,加亮文本前景和加亮文本背景。
顏色代碼:
black (黑色) red (紅色) green (綠色) brown (棕色) blue (藍色) magenta (紫色) cyan (青色) light-gray (灰色)
———————————————-
dark-gray (暗灰) light-red (亮紅) light-green (亮綠) yellow (黃色) light-blue (亮藍) light-magenta (亮紫) light-cyan (亮青) white (白色)
前景色可以使用全部16種顏色,而背景色只能使用前面8種顏色。
例子:
color cyan/blue white/magenta
正常文本前景: cyan (青色) 正常文本背景: blue (藍色) 加亮文本前景: white (白色) 加亮文本背景: magenta (紫色)
以上例子的顏色在運行時的畫面:
BootScreen3.jpg

你也可以在顏色矩陣中直觀看到各前景/背景顏色搭配的效果。

black/black black/red black/green black/brown black/blue black/magenta black/cyan black/light-gray
red/black red/red red/green red/brown red/blue red/magenta red/cyan red/light-gray
green/black green/red green/green green/brown green/blue green/magenta green/cyan green/light-gray
brown/black brown/red brown/green brown/brown brown/blue brown/magenta brown/cyan brown/light-gray
blue/black blue/red blue/green blue/brown blue/blue blue/magenta blue/cyan blue/light-gray
magenta/black magenta/red magenta/green magenta/brown magenta/blue magenta/magenta magenta/cyan magenta/light-gray
cyan/black cyan/red cyan/green cyan/brown cyan/blue cyan/magenta cyan/cyan cyan/light-gray
light-gray/black light-gray/red light-gray/green light-gray/brown light-gray/blue light-gray/magenta light-gray/cyan light-gray/light-gray
dark-gray/black dark-gray/red dark-gray/green dark-gray/brown dark-gray/blue dark-gray/magenta dark-gray/cyan dark-gray/light-gray
light-red/black light-red/red light-red/green light-red/brown light-red/blue light-red/magenta light-red/cyan light-red/light-gray
black/light-green light-green/red light-green/green light-green/brown light-green/blue light-green/magenta light-green/cyan light-green/light-gray
yellow/black yellow/red yellow/green yellow/brown yellow/blue yellow/magenta yellow/cyan yellow/light-gray
light-blue/black light-blue/red light-blue/green light-blue/brown light-blue/blue light-blue/magenta light-blue/cyan light-blue/light-gray
light-magenta/black light-magenta/red light-magenta/green light-magenta/brown light-magenta/blue light-magenta/magenta light-magenta/cyan light-magenta/light-gray
light-cyan/black light-cyan/red light-cyan/green light-cyan/brown light-cyan/blue light-cyan/magenta light-cyan/cyan light-cyan/light-gray
white/black white/red white/green white/brown white/blue white/magenta white/cyan white/light-gray
color命令一般是作為全局命令,在第一個title前使用。

(七)使用背景圖片
可以用splashimage命令來載入背景圖片:

spashimage (hd0,0)/spash.gz

圖片必須是640×480,14色的XPM格式,可以用gzip來進行壓縮。
使用了該命令後,GRUB啟動時將進入圖形模式。這時,color命令指定的文本顏色將會無效。圖形模式下顏色的設置應該使用foreground命令:

foreground ffff00

以上命令設置字體的顏色。顏色用RGB值來表示,ffff00是黃色。
如果沒有使用foreground命令,缺省的文本顏色是白色。
以上兩個命令在啟動時的效果:
BootScreen4.jpg
該例子中使用的背景圖片可以在這裡下載。
常用顏色的RGB值對應表:

000000 c0c0c0 800000 ff0000
000080 0000ff 800080 ff00ff
008000 00ff00 808000 ffff00
008080 00ffff 808080 ffffff
splashimage和foreground命令一般在第一個title前使用。

(八)使用中文介面
首先,你必須使用支持中文的版本。並且,要正常顯示中文的功能表,你需要使用fontfile命令來裝載中文字體:

fontfile (hd0,0)/fonts.gz

fonts.gz是字體檔,並且使用了gzip來壓縮。例子中使用的fonts.gz可以在這裡 下載。
fontfile命令可以和splashimage,foreground一起使用。例如:

splashimage (hd0,0)/splash.gz
foreground ffff00
fontfile (hd0,0)/fonts.gz

title 啟動第一個分區
root (hd0,0)
chainloader +1
title 啟動第二個分區
root (hd0,1)
chainloader +1
該功能表的顯示的效果為:
BootScreen5.jpg

九、預設開機選項:
=============================================
find and load NTLDR of Windows NT/2K/XP
find and load CMLDR of Windows NT/2K/XP
find and load IO.SYS of Windows 9x/Me
find and boot Mandriva with menu.lst already installed
find and boot Linux with menu.lst already installed
commandline
floppy (fd0)
back to dos
reboot
halt
==============================================

對應的menu.lst文件(註:取自grub4dos 0.4.3下載包):

# This is a sample menu.lst file. You should make some changes to it.
# The old install method of booting via the stage-files has been removed.
# Please install GRLDR boot strap code to MBR with the bootlace.com
# utility under DOS/Win9x or Linux.

color black/cyan yellow/cyan
timeout 30
default /default

title find and load NTLDR of Windows NT/2K/XP
fallback 1
find –set-root /ntldr
chainloader /ntldr
savedefault –wait=2

title find and load CMLDR of Windows NT/2K/XP
fallback 2
find –set-root /cmldr
chainloader /cmldr
savedefault –wait=2

title find and load IO.SYS of Windows 9x/Me
fallback 3
find –set-root /io.sys
chainloader /io.sys
savedefault –wait=2

title find and boot Mandriva with menu.lst already installed
fallback 4
find –set-root /etc/mandriva-release
savedefault –wait=2
configfile /boot/grub/menu.lst

title find and boot Linux with menu.lst already installed
fallback 5
find –set-root /sbin/init
savedefault –wait=2
configfile /boot/grub/menu.lst

title commandline
savedefault –wait=2
commandline

title floppy (fd0)
chainloader (fd0)+1
rootnoverify (fd0)
savedefault –wait=2

title back to dos
savedefault –wait=2
quit

title reboot
savedefault –wait=2
reboot

title halt
savedefault –wait=2
halt

title memdrive duplicated from floppy image file (hd0,0)/sbm.bin
map –mem (hd0,0)/sbm.bin (fd0)
map –hook
chainloader (fd0)+1
rootnoverify (fd0)
savedefault –wait=2

title memdrive based on win98 partition (hd0,6)
map –mem (hd0,6)+1 (hd0)
# map –mem (hd0,0)/win98.gz (hd0)
map –hook
chainloader (hd0)+1
rootnoverify (hd0)
savedefault –wait=2

十、虛擬硬碟

map命令在GRUB Legacy中是用作磁碟交換。
比如說,你有兩隻硬碟,但兩隻硬碟上均有可啟動的系統。在第一隻硬碟上啟動時,不需要特殊的處理,直接用chainloader裝載啟動磁區就可以了。不過,如果要從第二隻硬碟上啟動,那麼單單用chainloader是不夠的,這是因為很多作業系統都預設從第一隻硬碟上裝載啟動所需的檔,如果檔不在其上,系統便不能順利地讀取,從而導致啟動失敗。
一個原始的解決方法是在BIOS中修改啟動順序,把需要啟動的硬碟放到最前面。那麼,重啟電腦後該硬碟便會成為第一隻硬碟,從而可以正常啟動。
GRUB中的map命令便是為瞭解決這個問題而設計的,它可以在運行時交換磁片,而無需修改BIOS。例如:

title Boot First Partition on Second Disk
map (hd0) (hd1)
map (hd1) (hd0)
chainloader (hd1,0)+1
boot

在該例子中,使用了map命令實現了(hd0)和(hd1)的交換。要注意的是,交換是在命令boot後才生效的。因此在chainloader命令中,讀取的仍然是第二隻硬碟。

1.直接映射法Direct mapping(建立虛擬磁碟)

在GRUB4DOS中,大大地擴展了map命令的用法。利用該命令可以建立虛擬磁片,例子:
把(hd0,0)根目錄下的aa.dsk檔映射為第二隻硬碟,並且使用原來硬碟上的系統啟動:

title Create Virtual Disk
map (hd0,0)/aa.dsk (hd1)
root (hd0,0)
chainloader +1
boot

把(hd0,0)根目錄下的aa.dsk檔映射為第一隻硬碟,原來的第一隻映射為第二隻硬碟,並且從aa.dsk裡虛擬出來的磁片中啟動:

title Boot From Virtual Disk
map (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map –hook
root (hd0,0)
chainloader +1
boot

在上面提到,map命令的映射不是馬上起作用的。但是,要從虛擬磁片中啟動,就必須從中讀取資料,因此需要使映射提前起效。在以上的例子中,map –hook的作用便是使前面map命令指定的映射立刻生效。

把(hd0,0)根目錄下的aa.img檔映射為第一隻虛擬軟碟,並從中啟動:

title Boot From Virtual Floppy
map (hd0,0)/aa.img (fd0)
map –hook
root (fd0)
chainloader +1
boot

使用這種方式進行映射後,虛擬磁片的內容和影像檔的內容是同步的,也就是說,如果你修改了虛擬磁片的內容,影像檔也同樣被更新。如果你重啟了機器,該修改的效果仍然存在。
在使用這種方式進行映射時,影像檔在磁片上的存放必須是連續的。
GRUB4DOS中建立的虛擬磁片,包括以下所說的間接映射法(採用記憶體檔),都是通過截取INT 13來實現的。因此在啟動了作業系統後,如果該系統是通過INT 13來訪問磁片的,例如各類的DOS,那麼在進入系統後仍然可以訪問虛擬碟。如果系統是採用其他方式來訪問磁片,例如Linux,各類Unix和Windows NT系列的作業系統,那麼在進入系統後便不能訪問虛擬碟。Windows 9X系列的作業系統比較特殊,它通常是使用保護模式的驅動來訪問磁片,但當它找不到合適的驅動時,會依舊使用INT 13來訪問磁片,因此,在Windows 9X下也可以訪問虛擬磁片。

『備註』:
A.虛擬光碟尚未建置。
B.在直接映射法direct mapping中映像檔image file必須是連續的。

2.間接映射法Indirect mapping(建立虛擬記憶體磁碟)

用map也可以建立虛擬記憶體磁碟,其用法和類似直接映射法direct mapping, 你只需要在map建立虛擬碟的命令中加上–mem參數就行了。例如:

把(hd0,0)根目錄下的aa.dsk檔映射為第一隻硬碟,原來的第一隻映射為第二隻硬碟,並且從aa.dsk裡虛擬出來的磁片中啟動:

title Boot From Virtual Disk
map –mem (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map –hook
root (hd0,0)
chainloader +1
boot

把(hd0,0)根目錄下的aa.img檔映射為第一隻虛擬軟碟,並從中啟動:

title Boot From Virtual Floppy
map –mem (hd0,0)/aa.img (fd0)
map –hook
root (fd0)
chainloader +1
boot

在間接映射法indirect mapping, 映像檔image file的內容是裝載到記憶體後才進行映射,因此映像檔image file不必是連續的,但是你必須有足夠的記憶體memory來存放映像檔image file和啟動系統。
而且,虛擬磁碟和映像檔是分離的,對虛擬磁碟所作的修改不會被更新到映像檔中。

3.Auto MBR creation(自動產生MBR)
影像檔有兩種類型。一種是檔案系統影像,它裡面只包含某一個檔案系統的資料。另一種是磁片影像,它裡面包含了類似於物理硬碟的結構,也就是,影像以MBR開始,然後才是檔案系統的資料。對於虛擬記憶體硬碟,其結構是類似於真實硬碟的,因此在使用map命令進行映射時,應該使用磁片影像。
因此在創造虛擬硬碟時, 需要一個由MBR(包含了類似於物理硬碟的結構)及partition data(檔案系統的資料)組成的映像檔image file來組合成一個實際的硬碟. 如果映像檔image file只包括partition data時, 即需加入MBR以產生完整的硬碟映像檔. GRUB for DOS在mapping硬碟映像檔時, 會測試MBR是否存在, 如不存在,則他會自動使用partition data創造MBR.例如:

title Boot from hard disk image
map –mem (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map –hook
chainloader (hd0,0)+1
rootnoverify (hd0,0)

aa.dsk可以是硬碟映像檔disk image或分區映像檔partition image,後者GRUB for DOS會自己產生MBR.

自動生成MBR還有一個應用,就是直接從硬碟上的裝載分區,從而生成虛擬磁片。例如:
title Load Partition From Disk
map –mem (hd0,0)+1 (hd0)
map (hd0) (hd1)
map –hook
root (hd0,0)
chainloader +1
boot
該功能表的功能是把硬碟上第一個分區的內容裝載到記憶體,並且自動在其前面加上MBR而生成虛擬磁片。然後,把該虛擬磁片映射為第一隻硬碟,原來的硬碟映射為第二隻硬碟。最後,從虛擬磁片中啟動。
在使用該功能表啟動後,系統分區的內容和好像和原來一樣,但這時實際是使用在記憶體裡的虛擬磁片。對分區的修改在重啟機器後便會消失。
該功能表是把整個分區的內容裝載到記憶體,要確定記憶體足夠大,否則命令不會成功。
在map命令中,(hd0,0)+1是指整個(hd0,0)分區,而不是(hd0,0)的第一個磁區。這種表示只是在map命令中適用,在其他的地方,(hd0,0)+1 還是原來的意義。

4.memdisk

syslinux的外部工具memdisk,利用它也可以生成虛擬記憶體磁碟(間接映射法indirect mapping)。這可以由下列兩個範例來比較:

title Boot from virtual disk using internal map command
map –mem (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map –hook
root (hd0,0)
chainloader +1
boot

title Boot from virtual disk using external memdisk
kernel (hd0,0)/memdisk
initrd (hd0,0)/aa.dsk
boot

該命令把aa.dsk裝入記憶體生成虛擬記憶體盤,該虛擬碟作為第一隻硬碟,原來硬碟的序號向後移動。最後,從虛擬碟中啟動。這一系列的操作都是在memdisk內完成的,GRUB的任務只是把aa.dsk裝入記憶體,然後把裝載的位址傳遞給memdisk。

如果只有一隻硬碟,那麼以上的操作可以用以下的命令完成:

title Create virtual disk using map
map –mem (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map –hook
root (hd0,0)
chainloader +1
boot

map和memdisk的區別:
•map是GRUB4DOS內置的功能,而memdisk是一個外部的程式
•map可以直接映射磁片上的檔,而memdisk必須要把檔裝載到記憶體裡。
•map可以把影像檔映射為第二隻硬碟,而而memdisk只能映射為第一隻硬碟。
•map有自動生成MBR的功能,而memdisk沒有。因此memdisk只能使用磁片影像,不能使用檔系統影像。

memdisk功能不支援直接映射法direct mapping或auto MBR creation.

5.虛擬設備(md)

在GRUB4DOS中,你可以用設備(md)來訪問整個記憶體,就和用(nd)訪問網路設備,用(cd)來訪問光碟類似。
GRUB4DOS也擴展了cat命令,它可以用–hex來以十六進位輸出,也可以用–locate=STRING來在檔中搜索字串。
例子:
cat –hex (hd0)+1 以十六進位形式顯示第一隻硬碟的MBR。
cat –hex (hd0,0)+1 以十六進位形式顯示第一隻硬碟第一個分區的啟動磁區
cat –hex (md)+2 以十六進位形式顯示記憶體開始1K的內容,這裡其實是中斷向量表。
cat –hex (md)0x800+1 以十六進位形式顯示記憶體從0x800 * 512 = 1M 開始512位元組的內容,也就是從擴展記憶體開始的512位元組。

6.虛擬設備(rd)

用虛擬設備(md)可以訪問從位址0開始的實體記憶體,而使用(rd)則可以訪問從某一位址開始的記憶體。
map –rd-base=ADDR 用來設置(rd)記憶體設備的開始位址(以位元組為單位)。
map –rd-size=SIZE 用來設置(rd)記憶體設備的長度(以位元組為單位)。
當把grub.exe作為linux內核啟動時,可以用指定初始盤。進入grub後,(rd)設備的開始位址和長度自動設置為初始盤的位址和長度。因此,可以在grub中用(rd)設備來訪問初始盤。
map –ram-drive=RD
用來設定訪問(rd)記憶體設備的BIOS設備名。缺省值是0x7F,表示(rd)對應的虛擬碟是軟碟設備。如果(rd)對應的虛擬碟是硬碟設備,那麼需要設置RD, 使得 0x80< RD < 0xFF。 7.map的其他參數 •–status 用於顯示當前的磁片映射。 map –status •–floppies=M, –harddrives=N 指定軟碟/硬碟的數目。 map –harddrvies=2 使用該命令後,本地硬碟的數目設為2。 •–memdisk-raw=RAW RAW取值0或1(預設是1)。RAW=0時,使用int15/ah=87h讀擴展記憶體。RAW=1時,使用內部的函數來讀擴展記憶體。 map –memdisk-raw=0 •–safe-mbr-hook=SMH ,–int13-scheme=SCH 這兩個參數是為了在Windows 9X下能正常使用虛擬碟而設的。 SMH取值0或1(預設是1),當你在Windows 9X下使用虛擬碟時出現問題時,可以試試使用以下的命令: map –safe-mbr-hook=0 SCH取值也是0或1(預設是1),當你在Windows 9X下使用虛擬碟時出現問題時,也可以試試使用以下的命令: map –int13-scheme=0 •–read-only 使用了該參數後,當前進行映射的磁片被設為唯讀模式。 map –mem –read-only (hd0,0)/aa.dsk (hd1) •–fake-write 使用了該參數後,當前進行映射的磁片看似可寫,但寫入的內容均被丟棄。 map –mem –fake-write (hd0,0)/aa.dsk (hd1) •–heads=H, –sectors-per-track=S 一般來說,map命令可以正確地計算出影像檔中使用的磁片參數。如果你想手動設置,那麼可以使用這兩個選項。 map –mem –heads=63 –sectors-per-track=255 (hd0,0)/aa.dsk (hd1) 十一、光碟機相關主題 ————————— 範例: title 從第一顆光碟啟動 cdrom –init map –hook chainloader (cd0) boot —————————— 1.使用ATAPI CDROM啟動 cdrom –init 『初始化ATAPI CDROM map –hook 『使ATATPI CDROM立即生效啟用,執行這個指令後,就可以用(cd0), (cd1)等代號來存取CDROM chainloader (cd0) 『從第一顆光碟啟動 boot 2.停用CDROM map –unhook 『移除(cd0), (cd1)等設備代號映射 device mapping消除map –hook效果 cdrom –stop 『停止光碟機 『備註』: A.如果你由光碟啟動GRUB for DOS,GRUB中支援的光碟機設備代號是(cd),它代表用可啟動光碟啟動GRUB時,用於啟動的光碟機設備。該開機光碟機雖然可直接使用,但假如你想從其他光碟機存取檔案,你還是需要使用cdrom –init、map –hook指令進行初始化。 B.在初始化光碟機後,可以用blocklist的方式來訪問其內容: cat –hex (cd0)16+2 光碟機中使用的磁區大小是2048。 另外,iso9660檔系統驅動程式支援Rock-Ridge擴展,但不支援Joliet擴展,在讀取Joliet擴展的光碟是可能會出現問題。 C.用以下的命令可以指定搜索的埠: cdrom –add-io-ports=0x03F601F0 以下是預設的搜索埠:0x03F601F0, 0x03760170, 0x02F600F0, 0x03860180, 0x6F006B00, 0x77007300。 3.製作開機光碟 在GRUB中,可以利用 stage2_eltorito 來製作啟動光碟: mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o grub.iso iso stage2_eltorito和menu.lst應該放在光碟的/boot/grub目錄裡。 在GRUB for DOS可以用grldr製作開機光碟bootable CDROM的ISO檔: (下列二指令任選其一,但grldr和menu.lst要放光碟映像檔根目錄) mkisofs -R -b grldr -no-emul-boot -boot-load-seg 0x1000 -o bootable.iso iso_root mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root 第一種方法告訴 BIOS,希望它能夠裝入整個 GRLDR 檔到記憶體。裝入記憶體後,BIOS 還應該正確設置堆疊,使得不至於把堆疊設置到 GRLDR 的程式體內,造成衝突。一般情況下,BIOS 做到這一點很容易,因為它可以設置堆疊指標為裝入的起始位址。但也不排除存在 BUGGY BIOS 的可能性。 有些 BIOS 不完全符合可啟動的 CDROM 規範,比如 VirtualPC 的就是的。這類 BIOS 只是裝入了一部分 GRLDR 磁區到記憶體,典型的可能只裝入了一個磁區(2048 位元組的大磁區)到記憶體。不過我們的代碼已經替這些 BUGGY BIOS 打了補丁。只要這些 BIOS 能夠設置正確的堆疊,不至於和裝入記憶體中的 GRLDR 磁區資料產生衝突就 OK 了。 也就是說,上述第一種製作光碟的方法,應該沒有多大問題了。這種方法很有可能適應於所有的 BIOS。 第二種方法本身就只要求 BIOS 裝入一個 CDROM 磁區到記憶體(等同於 4 個 512 位元組的小磁區)。這種方法是最保守的,沒有理由會失敗了。微軟的 win2000 啟動光碟就是這麼做的,isolinux 和 stage2_eltorito 也都是這麼做的。如果這種方法失敗了,那麼 win2000,isolinux 和 stage2_eltorito 應該都會失敗的。 對於第二種方法,我們不需要 -boot-info-table 這個參數。但是允許你用這個參數(用了和沒用是一樣的,我們的引導代碼將忽略由這個參數所傳遞的資料結構)。 對於第一種方法也一樣,不需要 -boot-info-table 這個參數,同時也是允許你用這個參數(用了和沒用是一樣的,我們的引導代碼將忽略由這個參數所傳遞的資料結構)。 4.腳本支持 GRUB4DOS中有實現了簡單的腳本支持。目前實現了 && 和 || 兩種操作: command1 && command2 只有當 command1 的返回值是真時,command2 才被執行 command1 || command2 只有當 command1 的返回值是假時,command2 才被執行 目前不支援操作符的嵌入使用。 例子: is64bit && default 0 is64bit || default 1 如果is64bit命令返回值是真,那麼預設的功能表項是0,否則,預設的菜單項是1。

Be the First to comment.

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

(若看不到驗證碼,請重新整理網頁。)