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:\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 (紫色)
以上例子的顏色在運行時的畫面:
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。

[轉]安裝多重作業系統常見問答集

來源

安裝多重作業系統常見問答集

想要幫自己的電腦安裝數個作業系統,上網搜尋相關資料,依照資料一步驟一步驟的操作。雖然成功安裝好了,但要是自己的需求和資料稍有出入,自行修改了部份步驟,卻發現問題多多,心裡總有滿腹疑問,「為什麼不能這樣改?為什麼不能那樣改呢?」,會有這種問題的最根本原因是沒有足夠的概念,無法融會貫通。因此這篇文章的誕生就是為了幫助讀者建立觀念,以便更容易了解、吸收相關資料的內容。

從開機到進入作業系統經過了什麼地方?

按下電腦的電源鈕後,便由BIOS掌控大局。BIOS檢查完硬體相關狀況後,便會把主持棒交給MBR,然後再載入藏在MBR中的開機管理程式。這個藏在MBR裡面的開機管理程式會依照選擇而進入其他開機管理程式或是載入進入作業系統所需的核心,最後就進入作業系統。說了這麼一大串,大家應該都混亂了吧XD,

簡單來說就是:開機→BIOS→MBR→開機管理程式→(開機管理程式→)作業系統

MBR是什麼?

MBR全名是Master Boot Record,中文是「主啟動磁區」,也就是硬碟的第零軌。MBR的磁區大小為512Bytes,其中這又分成「Magic Number」、「Partition table」、「Bootloader」三個區塊。

Magic Number

存在於MBR的1~2Bytes,大小是2Bytes,中文是神奇數字!?(自己亂翻譯)。這個區域永遠填入固定的值「55AA」,事實上這個區域沒有任何特殊功能XD,只是讓其他程式可以辨認出這裡是MBR,簡單來說就只是一個識別碼。

Partition table

存在於MBR的3~66Bytes,大小是64Bytes,中文是「硬碟分割表」。裡面記載著硬碟各分割區的資料,例如:分割區的格式、分割區的起點與終點…等等。每一個分割區資料會花掉16Bytes,聰明的你,一定會發現,「那不就只能分割成4個分割區?」,為了增加可分割的數量,所以有一種分割區的格式是「延伸分割區」,裡面記載的不是真正的分割區資料,而是記載哪裡還有像硬碟分割表之類的東西。透過這種方法所建立的分割區,我們稱它為「邏輯分割區」。

Bootloader

存在於MBR的67~512Bytes,大小是446Bytes。這裡面放著一個開機管理程式(例如:GRUB),我們可以透過這個開機管理程式來載入作業系統所需的檔案,然後載入作業系統。又或者我們可以透過開機管理程式載入其他的開機管理程式。

開機管理程式放在哪裡?

每一個分割區的第一個磁區,我們稱之為「開機磁區」(Boot Sector)。開機管理程式可以放在MBR裡的Bootloader,或者是每個分割區的開機詞區裡。

為什麼MBR裡的Bootloader一定要存在一個開機管理程式?

因為BIOS做完他的工作後,會直接載入這個位置的程式。畢竟載入BIOS時,根本還不知道什麼分割區(因為那是下一個步驟才會載入的)。因此我們不能苛求它到處找開機管理程式,所以一定要在MBR裡的Bootloader地方放一個開機管理程式來接下主持棒。

一台電腦有幾個MBR?

這個問題看似困難,其實這個問題很簡單。想想他的定義:硬碟的第零軌。這時候你就會恍然大悟,原來有幾個硬碟就有幾個MBR。此時回想一下我們在設定開機順序時,不是可以設定要先載入哪個光碟機或是硬碟嗎?如果是選硬碟,就是指載入這個硬碟的MBR。

MBR修復程式是如何做到修復的?

MBR修復程式只會重新寫入「Magic Number」、「Bootloader」,如果是使用Windows 光碟片裡的程式「fixmbr」,他就會在Bootloader裡面重新寫入Windows的開機管理程式;相同的,如果是用GRUB相關的修復程式來修復,他就會在Bootloader重新寫入GRUB。至於「Partition table」則沒有修復程式可以幫你修復,畢竟每個人的分割區都不一樣。所以我們只能平常自行備份硬碟分割表,不過千萬要注意,不要備份在同一個硬碟裡面,不然到時候還是讀不到喔XD

rsync 中文說明

使用方式:

rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST
rsync [OPTION]… [USER@]HOST:SRC [DEST]
rsync [OPTION]… SRC [SRC]… DEST
rsync [OPTION]… [USER@]HOST::SRC [DEST]
rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST
rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync [OPTION]… SRC [SRC]… rsync://[USER@]HOST[:PORT]/DEST

我常用的大概就下面這個

rsync -rltvp –delete -e “ssh -p 1688 -l root” /home/user/chingwei/www/ xx.xx.xx.xx:/home/www/backup/www/

