理解VHD格式
絕大多數人最初接觸VHD格式的文件,是在使用Virtual PC或者Virtual Server時,VHD是以文件形式存在的虛擬機的磁盤。微軟在2005年公開了VHD格式文件的全部細節,可以從微軟的TechNet網站下載Virtual Hard Disk Image Format Specification。這說明了微軟不僅僅要把VHD應用在虛擬機領域,更希望VHD能夠成為一種新的磁盤格式和載體在業界得到更多的支持。
讓我們拋開虛擬機,把目光集中在VHD文件本身。VHD是一塊虛擬的硬盤,不同於傳統硬盤的盤片、磁頭和磁道,VHD硬盤的載體是文件系統上的一個VHD文件。如果大家仔細閱讀VHD文件的技術標准,就會發現標准中定義了很多Cylinder、Heads和Sectors等硬盤特有的術語,來模擬針對硬盤的I/O操作。既然VHD是一塊硬盤,那麼就可以跟物理硬盤一樣,進行分區、格式化、讀寫等操作。
我們這可以這樣認為,VHD也是硬盤的一種,就像2.5寸、3.5寸、SCSI、SATA、IDE等不同規格的硬盤一樣,VHD是在一個文件中的硬盤。
Windows 7支持VHD的技術實現方式
在討論具體的技術實現方式之前,我們首先需要理解操作系統對磁盤和文件的管理。操作系統有磁盤系統和文件系統兩部分,分別處理對硬盤的I/O讀寫指令(磁盤系統),和管理硬盤之上的分區、數據和文件格式(文件系統)。VHD是存在於文件之上的磁盤,可想而知它的技術實現必須橫跨磁盤系統和文件系統這兩部分。如果您對操作系統中這一部分不是非常的了解,可以聽一聽微軟網站上的Windows存儲技術系列Webcast。
簡單的說,要把VHD文件當作硬盤一樣讀寫,必須有相應的驅動程序。在Virtual PC和Virtual Server中,微軟就是通過在虛擬機種加入VHD的驅動程序,使得虛擬機可以從VHD啟動並進行後續的操作。
在Windows 7中,微軟把VHD的驅動內置進了操作系統,也包括在了Windows 7的引導程序中。這也就是說,我們可在使用Windows 7的時候,直接訪問VHD文件中的內容(把VHD的硬盤映射到一個盤符,後面會詳細描述),也可以通過Windows 7的引導程序,啟動位於VHD磁盤上的另一個操作系統。理解VHD驅動的工作細節,需要比較多的Windows底層知識,下圖是一個比較簡單和抽象的結構,可以發現,VHD的驅動是跟磁盤驅動和文件系統緊密結合的。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
眼花缭亂的VHD應用
既然在Windows 7中可以對VHD直接讀寫,讓我們來看看這個強大的功能到底能有多少過人之處。
首先,我們可以用命令行工具Diskpart創建VHD文件!(是的,命令行工具,你可能已經想到了自動化批處理和批量部署可以用到這個技術,沒錯,網管說:要硬盤,於是,大量的VHD就被創建出來了… )
1: diskpart 2: create vdisk file=c:windows7.vhd maximum=25600 type=fixed 3: select vdisk file=c:windows7.vhd 4: attach vdisk 5: create partition primary 6: assign letter=r 7: format quick label=vhd 8: exit上面這段命令,創建了一個固定尺寸的VHD文件,並且進行了分區、分配盤符和格式化,一氣呵成。Diskpart還能做很多事情,具體參數,請參考這個文檔,如果你不喜歡命令行,那麼Windows 7的磁盤管理工具,一樣可以完成上述操作。現在我們看看VHD在Windows 7中直接訪問的幾種方法:
方法一:如右圖,Foo.VHD文件中可以包含一個以上的磁盤分區,這些分區都可以映射到Windows操作系統中,可以為之分配盤符,也可以映射到一個NTFS的目錄。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
方法二:如右圖,VHD的磁盤中可以包含VHD文件,這個VHD文件還可以被映射到操作系統中,目前版本的Windows支持2層嵌套VHD。(我實在想不出有什麼實際的用處,據說這個功能可能會在正式版中被去掉,以免把用戶搞糊塗)
圖片看不清楚?請點擊這裡查看原圖(大圖)。
方法三:如果你還沒有被上面的嵌套VHD搞糊塗的話,讓我們繼續看右圖。還記得VHD文件的差異磁盤功能吧?Bar.VHD在嵌套的基礎上,使用物理C盤上的BarParent.VHD做成了一個差異磁盤。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
其實這種方法還是挺實用的,不考慮嵌套,Foo.VHD可以使用BarParent.VHD做差異磁盤,如果這樣的話,從Foo.VHD啟動計算機,每次用完都通過批處理自動銷毀,硬盤保護卡的市場,恐怕從此要消失了。。。
方法四:如右圖,我們可以把網絡共享裡面的VHD文件,映射到系統中來。這個功能,結合上面的那個差異磁盤,對,小硬盤學生機,都不用硬盤保護卡勒!
圖片看不清楚?請點擊這裡查看原圖(大圖)。
這些功能的確令人眼花缭亂,我們冷靜一下,看看VHD有什麼局限性和功能上的限制:
最多可以同時映射的VHD文件數量是512個(似乎也夠用了)
VHD磁盤的父分區,不支持Volume Snapshot
映射的VHD磁盤,不能被配置為動態磁盤,也就是不能在VHD上建軟RAID(知足吧,VHD實現已經很復雜了,軟RAID就不要來添亂了)
從VHD啟動計算機
如果說你對在Windows 7中映射和使用VHD文件無動於衷,那麼,我相信從VHD啟動計算機一定會抓住你的眼球。
我之前提到了,在Windows 7中,微軟把VHD的驅動內置進了操作系統,也包括在了Windows 7的引導程序中。這也就是說,在啟動計算機的階段,Windows 7的引導程序可以大搖大擺的直接訪問VHD文件,並且啟動VHD中安裝的系統。
慢著,什麼是Windows 7的引導程序?簡單地說,引導程序就是在操作系統內核或用戶應用程序運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備(加載必要的驅動程序)、建立內存映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核或用戶應用程序准備好正確的環境。我們在裸機上安裝Windows 7時,首先做的,就是把Windows 7的引導程序寫入磁盤的特殊位置。Windows 7的引導程序帶有VHD驅動,因此可以從VHD啟動。
要完成從VHD啟動計算機,需要以下幾個步驟:
你必須得讓VHD中有一個操作系統先。有幾種辦法,可以用Virtual PC或者Virtual Server安裝一個操作系統在VHD文件中,然後運行Sysprep,接著關閉虛擬機,這個VHD文件就可以用了。運行Sysprep是必須的,否則VHD下次啟動時,仍舊加載虛擬機環境下的驅動程序,會導致藍屏。
如果你想玩一個高級的,可以使用ImageX命令,把Vista的鏡像,或者其它的磁盤鏡像直接灌入VHD文件,下面是一個具體的演示。這些命令把Vista鏡像灌入一個VHD,並且使用WinPE在物理機的磁盤上載入Windows 7的引導程序,用Windows 7引導程序啟動硬盤上的VHD文件,注意:物理機本身沒有安裝Windows 7!
1. 用Diskpart創建VHD這裡就不在贅述了,前面一段有這些命令。接著前面的一段命令,我們首先使用ImageX把一個操作系統的鏡像,灌入VHD文件。WIM格式文件是Vista及以後版本Windows的安裝鏡像,在安裝DVD中可以找到。
cd d "c:program files<version>tools<architecture>"
imagex /apply <wim文件的路徑> 1 r:2. WIM鏡像被灌入VHD之後,使用Diskpart把VHD文件從當前的系統中卸載。
diskpart
select vdisk file=c:Windows7.vhd
detach vdisk
exit3. 把這個准備好的VHD文件放到一個網絡共享中備用。
net use y: \network_share
copy c:windows7.vhd y:network_sharevhd4. 使用Windows 7版本的WinPE光盤啟動你的試驗計算機,並運行如下命令把當前磁盤上的分區和數據清空。(注意,此操作會導致無法挽回的數據丟失,請一定要備份數據先)
diskpart
sel disk 0
clean5. 接下來用Diskpart創建兩個分區,分別是200M的S盤和默認剩余硬盤空間尺寸的C盤。S也成為系統分區,用於保存Windows 7的引導程序和相應必須的一些文件。然後把剛才放到網絡共享的VHD文件,復制到C盤的根目錄。
create partition primary size=200
format quick fs=ntfs
assign letter=s
active
create partition primary
format quick fs=ntfs
assign letter=c
exit6. 用Diskpart命令加載VHD到當前的WinPE環境下,訪問VHD中的Windows System32目錄,並執行bcdboot命令完成啟動所必需的初始化配置。bcdboot這個命令很神氣,文檔中的具體描述是:Use the BCDboot tool, located in the System32 directory of the Windows 7 VHD, to copy the boot-environment files from theWindows directory in the VHD to the system partition. The BCDboot tool will create the BCD configuration to boot from the VHD. For more information about the BCDboot tool, see BCDboot Command-Line Options in the OEM Preinstallation Kit (OPK) User's Guide or the Windows Automated Installation Kit (Windows AIK) User's Guide.
diskpart
select vdisk file=c:Windows7.vhd
attach vdisk
exit
cd v:Windowssystem32
bcdboot v:windows /s s:7. 把WinPE光盤從光驅中移走,重啟試驗計算機,你會發現系統直接進入了VHD裡面的Windows 7!
8. 如果你想在已有的Windows 7環境下配置配置一個從VHD的多啟動選項,可以使用BCDEdit命令。(具體操作步驟在此)
圖片看不清楚?請點擊這裡查看原圖(大圖)。
上圖是從VHD啟動的大致結構,請注意VHD中操作系統的頁面文件和Crashdump,不是包含在VHD中的,他們被保存在VHD文件的同一個目錄中。
我們也需要了解一下VHD啟動的一些注意事項和局限性:
1. 從VHD啟動是有版本限制的,目前(2009年1月)的文檔指出只有Windows Server 2008 R2、Windows 7商業版及以上版本,才支持此功能,未來正式發布時可能會有變化,敬請留意。
2. UDFS文件系統暫時不被支持(UDFS是什麼?不支持也罷…)
3. 啟動用的VHD文件,不能保存在壓縮或者加密的NTFS磁盤之上(這一點很多人會忽略)
4. 根據一些朋友的反饋,動態的VHD文件無法啟動,需要在建立vhd是設置成立即分配才可以從vhd啟動
5. 如果你的物理硬盤是RAID格式,則必須要在VHD中的操作系統鏡像中注入RAID的驅動程序,可以使用peimg命令。這個我沒有測試過,感謝yueyezhan的反饋
性能性能性能
大家一定關心VHD的性能問題。相比物理磁盤,VHD的讀寫I/O性能指標對比如下,測試數據根據Windows 7 Build 6801獲得,這些數據在近期的WinHEC大會上獲得的。我們可以發現,相對於物理硬盤,VHD的讀寫開銷非常小,只有在進行連續區塊寫入操作時,才跟物理硬盤有較明顯的性能差異。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
引用一些網友關於VHD的描述:
實驗成功!
原系統是win7X86,灌裝了一個X64的win7,在虛擬機裡vhd上的X64Win7成功啟動
速度上感覺不出有差異已經成功從VHD啟動
從磁盤管理可以看到當前系統盤C盤也就是20G的DISK2當然是VHD的啦,呵呵.
啟動和運行速度和真機差不多吧~~結論就是很好很強大,有著和真機幾乎一樣的速度,可以照完所有3D游戲,
說白了用起來和真機幾乎沒任何區別。Win7讓多系統變得簡單,
根本不用為分區煩惱,一個系統就一個vhd鏡像,蹦了復制一份替換即可,
就像用虛擬機一樣。當然虛擬的系統貌似只能是Win7及以上系統如server2008R2。企業應用場景和未來展望
個人用戶的多啟動解決方案
企業操作系統的批量部署
接合差異磁盤的無盤(小盤)工作站,可以替代硬盤保護卡