Grub4Dos

一、免費下載:

二、教學:

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

四、Other Resources(其他資源):

五、簡介:

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系統。

六、特色:

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。

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。

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

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

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

光碟機支援:該功能使得用戶可以再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:\some\where\grub.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 (紫色)

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


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 

圖片必須是640x480,14色的XPM格式,可以用gzip來進行壓縮。

使用了該命令後,GRUB啟動時將進入圖形模式。這時,color命令指定的文本顏色將會無效。圖形模式下顏色的設置應該使用foreground命令:

foreground ffff00 

以上命令設置字體的顏色。顏色用RGB值來表示,ffff00是黃色。 如果沒有使用foreground命令,缺省的文本顏色是白色。

常用顏色的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來壓縮。

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

九、預設開機選項:

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下也可以訪問虛擬磁片。

『備註』:

  • 虛擬光碟尚未建置。
  • 在直接映射法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啟動

初始化ATAPI CDROM
cdrom --init 
使ATATPI CDROM立即生效啟用,執行這個指令後,就可以用(cd0), (cd1) 等代號來存取CDROM
map --hook 
從第一顆光碟啟動
chainloader (cd0) 
boot

2.停用CDROM

移除(cd0), (cd1)等設備代號映射 device mapping消除map --hook效果

map --unhook 

停止光碟機

cdrom --stop 

『備註』:

  • 如果你由光碟啟動GRUB for DOS,GRUB中支援的光碟機設備代號是(cd),它代表用可啟動光碟啟動GRUB時,用於啟動的光碟機設備。該開機光碟機雖然可直接使用,但假如你想從其他光碟機存取檔案,你還是需要使用cdrom --init、map --hook指令進行初始化。
  • 在初始化光碟機後,可以用blocklist的方式來訪問其內容:

    cat --hex (cd0)16+2 光碟機中使用的磁區大小是2048。

另外,iso9660檔系統驅動程式支援Rock-Ridge擴展,但不支援Joliet擴展,在讀取Joliet擴展的光碟是可能會出現問題。

  • 用以下的命令可以指定搜索的埠:

    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。

轉自:http://3cup.blogspot.tw/2007/11/grub-for-dos-043.html

results matching ""

    No results matching ""