經(jīng)常有人提出這樣或者類(lèi)似的問(wèn)題“我光驅(qū)、軟驅(qū)都?jí)牧?,但想在DOS下重裝Windows 2000,有什么方法嗎?”或者也有人有這樣的問(wèn)題“我只安裝了一個(gè)Windows 2000/XP,并且C盤(pán)是NTFS分區(qū),怎么才能從硬盤(pán)直接啟動(dòng)到DOS下呢?”諸如此類(lèi)的問(wèn)題,在Windows 2000/XP/2003時(shí)代,不少朋友都會(huì)遇到。
身處OS Loader時(shí)代
現(xiàn)在大家的PC機(jī)上一般都安裝的是Windows 2000、Windows XP操作系統(tǒng),并使用OS Loader作為啟動(dòng)管理器。OS Loader這個(gè)啟動(dòng)管理器的優(yōu)點(diǎn)是直接安裝在分區(qū)的引導(dǎo)扇區(qū)上,不影響主引導(dǎo)扇區(qū)(Main Boot Record,就是我們常說(shuō)的MBR),因此不會(huì)被誤判為病毒。此外,OS Loader可以直接安裝在NTFS,而且由于是Windows自帶的,用起來(lái)比較方便,所以大部分Windows的用戶(hù)都直接使用OS Loader來(lái)實(shí)現(xiàn)多系統(tǒng)引導(dǎo)(不少人除Windows 2000/XP系統(tǒng)外沒(méi)裝其他系統(tǒng))。圖注 OS Loader的啟動(dòng)菜單由Boot.ini控制
Microsoft前段時(shí)間曾經(jīng)說(shuō)過(guò),不再準(zhǔn)備支持軟驅(qū),而現(xiàn)狀是目前比較新的PC機(jī)一般都取消了軟驅(qū),比較老的PC機(jī)的軟驅(qū)很可能也壞了(如我的老機(jī)器),而且軟盤(pán)也容易損毀,所以需要軟驅(qū)的機(jī)會(huì)不太多了。由于軟盤(pán)在PC歷史上發(fā)揮過(guò)比較大的作用,在某些情況下,我們還必須通過(guò)它來(lái)完成某些工作,比如在沒(méi)有CDROM的機(jī)器上安裝新的操作系統(tǒng)、殺毒,或者測(cè)試需要啟動(dòng)到DOS下來(lái)完成一些數(shù)據(jù)的備份、維護(hù)工作(畢竟不是我們需要的所有軟件都已經(jīng)完美支持了WinPE環(huán)境)。
綜上兩種情形,我們可以通過(guò)OS Loader來(lái)加載一些需要軟盤(pán)來(lái)進(jìn)行的啟動(dòng)盤(pán)。為什么說(shuō)要加載其他操作系統(tǒng)的啟動(dòng)盤(pán),而不是啟動(dòng)文件?這是因?yàn)镺S Loader只能在FAT和NTFS分區(qū)上運(yùn)行,而在軟盤(pán)上運(yùn)行的系統(tǒng)大多數(shù)又不支持NTFS分區(qū)。所以我們可以把軟盤(pán)做成鏡像,然后通過(guò)OS Loader來(lái)加載鏡像文件。
目前OS Loader只支持加載引導(dǎo)扇區(qū)或者引導(dǎo)扇區(qū)的鏡像文件,而不支持直接加載軟盤(pán)鏡像,所以本文需要介紹的vFloppy就應(yīng)運(yùn)而生了。
類(lèi)似的工具
那么有沒(méi)有其他的引導(dǎo)程序可以完成類(lèi)似的工作呢?
答案是肯定的,不但有,而且還不少,不過(guò)它們的功能不盡相同。
- 名稱(chēng)及相關(guān)網(wǎng)站
- 支持操作系統(tǒng)
- 支持文件系統(tǒng)
- LILO
- Linux
- 不能虛擬軟盤(pán)
- Diskemu
- 光盤(pán)運(yùn)行
- ISO9660
- BootScriptor
- 光盤(pán)運(yùn)行
- ISO9660
- ISOLinux
- 光盤(pán)運(yùn)行
- ISO9660
- SysLinux
- FAT1.6/FAT1.2
- GRUB
- Linux
- 通過(guò)sysLinux 的Memdisk可以完成類(lèi)似功能,但memdisk需要鏡像文件在硬盤(pán)上連續(xù)存放
OS Loader的特點(diǎn)
MS的OS Loader除了可以加載WinNT/Win2000/WinXP等等,還可以運(yùn)行以前安裝的Windows98,Windows 98 啟動(dòng)的過(guò)程是:
- BIOS自檢后,加載硬盤(pán)的主引導(dǎo)紀(jì)錄MBR,運(yùn)行MBR的代碼。
- MBR的代碼檢測(cè)分區(qū)表,然后加載活動(dòng)分區(qū)的引導(dǎo)紀(jì)錄——DBR,運(yùn)行DBR的代碼。
- Windows 98的DBR的代碼查找IO.sys,啟動(dòng)Windows 98。
硬盤(pán)最基本的組成部分是由堅(jiān)硬金屬材料制成的涂以磁性介質(zhì)的盤(pán)片,盤(pán)片被分成許多扇形的區(qū)域,每個(gè)區(qū)域叫一個(gè)扇區(qū),大多數(shù)情況下每扇區(qū)是512字節(jié),老式硬盤(pán)使用磁道(或柱面)和磁頭數(shù),以及扇區(qū)作為硬盤(pán)結(jié)構(gòu)的基本參數(shù),目前的硬盤(pán)直接使用扇區(qū)號(hào)來(lái)訪問(wèn)硬盤(pán),128G以下的硬盤(pán)使用32位整數(shù)作為扇區(qū)號(hào),而128G以上的硬盤(pán)使用48位整數(shù)作為扇區(qū)號(hào)。
MBR(Main Boot Record),即為主引導(dǎo)記錄區(qū),位于整個(gè)硬盤(pán)的第一個(gè)扇區(qū),在總共512字節(jié)的主引導(dǎo)扇區(qū)中,MBR只占用了其中的446個(gè)字節(jié)另外的64個(gè)字節(jié)交給了DPT(Disk Partition Table硬盤(pán)分區(qū)表),主要這兩部分構(gòu)成了硬盤(pán)的主引導(dǎo)扇區(qū)。DBR(Dos Boot Record)是操作系統(tǒng)引導(dǎo)記錄區(qū)。它位于硬盤(pán)的每個(gè)分區(qū)的第一個(gè)扇區(qū),是操作系統(tǒng)可以直接訪問(wèn)的第一個(gè)扇區(qū),它一般包括一個(gè)位于該分區(qū)的操作系統(tǒng)的引導(dǎo)程序和相關(guān)的分區(qū)參數(shù)記錄表。圖注:硬盤(pán)引導(dǎo)系統(tǒng)訪問(wèn)這些扇區(qū)
OS Loader加載Windows 98的原理是,安裝Win2000的時(shí)候,保存了Windows 98的引導(dǎo)紀(jì)錄DBR文件——BootSect.dos,然后安裝Win2000自己的引導(dǎo)記錄DBR,
用OS Loader啟動(dòng)Windows 98的過(guò)程是:
- BIOS自檢后,加載硬盤(pán)的主引導(dǎo)紀(jì)錄——MBR,運(yùn)行MBR的代碼。
- MBR的代碼檢測(cè)分區(qū)表,然后加載活動(dòng)分區(qū)的引導(dǎo)紀(jì)錄——DBR,運(yùn)行DBR的代碼,該代碼是OS Loader的代碼。
- OS Loader的DBR的代碼加載相關(guān)的程序(主要是ntldr和ntdect.com文件),分析boot.ini文件,顯示啟動(dòng)菜單,等待接受用戶(hù)的命令——啟動(dòng)相應(yīng)的操作系統(tǒng)的啟動(dòng)文件。
- 如果用戶(hù)選擇Win98,那么OS Loader的DBR的代碼加載保存下來(lái)的Windows98的DBR文件——BootSect.dos,運(yùn)行該DBR的代碼。
- Windows 98的DBR的代碼查找IO.sys,啟動(dòng)Windows 98。
從上面2個(gè)過(guò)程的對(duì)比可以看出,OS Loader在加載Windows98的時(shí)候,僅僅是一個(gè)傳遞引導(dǎo)控制的過(guò)程,把計(jì)算機(jī)啟動(dòng)代碼運(yùn)行過(guò)程傳遞到一個(gè)文件(BootSect.dos)中,然后由這個(gè)文件繼續(xù)引導(dǎo)操作系統(tǒng)。
從上面的分析過(guò)程,可以看出,OS Loader可以加載一個(gè)引導(dǎo)文件,然后把控制轉(zhuǎn)移到該引導(dǎo)文件上,平時(shí)常見(jiàn)的用OS Loader加載Linux就是類(lèi)似的原理。
虛擬軟盤(pán)的使用
vFloppy 1.0由3個(gè)文件組成,vfloppy.exe、vLoader.bin和vMemdsk.bin。其中vfloppy.exe是Win32的控制臺(tái)程序,vLoader.bin是一個(gè)512字節(jié)的引導(dǎo)代碼(由OS Loader來(lái)選擇加載),vMemdsk.bin則用來(lái)在內(nèi)存中虛擬一個(gè)軟驅(qū),從而加載并運(yùn)行軟盤(pán)鏡像。最新的1.5版本,不包括vLoader.bin和vMemdsk.bin,而由主程序vFloppy執(zhí)行時(shí)自動(dòng)生成和軟盤(pán)鏡像文件同前綴的兩個(gè)文件來(lái)完成同樣功能,另外vFloppy 1.5還提供了在DOS下支持NTFS分區(qū)的軟盤(pán)鏡像。
另外還需要一個(gè)軟盤(pán)鏡像文件,vFloppy目前支持1.44MB或者2.88MB大小的鏡像文件,該鏡像文件必須可以啟動(dòng)(就是把這個(gè)文件寫(xiě)進(jìn)軟盤(pán)后,可以從該軟盤(pán)啟動(dòng)計(jì)算機(jī))。我們可以用WinImage來(lái)制作軟盤(pán)鏡像。
-
安裝vFloppy
假設(shè) vFloppy 放在
c:\boot
,c盤(pán)可以是FAT 16/FAT32和NTFS 分區(qū)格式。-
如果你手頭的是vFloppy 1.0,則可以運(yùn)行:
vfloppy -1 vLoader.bin -2 vMemdsk.bin -i anyos.img
其中的anyos.img表示你需要在OS Loader下引導(dǎo)的軟盤(pán)鏡像文件。然后在c:\boot.ini
中加入一項(xiàng):C:\boot\vLoader.bin ="vFloppy Virtual Floppy Disk "
-
對(duì)于vFloppy 1.5來(lái)說(shuō),由于重新編寫(xiě)了內(nèi)核,并增加了GUI引導(dǎo)界面。所以你需要打開(kāi)vFloppy,指定軟盤(pán)鏡像文件所在的位置即可。圖注 vFloppy 1.5安裝更簡(jiǎn)單
重新啟動(dòng)系統(tǒng)后,在OS Loader的菜單上選擇:
vFloppy Virtual Floppy Disk
就會(huì)加載 c:\boot\anyos.img 這個(gè)鏡像,并啟動(dòng)系統(tǒng)——就好像從一個(gè)軟驅(qū)中啟動(dòng)一樣。
-
-
vFloppy三大優(yōu)點(diǎn)
從上面的介紹和操作,我們可以看出,使用vFloppy虛擬軟驅(qū)啟動(dòng),至少有三大優(yōu)點(diǎn):
- 安全。虛擬軟盤(pán)是只讀的,不向引導(dǎo)區(qū)寫(xiě)代碼,不會(huì)破壞系統(tǒng),更不會(huì)破壞MBR。
- 方便??梢噪S時(shí)重新啟動(dòng)系統(tǒng),進(jìn)入別的操作系統(tǒng),如DOS 6.22、DOS 7 、Linux和其他系統(tǒng)環(huán)境,而不需要獨(dú)立的分區(qū),更不用管放置啟動(dòng)鏡像盤(pán)的分區(qū)格式是NTFS還是FAT32。
- 完全用內(nèi)存虛擬軟盤(pán),加載后可以格式化存放原來(lái)的引導(dǎo)鏡像的硬盤(pán),或者進(jìn)行Ghost操作。圖注 虛擬軟盤(pán)讓你從NTFS分區(qū)啟動(dòng)DOS
-
注意事項(xiàng)
在我們使用vFloppy虛擬軟盤(pán)引導(dǎo)系統(tǒng)時(shí),還需要注意以下問(wèn)題。
- 如果C:用的NTFS,并且使用了磁盤(pán)壓縮的請(qǐng)確保
C:\Boot
目錄及其下面的文件沒(méi)有被壓縮。 - 運(yùn)行vFloppy,只是根據(jù)你的硬盤(pán)情況生成相應(yīng)的引導(dǎo)文件vLoader.bin和虛擬軟盤(pán)vMemdsk.bin文件,絕對(duì)不會(huì)重寫(xiě)MBR。
- vMemdsk.bin定位磁盤(pán)鏡像anyos.img時(shí)是直接通過(guò)該文件所在的磁盤(pán)扇區(qū),而不是通過(guò)文件系統(tǒng)來(lái)進(jìn)行的,從而實(shí)現(xiàn)對(duì)NTFS、FAT32和FAT的支持。即使刪除了該文件,只要所在扇區(qū)的數(shù)據(jù)還沒(méi)有被覆蓋,或許仍然能夠啟動(dòng)該磁盤(pán)鏡像,但進(jìn)行磁盤(pán)整理后可能造成無(wú)法啟動(dòng),只需要重新運(yùn)行一下vfloppy即可。
- vfloppy.exe 的參數(shù)可以是絕對(duì)路徑,如:
vfloppy -1 c:\Boot\vLoader.bin -2 c:\Boot\vMemdsk.bin -i c:\img\dos.img
- 如果C:用的NTFS,并且使用了磁盤(pán)壓縮的請(qǐng)確保
應(yīng)用實(shí)例
vFloppy的優(yōu)點(diǎn)介紹了這么多。我們還是通過(guò)實(shí)例來(lái)說(shuō)明它如何幫我們完成那些很實(shí)用的功能。
Ghost
用Ghost 恢復(fù)系統(tǒng)的時(shí)候,需要一個(gè)軟盤(pán)或者光盤(pán)來(lái)啟動(dòng),而使用vFloppy可以在僅有硬盤(pán)啟動(dòng)的時(shí)候,用備份的ghost文件覆蓋當(dāng)前的系統(tǒng)分區(qū)。
Knoppix
vFloppy一個(gè)用途就是可以把在光盤(pán)上運(yùn)行的Knoppix 系統(tǒng)方便的放到硬盤(pán)上,而不需要對(duì)系統(tǒng)重新分區(qū).只需要把Knoppix光盤(pán)上的文件直接拷貝到硬盤(pán),然后讓OS Loader 通過(guò)虛擬軟盤(pán)的方式加載Knoppix的啟動(dòng)鏡像文件就可以了.
如果CD-ROM的盤(pán)符是E,我們想在D盤(pán)上運(yùn)行KNOPIX,則
cd E:KNOPPIX
mkdir D:KNOPPIX
copy KNOPPIX D:KNOPPIX
從OS Loader 加載的虛擬軟盤(pán)啟動(dòng)后,KNOPPIX會(huì)自動(dòng)在硬盤(pán)上掃描KNOPPIX文件夾和KNOPPIX文件。
這樣既可以享受Knoppix的便捷,很方便的更新Knoppix到最新版本,又不需要刻錄光盤(pán),而且光盤(pán)運(yùn)行Knoppix會(huì)比硬盤(pán)慢。
虛擬軟盤(pán)的原理
前面我們介紹了vFloppy是如何工作的。針對(duì)有興趣的朋友,筆者愿意分享我開(kāi)發(fā)的心得和源代碼。
同前面的過(guò)程類(lèi)似,就是生成一個(gè)引導(dǎo)扇區(qū)文件DBR,讓OS Loader加載并運(yùn)行,然后這個(gè)DBR文件加載硬盤(pán)上的磁盤(pán)鏡像文件anyos.img,最后把控制權(quán)引導(dǎo)到該鏡像文件。
vFloppy執(zhí)行如下語(yǔ)句:vFloppy -1 vLoader.bin -2 vMemdsk.bin -i anyos.img
實(shí)際完成了兩個(gè)操作:
- vfloppy 計(jì)算anyos.img鏡像文件在磁盤(pán)上所占用的絕對(duì)扇區(qū)地址,把扇區(qū)地址寫(xiě)入到vMemdsk.bin中的預(yù)定位置。這樣在引導(dǎo)系統(tǒng)的時(shí)候,就不需要操作系統(tǒng)的支持而讀取anyos.img鏡像文件。
- vfloppy 計(jì)算vMemdsk.bin文件在磁盤(pán)上所占用的絕對(duì)扇區(qū)地址,然后把扇區(qū)地址寫(xiě)入到vMemdsk.bin和vLoader.bin中的預(yù)定位置。
用OS Loader啟動(dòng)vfloppy的過(guò)程
用OS Loader引導(dǎo)vFloppy虛擬的軟盤(pán)鏡像,其實(shí)和OS Loader下引導(dǎo)Windows 98類(lèi)似。
- BIOS自檢后,加載并運(yùn)行硬盤(pán)的主引導(dǎo)紀(jì)錄——MBR。
- MBR中的相應(yīng)代碼檢測(cè)分區(qū)表,然后加載活動(dòng)分區(qū)的引導(dǎo)紀(jì)錄——DBR。本例中DBR就是OS Loader。
- OS Loader加載相關(guān)的程序,然后顯示啟動(dòng)菜單,接受用戶(hù)的命令(選擇啟動(dòng)vFloppy或者其他)。
- 如果選擇vFloppy,則控制權(quán)轉(zhuǎn)給vFloppy的啟動(dòng)代碼vLoader.bin。
- vLoader.bin根據(jù)執(zhí)行vFloppy時(shí)記錄的vMemdsk.bin文件的扇區(qū)地址,加載vMemdsk.bin并將轉(zhuǎn)移轉(zhuǎn)給它。
- vMemdsk.bin根據(jù)執(zhí)行vFloppy時(shí)記錄的anyos.img文件的扇區(qū)地址,讀入anyos.img文件。
- vMemdsk.bin把對(duì)軟驅(qū)的訪問(wèn)重定向到內(nèi)存,也就是用內(nèi)存模擬一個(gè)軟驅(qū)。
- vMemdsk.bin的代碼加載模擬軟驅(qū)的引導(dǎo)扇區(qū),從而從虛擬軟驅(qū)引導(dǎo)系統(tǒng)。
和PartitionMagic與 Drive Image自帶的虛擬軟盤(pán)對(duì)比
如果用過(guò)PartitionMagic的人就知道, 它運(yùn)行時(shí)如果是對(duì)非系統(tǒng)分區(qū)的調(diào)整則不需要重新啟動(dòng)就可以進(jìn)行,而對(duì)系統(tǒng)分區(qū)進(jìn)行調(diào)整(如擴(kuò)張或者收縮系統(tǒng)分區(qū)),會(huì)要求重新啟動(dòng),并且重啟之后直接啟動(dòng)到DOS進(jìn)行調(diào)整分區(qū)的工作的,不會(huì)出現(xiàn)OS Loader的啟動(dòng)菜單。 WinNT內(nèi)核系統(tǒng)如Win2000/WinXP等同樣如此。據(jù)分析, PartitionMagic有一個(gè)程序能將系統(tǒng)啟動(dòng)到虛擬軟盤(pán)中,這種虛擬軟盤(pán)用的實(shí)際就是IMG格式的未壓縮的映像,可以使用WinImage來(lái)編輯,Drive Image同樣帶有類(lèi)似的虛擬軟盤(pán)。
那么為什么我不直接使用PartitionMagic的虛擬軟盤(pán)呢?這是因?yàn)椋?/p>
- 安全。PartitionMagic 的虛擬軟盤(pán)的引導(dǎo)程序是放在MBR中的,并且占據(jù)磁盤(pán)開(kāi)始的3個(gè)扇區(qū),也就是說(shuō)vfloppy.sys安裝的時(shí)候,需要向從MBR開(kāi)始的3個(gè)扇區(qū)寫(xiě)數(shù)據(jù),這樣如果此時(shí)發(fā)生錯(cuò)誤,將可能使得系統(tǒng)無(wú)法引導(dǎo)。
- 沖突。由于“向從MBR開(kāi)始的3個(gè)扇區(qū)寫(xiě)數(shù)據(jù)”,有可能和其他的啟動(dòng)管理程序沖突,如Smart Boot Manager也需要這些扇區(qū)空間,PartitionMagic的虛擬軟盤(pán)的安裝代碼將會(huì)覆蓋它,并且是永久覆蓋,不會(huì)恢復(fù)。
- 不靈活。PartitionMagic 的虛擬軟盤(pán)執(zhí)行前,將會(huì)恢復(fù)主引導(dǎo)記錄MBR,從而在系統(tǒng)啟動(dòng)的時(shí)候,我們無(wú)法選擇需要啟動(dòng)的操作系統(tǒng)。
虛擬軟盤(pán)的源代碼
筆者在參考了GRUB 0.93的源代碼和PartitionMagic 的vFloppy.sys 的反匯編代碼后,實(shí)現(xiàn)了一個(gè)類(lèi)似PartitionMagic 的vFloppy.sys的虛擬軟盤(pán)系統(tǒng)。
-
系統(tǒng)構(gòu)成
該系統(tǒng)主要包括3個(gè)模塊:
-
引導(dǎo)扇區(qū)文件vLoader.bin
在vfloppy\loader目錄的vloader.asm中,作用就是根據(jù)vFloppy.exe記錄在該文件內(nèi)部的關(guān)于vMemdsk.bin文件的扇區(qū)列表,加載vMemdsk.bin,并執(zhí)行。這個(gè)模塊的代碼必須限制在512個(gè)字節(jié)以?xún)?nèi)。由于512字節(jié)大小的限制,引導(dǎo)扇區(qū)文件僅僅記錄了vMemdsk.bin文件第一個(gè)扇區(qū)的地址,然后通過(guò)vMemdsk.bin文件第一個(gè)扇區(qū)繼續(xù)加載vMemdsk.bin的其他扇區(qū)。
-
模擬軟驅(qū)程序vMemdsk.bin
在vFloppy\loader目錄的vmemdsk_start.asm和vFloppy.sys中。其中vFloppy.sys文件來(lái)自PartitionMagic 7的虛擬軟盤(pán)的文件,vmemdsk_start.bin則繼續(xù)vLoader的工作,并加載vFloppy.sys。
vMemdsk.bin=vmemdsk_start.bin+vFloppy.sys
vFloppy.sys負(fù)責(zé)讀取軟盤(pán)鏡像文件,并虛擬一個(gè)軟驅(qū)。
-
主程序vFloppy
由vfloppy\loader目錄的install.c、fat_blocklist.c、NTFS_blocklist.c、blocklist.c和Win32.c 等文件組成。筆者從GRUB中中抽取了部分讀取NTFS 和FAT分區(qū)的代碼,所以很多頭文件都在GRUB的目錄下面。
vFloppy.exe除了計(jì)算鏡像文件的扇區(qū)列表外,還要給PartitionMagic的Vfloppy.sys傳遞鏡像文件的參數(shù)。相關(guān)參數(shù)這里就不再詳細(xì)說(shuō)明,可以到我們的網(wǎng)站下載源代碼及相關(guān)說(shuō)明說(shuō)明。
-
-
編譯
本文提供的源代碼可用Mingw32和Nasmw編譯。附上的文件包括了打了ISO9660和NTFS補(bǔ)丁的GRUB0.93以及vfloppy的所有源代碼。
編譯的方法很簡(jiǎn)單,執(zhí)行進(jìn)入vfloppy目錄,執(zhí)行l(wèi)oader目錄的mkmemdsk.bat文件,就完成了loader的編譯,然后在vfloppy目錄執(zhí)行Mingw32的make編譯vfloppy的win32部分的可執(zhí)行代碼。
vfloppy展望
- 提供對(duì)Win9x和DOS的支持。源代碼中包括了一個(gè)不是很完善的DOS版本,但僅僅支持FAT分區(qū)。
- 重寫(xiě)vMemdsk.bin核心代碼,使其支持1.28G以上的硬盤(pán)(需要BIOS的支持),支持大的鏡像文件,支持ISO文件,支持磁盤(pán)切換,支持內(nèi)存寫(xiě)盤(pán),支持保存內(nèi)存盤(pán)的修改。如果一切順利的話,可以在2004年底之前完成。
- 直接處理文件系統(tǒng),類(lèi)似于一個(gè)精簡(jiǎn)版本的GRUB。