參數說明,網路上的中文說明好像都這份~~所以也不知道真正的出處在那。

  • -h , –help 顯示rsync求助資訊.
  • –version 顯示rsync版本.
  • -v , –verbose 複雜的輸出訊息.
  • -q , –quiet 安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.
  • -I, –ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.可以透過此參數關閉此快速檢查.
  • –size-only rsync只檢查檔案大小是否改變,不管時間存取點是否改變.通常用在mirror,且對方時間不太正確時.
  • -c, –checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)
  • -a, –archive archive mode 權限保存模式,相當於 -rlptgoD 參數.
    很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).
  • -r, –recursive 複製所有下層的資料(遞迴)
  • -R, –relative 使用相對路徑.
    如:
    rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
    rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案
  • -R, –no-relative 不使用相對路徑.
  • -b, –backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
    –backup-dir=DIR 設定備份的資料夾.
    –suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).
  • -K, –keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理
  • -l, –links 複製所有的連結
  • -H, –hard-links 保留硬式連結
  • -p, –perms 保留檔案權限
  • -o, –owner 保留檔案擁有者(root only)
  • -g, –group 保留檔案群組
  • -D, –devices 保留device資訊(root only)
  • -t, –times 保留時間點
  • -n, –dry-run 不實際執行傳送,只顯示將會有的傳輸動作
  • -S, –sparse 嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.
  • -W, –whole-file 複製所有的檔案,不額外作檢查.
  • –no-whole-file 關閉 –whole-file 參數
  • -x, –one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)
  • -B, –block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce
  • -e –rsh=COMMAND 定義所使用的remote shell
  • –rsync-path=PATH 定義rsync在遠端機器存放資料的路徑
  • –existing 只比對更新目的端已經存在的檔案
  • –ignore-existing 忽略目的端已經存在的檔案(也就是不更新)
  • –delete 刪除傳送端已經不存在,而目的端存在的檔案
  • –delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,也刪除 –exclude 參數所包含的檔案.
  • –delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,但可以透過 –delete-after 讓刪除動作在檔案傳送後再行刪除.
  • –ignore-errors 忽略任何錯誤既使是I/O error 也進行 –delete 刪除動作.
  • –max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.
  • –partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.在某種狀況下保留那些部分傳送的檔案是令人高興的.你可以透過 –partial 參數達到這個目的.
  • –partial-dir=DIR 在 –partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案寫入定義的資料夾,而非直接寫入目的端.需要注意的是,此資料夾不應該被其他使用者可以寫入.(如:/tmp)
  • –force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,即使該資料夾不是空的.
  • –numeric-ids 不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid
  • –timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.預設為0,也就是沒有定義逾時時間.
  • -T, –temp-dir=DIR 定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.預設是直接在接收端資料夾直接產生暫存檔案.
  • –compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.
  • –link-dest=DIR 與 –compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.
  • -z, –compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮.
  • -P -P參數和 –partial –progress 相同.只是為了把參數簡單化.
  • -C, –cvs-exclude 排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
    RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make .state .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/ 符合以上條件的都會被忽略而不傳送.
  • –exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不進行傳送
  • –exclude-from=FILE 和–exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.執行時,透過此參數讓rsync讀取.(; #開頭的行列或空白行會被rsync忽略)
  • –include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.
  • –include-from=FILE 和–include參數相同,只不過把要包含的檔案寫到某一檔案.
  • –files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
    如: rsync -a –files-from=/tmp/foo /usr remote:/backup
  • -0 –from0 定義檔案所要讀取的檔案是null字元結尾.
  • –version 顯示版本訊息.
  • –daemon 定義rsync以daemon型態執行.
  • –no-detach 當以daemon型態執行時,不要進行分裂且變成背景程序.
  • –address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)
  • –config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定) 預設值為 /usr/local/etc/rsyncd.conf
  • –port=PORT 定義rsyncd(daemon)要執行的port(預設為tcp 873)
  • –blocking-io 使用blocking I/O連結遠端的shell,如rsh , remsh
  • –no-blocking-io 使用non-blocking連結遠端的shell,如ssh (預設值)
  • –stats 顯示檔案傳送時的資訊狀態
  • –progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)
  • –log-format=FORMAT 定義log的格式(在rsyncd.conf設定)
  • –password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼
  • –bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)
  • –write-batch=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)
  • –read-batch=FILE 透過讀取紀錄檔案來進行傳輸.(檔案由 –write-batch 參數產生)
  • –checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)
  • -4 –ipv4 使用IPv4協定
  • -6 –ipv6 使用IPv6協定

[非原創]MySQL的php備份語法

來源:  http://davidwalsh.name/backup-mysql-database-php

 

backup_tables('localhost','username','password','blog');

/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{

	$link = mysql_connect($host,$user,$pass);
	mysql_select_db($name,$link);

	//get all of the tables
	if($tables == '*')
	{
		$tables = array();
		$result = mysql_query('SHOW TABLES');
		while($row = mysql_fetch_row($result))
		{
			$tables[] = $row[0];
		}
	}
	else
	{
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}

	//cycle through
	foreach($tables as $table)
	{
		$result = mysql_query('SELECT * FROM '.$table);
		$num_fields = mysql_num_fields($result);

		$return.= 'DROP TABLE '.$table.';';
		$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
		$return.= "\n\n".$row2[1].";\n\n";

		for ($i = 0; $i < $num_fields; $i++) 
		{
			while($row = mysql_fetch_row($result))
			{
				$return.= 'INSERT INTO '.$table.' VALUES(';
				for($j=0; $j<$num_fields; $j++) 
				{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = ereg_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ");\n";
			}
		}
		$return.="\n\n\n";
	}

	//save file
	$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
	fwrite($handle,$return);
	fclose($handle);
}