深入研究Windows 7系統中的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=fixed3:; select vdisk file=c:windows7.vhd4:; attach vdisk5:; create partition primary6:; assign letter=r7:; format quick label=vhd8:; 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啟動的一些注意事項和局限性: 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命令。
相關文章:
