在Citrix PVS架構和產品中,位於最後端的存儲硬盤採用的是虛擬化時代,微軟開發的虛擬硬盤VHD/VHDX。VHD/VHDX格式是一種公開可用的映像格式規範,容許將硬盤封裝到單個文件中,以供操做系統做爲虛擬硬盤以物理硬盤的方式使用。這些虛擬硬盤可以託管本地文件系統(NTFS,FAT,exFAT和UDFS),同時支持標準硬盤和文件操做。VHD文件的最開始用於Windows7,Windows Server 2008,Virtual Server和Windows Virtual PC以及Hyper-V。隨後Citrix PVS也使用了VHD虛擬硬盤。隨着微軟Windows Server 2012的發佈以及新文件系統的開發,VHD格式須要適應這些變化。因而就在Windows Server 2012 中引入了一個新版本的 VHD 格式,稱爲 VHDX。新的VHDX支持最新的ReFS文件系統以及具備更大的存儲容量。它還在電源故障期間提供數據損壞保護而且優化動態硬盤和差別硬盤的結構對齊方式,以防止在新的大型扇區在物理硬盤上性能降級。後端
咱們今天來介紹下VHD/VHDX虛擬硬盤的相關技術:服務器
1、它是如何與操做系統通訊?cookie
2、VHD/VHDX虛擬硬盤的架構是什麼,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不一樣?網絡
VHD/VHDX咱們能夠說她是一個映像文件,也能夠說是一個虛擬硬盤。由於她們自己對於文件系統,表示的是一個映像文件,對於硬盤系統,表示的是一個硬盤。所以微軟的VHD/VHDX虛擬硬盤咱們能夠給出一個定義是:使用一個映像文件來模擬物理硬盤而且存儲數據。數據結構
在咱們的操做系統裏面,文件系統會識別VHD/VHDX映像文件爲.vhd或.vhdx的文件。而後操做系統裏面集成或安裝的虛擬硬盤驅動系統經過加載VHD/VHDX映像文件操做,把映像文件虛擬成一個本地硬盤分區,像正常的物理分區同樣進行讀寫操做。而卸載虛擬硬盤以後,該虛擬硬盤分區消失,惟一留下的就是映像文件。虛擬硬盤消失以後,系統就沒法訪問其中的文件,也不能對虛擬硬盤內存儲的文件進行任何操做。架構
那麼Citrix PVS架構下,Windows操做系統若是來識別和管理VHX/VHDX虛擬硬盤呢?ide
咱們先來講VHD:函數
在Windows中對於VHD虛擬硬盤是經過VHDAPI來管理、掛載和建立的。其架構圖以下所示:性能
在圖中,基於用戶模式下,經過VDS的Windows VHD API咱們能夠來管理、掛載、建立和銷燬VHD虛擬硬盤。VDS就是Virtual Disk Service,中文簡稱虛擬磁盤服務,是一種Microsoft Windows服務,可根據最終用戶,腳本和應用程序的請求執行查詢和配置操做。該服務經過如下方式擴展Windows Server操做系統的現有存儲功能:測試
爲Windows中現有的卷和磁盤管理功能提供API。其中就包含對於VHD虛擬硬盤功能提供相應API。
在單個API下統一卷管理和硬件冗餘獨立磁盤陣列(RAID)管理。
可是VDS不執行如下存儲管理功能:
硬件子系統管理,如溫度監控或磁盤陣列性能統計的監控。
存儲區域網絡(SAN)架構管理,例如基於主機的適配器(HBA)鏈接的存儲分區。
爲了進一步瞭解應用程序或者操做系統如何來調用VDS提供的VHD API,咱們來看一下VDS的架構。
VDS定義三個接口:應用層和服務之間的單個接口,以及數據層中的服務和提供商程序之間的兩個接口。下圖顯示了VDS的架構:
N層架構使得VDS可以與文件系統功能協調,同步提供程序活動和在應用程序之間進行仲裁。在應用和提供者之間,VDS嚮應用提供統一的功能,即便一些底層提供者可能缺少這樣的一致性。
該服務實現了經常使用功能:格式化卷,添加和刪除驅動器盤符或掛載文件夾,以及管理未分配的磁盤(沒有分區信息的磁盤)。VDS還會向已註冊的應用程序返回事件通知。
也就是說,在Citrix PVS架構下,PVS控制檯能夠經過調用Windows的VDS的VHD API來管理存儲於PVS物理硬盤上的VHD虛擬硬盤。
咱們說操做系統經過調用存儲系統的VDS VHD API來實現對於VHD虛擬硬盤的管理操做,可是具體的VHD API函數則存儲於也是位於用戶模式下VirtDisk.dll裏面,該DLL是VHD管理API的通用庫。
以上的兩個組件是位於用戶模式下的組件,是能夠供開發者進行開發自定義的模塊。而位於內核模式的驅動程序,則不易被修改。在內核模式下,有三個組件:
VDrvRoot.sys :根虛擬驅動器枚舉。
FsDepends.sys :嵌套卷依賴關係管理。
Vhdmp.sys :VHD解析器和依賴屬性提供程序。
用戶模式下VirtDisk.dll經過向下調用內核模式下的這三個驅動程序實現真正的VHD映像文件操做。
這三個驅動是虛擬設備驅動,把一個映像文件虛擬成一個磁盤設備,對虛擬設備直接進行操做;同時它們又是一個過濾驅動,它修改IRP流【應用程序的各類操做經過內核的I/O管理器轉變爲各類IRP請求。虛擬磁盤驅動相應文件系統驅動程序的IRP對虛擬磁盤進行相應的讀寫操做。】,使IRP在傳遞過程當中兩次通過文件系統。把對文件的位置請求,通過處理,指定到真實的磁盤位置,並把命令和數據傳遞下去。因爲虛擬磁盤驅動主要在內核態修改IRP流,因此用戶態的讀寫流程保持不變,而內核態的IRP流要兩次通過文件系統:第一次通過文件系統是操做虛擬磁盤內的文件,第二次通過文件系統是操做映像文件。
說完VHD,咱們來介紹VHDX:
VHDX格式因爲是在WindowsServer 2012中才會被支持,而Windows Server2012對於存儲功能的管理相較與2008是有所區別的。好比說在2008中不支持的硬件子系統管理,如溫度監控或磁盤陣列性能統計的監控以及存儲區域網絡(SAN)架構管理,例如基於主機的適配器(HBA)鏈接的存儲分區。在Windows Server 2012中均受到支持。咱們能夠這樣理解,Wind我是 Server 2008就是一個標準的操做系統,而Windows Server 2012便是一個標準的操做系統又是一款存儲操做系統。什麼是存儲操做系統呢?就和傳統的存儲控制器同樣,其運行於存儲控制器中,具備管理NAS和SAN功能的操做系統。即咱們能夠將Windows Server 2012安裝到服務器中,並將該服務器當作存儲控制器使用。
在Windows Server 2012中,Windows Storage Management API取取代了VDS(Virtual Disk Service)的角色和位置。也就是說在Windows Server 2012以及R2中,對於VHDX虛擬硬盤的管理是經過WindowsStorage Management API來進行的。CitrixPVS控制檯經過調用WindowsStorage Management API來最終進行VHDX文件的管理。具體的讀寫流程和VHD是同樣的,只是相對應的服務有所區別而已。
一個傳統的物理硬盤拋開物理組成部分的話,物理組成部分無非就是:接口、Buffer、主控芯片、RAM、電機(SSD就是Flash顆粒)。剩下的就是一個地址序列,這個序列從0~n-1,每一個地址包含512B(字節)的控件。通常咱們將這些地址稱做邏輯塊地址(LBA),每塊由512B組成。分區表的做用是:告訴系統,磁盤的分區有幾個,開始位置和結束位置。磁盤分區表格式目前主要有兩種MBR分區表和GUID分區表(GPT)。
VHD/VHDX虛擬硬盤是沒有所謂的物理組成部分的,所以VHD/VHDX虛擬硬盤的架構其實就表現爲是一個地址序列。
一樣,咱們先來講說VHD:
在微軟的VHD 文件格式規範中【http://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc】,虛擬硬盤VHD文件格式有三種類型:
固定虛擬硬盤:VHD映像文件在存儲上預分配爲所請求的最大大小。固定虛擬硬盤是用相同容量的VHD 文件模擬一樣容量的一個虛擬硬盤,固定虛擬硬盤的VHD 文件在建立時,已分配了所有的空間,肯定了大小,不隨着數據的寫入而改變。
可擴展方式:也稱爲「動態」和「可動態擴展」方式,VHD映像文件僅使用存儲上足夠空間來存儲虛擬磁盤當前包含的實際數據。建立此類型的虛擬磁盤時,VHD API不會根據請求的最大大小測試物理磁盤上的可用空間,所以能夠成功建立最大大小大於可用物理磁盤空間的動態虛擬磁盤空間。值得注意的是,VHD動態虛擬磁盤的最大大小爲2,040GB。
差別方式:這種方式是創建在母盤(固定、動態或差分VHD)上的快照,必須有一個基本的VHD虛擬硬盤做爲父虛擬磁盤,不能獨立存在。在父虛擬磁盤之上建立差別磁盤以後,任何後續寫入都寫入到差別VHD映像文件中,而且不會修改父VHD映像文件。並且,差別磁盤能夠在差別磁盤之上再創建差別磁盤。這也就是CitrixPVS多版本管理的技術。
上述的三種,每一種類型都有着本身的文件格式。
VHD虛擬硬盤的固定虛擬硬盤的格式:
固定虛擬硬盤的VHD 格式分爲兩個結構:數據區域和頁腳區域。數據區域結構和虛擬硬盤相同,即數據區的扇區與虛擬硬盤的扇區順序映射。頁腳結構是全部類型的VHD 文件共有的結構,位於文件的尾部,佔據一個扇區的大小(512B字節)。整個文件的大小是設定的VHD虛擬硬盤大小加上頁腳大小(一個扇區),即VHD虛擬硬盤的真實大小是咱們設置的值(好比40GB)加上一個扇區的大小(512B字節)。 固定虛擬硬盤所支持的硬盤大小受到操做系統的限制。例如,在FAT32文件系統上,虛擬硬盤的最大大小爲4 GB。
而固定虛擬硬盤的VHD虛擬硬盤頁腳區域裏面有什麼呢?根據VHD文件格式的規範文檔說明,該頁腳格式是全部的VHD類型都共享的格式,也就是該頁腳區域的格式是通用的。其頁腳區域規定:
硬盤頁腳字段 |
大小(字節) |
Cookie(標識) |
8 |
Features(特性) |
4 |
File Format Version(文件格式版本) |
4 |
Data Offset(數據偏移量) |
8 |
Time Stamp(時間戳) |
4 |
Creator Application(應用程序建立者) |
4 |
Creator Version(建立者版本) |
4 |
Creator Host OS(建立者系統) |
4 |
Original Size(原始長度) |
8 |
Current Size(當前長度) |
8 |
Disk Geometry(磁盤參數) |
4 |
Disk Type(磁盤類型) |
4 |
Checksum(校驗和) |
4 |
Unique Id(惟一ID) |
16 |
Saved State(保存狀態) |
1 |
Reserved(保留) |
427 |
其完整格式以下所示:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
|
標識 |
特性 |
文件格式版本 |
數據偏移量 |
|||||||||||||||||||||
時間戳 |
應用程序建立者 |
建立者版本 |
建立者系統 |
原始長度 |
||||||||||||||||||||
當前長度 |
磁盤參數 |
磁盤類型 |
校驗和 |
惟一ID |
||||||||||||||||||||
惟一ID |
存態 |
保留 |
||||||||||||||||||||||
保留(427字節) |
||||||||||||||||||||||||
從圖上能夠看出,頁腳結構共有512 字節,其定義了VHD 文件標誌、類型、容量等相關信息。下面介紹頁腳區域各個字段的意義。
(1)Cookie標識佔8 字節。Cookie用於標識硬盤映像的原始惟一建立者。值區分大小寫。固定虛擬硬盤的值是「conectix」字符串。cookie存儲爲8個字符的ASCII字符串,其中「c」在第一個字節,「o」在第二個字節,依此類推。
(2)特性佔4 字節。這個字段說明該文件支持的特定功能,經常使用特性有:無、臨時、保留。無特性代表該文件沒有嵌入特定功能;特性爲臨時,代表這是一個臨時的VHD 文件,當關機時會被刪除;保留特性下,這一位的值必須置爲1。
功能 |
值 |
未啓用任何功能 |
0x00000000 |
臨時 |
0x00000001 |
保留 |
0x00000002 |
(3)文件格式版本佔4 字節。代表VHD 的版本信息。此字段分爲主要/次要版本,並與建立文件時使用的規範的版本相匹配。最高有效的兩個字節用於主要版本。最低有效兩個字節是次要版本。這必須與文件格式規範匹配。對於當前規範,此字段必須初始化爲0x00010000。
(4)數據偏移量佔8字節。該字段保存從文件開頭到下一個結構的絕對字節偏移量。此字段用於動態磁盤和差別磁盤,但不用於固定磁盤。對於固定磁盤,此字段應設置爲0xFFFFFFFF。
(5)時間戳佔4字節。此字段存儲硬盤映像的建立時間。這是從UTC/ GMT時區2000年1月1日12:00:00:00開始計時以來的秒數。
(6)應用程序建立者佔4字節。此字段用於記錄哪一個應用程序建立了硬盤。該字段是一個左對齊的文本字段。它使用單字節字符集。若是硬盤由Microsoft Virtual PC建立,則在此字段中寫入「vpc」。若是硬盤映像由MicrosoftVirtual Server建立,則在此字段中寫入「vs」。其餘應用程序應使用本身的惟一標識符。每一個應用程序在Windwos中都會有一個本身惟一的標識符。
(7)建立者版本佔4字節。此字段保存建立硬盤映像的應用程序的主要/次要版本。
(8)建立者系統佔4字節。此字段存儲在其上建立此磁盤映像的主機操做系統的類型。
(9)原始長度佔8字節。此字段存儲建立時從虛擬機的角度來看的硬盤大小(以字節爲單位)。此字段用於信息目的。
(10)當前長度佔8字節。此字段從虛擬機的角度存儲硬盤的當前大小(以字節爲單位)。在固定虛擬硬盤格式下,此值與建立硬盤時的原始大小相同。在動態方式下,此值可根據硬盤是否擴展而更改。
(11)硬盤參數佔4字節。此字段存儲硬盤的磁道,磁頭和每磁道的扇區值。
磁盤參數字段 |
大小(字節) |
Cylinder |
2 |
Heads |
1 |
Sectors per track/cylinder |
1 |
當硬盤被配置爲ATA硬盤時,ATA控制器使用CHS值(即,磁道,磁頭,每磁道的扇區)來肯定磁盤的大小。當用戶建立具備必定大小的硬盤時,虛擬機中的硬盤映像的大小小於用戶建立的硬盤映像的大小。這是由於從硬盤大小計算的CHS值向下取整。
(12)磁盤類型佔4字節。
磁盤類型字段 |
值 |
無 |
0 |
Reserved (deprecated) |
1 |
Fixed hard disk |
2 |
Dynamic hard disk |
3 |
Differencing hard disk |
4 |
Reserved (deprecated) |
5 |
Reserved (deprecated) |
6 |
(13)校驗和佔4字節。此字段只檢驗VHD 文件的頁腳區域,不包括數據部分。校驗和是由頁腳中除去校驗和字段的信息以後計算獲得的。若是校驗和出錯,則認定文件損壞。
(14)惟一ID佔16字節。每一塊硬盤都有一個惟一ID用於識別硬盤。該惟一的ID是一個128位的通用惟一標識符(UUID)。此字段用於將父硬盤映像與其差別硬盤映像進行關聯。
(15)已保存狀態佔1字節。此字段保存一個字節標誌,描述系統是否處於保存狀態。若是硬盤處於保存狀態,則該值設置爲1。沒法在保存狀態的硬盤上執行壓縮和擴展操做。
(16)保留佔427字節。此字段顧名思義的保留字段,用於從此可能的參數以及字段擴展,其存儲的數據所有是0。它的大小是427字節。
二、可擴展方式(動態)虛擬硬盤
因爲可擴展的VHD虛擬硬盤的動態性,所以不一樣於固定虛擬硬盤的VHD的格式。可擴展的VHD 大小隨着寫入的數據而動態變化。好比建立一個60GB的可擴展的VHD文件時,它的初始大小可能僅爲幾百MB,可是隨着後期數據的不斷寫入,可擴展的VHD文件逐漸增長,並最終達到60GB的最大值。這中間存儲的數據是隨機的,雜亂無章的。所以就必須得有一個相似於記錄本同樣的東西來記錄後來增長的這些數據是存儲於那個柱面的那個扇區上。
VHD可擴展的虛擬硬盤格式在規範文檔中表示以下:
邏輯結構圖表示以下:
由上圖可看出,一個擴展的VHD文件由頁腳備份區域、頭部區域、塊分配表、數據區和頁腳區域組成。頁腳備份區域是對頁腳區域的備份,位於文件的第0 扇區;頭部區域是1024字節的固定長度,位於文件的第1、2 扇區;塊分配表位於頭部區域以後,每一個條目佔4 字節,其隨着數據的增加而動態擴展扇區,不固定長度;數據區位於塊分配表以後,每一個數據塊包括扇區位圖和塊數據,分別爲512 字節和2 MB,一樣其隨着數據的增加而動態擴展扇區,不固定長度;頁腳區域是512字節,與固定虛擬硬盤VHD的頁腳區域是同樣的大小,只是其中關鍵值不一樣,其位於文件的最後一個扇區;
是對頁腳區域的備份,其數據和頁腳區域一摸同樣,所以瞭解了頁腳區域就行,頁腳區域在上述的固定虛擬硬盤中以及進行了詳細計介紹。
可擴展的VHD的頭部區域表示文件的概況,包括數據塊大小,塊分配表位置和數量,以及關於差分等重要信息。
在VHD格式規範文檔中,可擴展的VHD文件頭部的格式以下表所示:
可擴展磁盤頭部字段 |
大小(字節) |
Cookie(標識) |
8 |
Data Offset(數據偏移量) |
8 |
Table Offset(表偏移量) |
8 |
Header Version(頭部版本) |
4 |
Max Table Entries(最大表條目) |
4 |
Block Size(塊大小) |
4 |
Checksum(校驗和) |
4 |
Parent Unique ID(母盤惟一ID) |
16 |
Parent Time Stamp(母盤時間戳) |
4 |
Reserved(保留) |
4 |
Parent Unicode Name(母盤Unicode名稱) |
512 |
Parent Locator Entry 1(母盤定位器條目1) |
24 |
Parent Locator Entry 2(母盤定位器條目2) |
24 |
Parent Locator Entry 3(母盤定位器條目3) |
24 |
Parent Locator Entry 4(母盤定位器條目4) |
24 |
Parent Locator Entry 5(母盤定位器條目5) |
24 |
Parent Locator Entry 6(母盤定位器條目6) |
24 |
Parent Locator Entry 7(母盤定位器條目7) |
24 |
Parent Locator Entry 8(母盤定位器條目8) |
24 |
Reserved(保留) |
256 |
其邏輯結構以下圖所示:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
|
標識 |
數據偏移量 |
表偏移量 |
||||||||||||||||||||||
頭部版本 |
最大表條目 |
塊大小 |
校驗和 |
母盤惟一ID |
||||||||||||||||||||
母盤惟一ID |
母盤時間戳 |
保留 |
母盤Unicode名稱 |
|||||||||||||||||||||
母盤Unicode名稱(512B字節) |
||||||||||||||||||||||||
母盤定位器條目1 |
||||||||||||||||||||||||
………… |
||||||||||||||||||||||||
母盤定位器條目8 |
||||||||||||||||||||||||
保留(256B字節) |
||||||||||||||||||||||||
下面提供了可擴展VHD虛擬硬盤頭部字段的詳細說明。
(1)Cookie標識佔8字節。此字段保存值爲「cxsparse」。此字段標識頭部是否爲合法的頭部字段。
(2)數據偏移量佔8字節。此字段包含硬盤映像中下一個結構的絕對字節偏移量。目前未被現有任何所格式使用,默認設置爲0xFFFFFFFF。
(3)表偏移量佔8字節。此字段存儲文件中塊分配表(BAT)的絕對字節偏移量。因爲前兩個字段爲固定長度,所以塊分配表老是從0x600 處開始,字段固定爲0x600。
(4)頭部版本佔4字節。此字段用於存儲可擴展VHD虛擬硬盤頭部的版本。該字段分爲主/次版本。最低有效兩個字節表示次版本,最高有效兩個字節表示主版本。這必須與文件格式規範匹配。對於本規範,此字段必須初始化爲0x00010000。主版本將僅在標頭格式修改成再也不與產品的舊版本兼容時增長。
(5)最大表條目佔4字節。此字段保存BAT中存在的最大條目。這應該等於磁盤中的塊數(即磁盤大小除以塊大小)。
(6)塊大小佔4字節。該字段定義了塊的容量。塊是動態和差別硬盤的擴展單元。它以字節存儲。此大小不包括塊位圖的大小。它只是塊的數據部分的大小。每一個塊的扇區必須老是2的冪次方。默認值爲0x00200000(表示塊大小爲2 MB)。
(7)校驗和佔4字節。此字段持有動態頭部的基本校驗和。它是除去頭部字段以外其餘全部字段之和的一個補碼,和頁腳區域的校驗和計算是同樣的。若是校驗和驗證失敗,則會斷定文件已損壞。
(8)母盤惟一ID佔16字節。此字段用於區分硬盤。差別硬盤存儲母盤的128位UUID。可擴展的VHD 虛擬硬盤中這個字段置零。
(9)母盤時間戳佔4字節。此字段存儲母盤的修改時間戳。這是從時區UTC / GMT 2000年1月1日12:00:00:00開始計算以來的秒數。
(10)保留佔4字節。此字段置爲零。
(11)母盤Unicode名稱佔512字節。此字段包含母盤文件名的Unicode字符串(UTF-16)。
(12)母盤定位器條目佔192字節(8個條目,每一個條目24字節)。這些條目在存儲差別硬盤的母盤定位器的文件中存儲絕對字節偏移量。用來在不一樣平臺之間遷移VHD文件。此字段僅用於差別磁盤,對於動態磁盤設置爲零。
下表描述了每一個定位器條目內的字段。
母盤定位器表字段 |
大小(字節) |
Platform Code |
4 |
Platform Data Space |
4 |
Platform Data Length |
4 |
Reserved |
4 |
Platform Data Offset |
8 |
平臺代碼佔4字節。平臺代碼描述了哪一種平臺特定的格式用於文件定位器。對於Windows,文件定位器存儲爲路徑(例如,「c\disksp_w_picpaths\ParentDisk.vhd」)。在Macintosh系統上,文件定位器是包含「別名」的二進制大對象(blob)。母盤定位器表用於支持跨平臺移動硬盤映像。
一些當前的平臺代碼包括如下:
Platform Code |
Description |
None (0x0) |
|
Wi2r (0x57693272) |
[deprecated] |
Wi2k (0x5769326B) |
[deprecated] |
W2ru (0x57327275) |
Unicode pathname (UTF-16) on Windows relative to the differencing disk pathname. |
W2ku (0x57326B75) |
Absolute Unicode (UTF-16) pathname on Windows. |
Mac (0x4D616320) |
(Mac OS alias stored as a blob) |
MacX(0x4D616358) |
A file URL with UTF-8 encoding conforming to RFC 2396. |
平臺數據空間佔4字節。此字段存儲存儲母盤定位器所需的512字節扇區數。
平臺數據長度佔4字節。此字段存儲母盤定位器的實際長度(以字節爲單位)。
保留佔4字節。此字段必須設置爲零。
平臺數據偏移佔8字節。該字段存儲存儲平臺特定文件定位器數據的絕對文件偏移量(以字節爲單位)。
(13)保留佔256字節。初始化爲零。
塊分配表簡稱BAT,是可擴展VHD文件格式中一個重要的結構,存儲了虛擬硬盤到VHD文件的地址映射信息。它由可擴展虛擬硬盤頭部的「表偏移」字段指向。
BAT的大小是在建立硬盤期間計算的。BAT中的條目數是徹底展開時存儲磁盤內容所需的塊數。例如,使用2 MB塊的基本單位數據塊來存儲2GB數據,磁盤映像須要1024個BAT條目。 每一個條目都是4個字節長,那麼大小就爲4096個字節。,從塊分配表的第1個字節(0x600)開始,全部未使用的表條目都初始化爲0xFFFFFFFF。
BAT老是擴展到扇區邊界。 可擴展磁盤頭部中的「最大表條目」字段指示有多少條目有效。
BAT的條目存儲了虛擬硬盤的塊地址映射到VHD文件的絕對扇區偏移量,表示虛擬硬盤的塊中的數據存儲在VHD 文件中以該扇區開始的數據塊內。若是向虛擬硬盤的塊寫入數據,那對應的塊分配表的條目爲該塊在VHD文件分配空間;若是虛擬硬盤的塊沒有數據寫入,那對應的塊分配表條目就不分配空間。這保證了虛擬硬盤經過塊分配表的動態更新能夠隨時向VHD 文件寫入數據,也闡明瞭VHD文件容量的動態變化。
其具體的流程圖以下圖所示:
上圖中描述了虛擬硬盤的數據塊到VHD文件的數據塊的映射關係。塊分配表的條目與虛擬硬盤塊的數目是保持一致的,且硬盤的第n個塊對應塊分配表的條目n,也就是一一對應的關係,這樣的好處是方便的進行讀取的時候按順序查找所存儲的數據在哪一個數據塊上。但VHD文件的數據區的數據塊的順序不與此對應。圖中,塊分配表的條目0爲虛擬硬盤的第0塊分配到VHD文件中以某扇區開始的第1塊,即寫入虛擬硬盤第0 塊的數據會存儲在VHD 文件的某扇區第1塊數據塊區域,這裏的某扇區便是VHD文件存儲在真實硬盤上的扇區。所以咱們就能夠理順VHD虛擬硬盤快分配表的工做模式了:
1)、數據寫入到虛擬硬盤數據塊。數據首先寫入到VHD虛擬硬盤的數據塊中;
2)、記錄塊分配表。而後根據其數據塊寫入的對應塊分配表,記錄相應的虛擬硬盤數據塊到VHD文件的數據區域的數據塊的地址映射信息。
數據塊由扇區位圖和數據組成。對於VHD可擴展硬盤,扇區位圖指示了哪些扇區包含有效數據(值爲1),以及哪些扇區未被使用(值爲0)。對於差別硬盤,扇區位圖指示哪些扇區位於差別磁盤(值爲1)內,哪些扇區位於母盤(值爲0)中。位圖總計有512字節即一個扇區大小。
塊是扇區倍數的乘方。默認狀況下,塊的大小爲4096個512字節扇區(2 MB)。虛擬硬盤的全部塊必須具備相同的大小。此大小在可擴展虛擬硬盤頭部的「塊大小」字段中定義。
位圖中的相應位爲零的塊中的全部扇區必須在虛擬硬盤上包含512字節的零。訪問磁盤映像的軟件能夠利用該假設來提升性能。
虛擬硬盤的塊經塊分配表分配空間後,指向數據塊中的扇區位圖,經過查看扇區位圖的每一位,確認塊數據區的使用狀況,而後進行對數據的操做。
明白了上述的基本知識以後,咱們來講說如何實現可擴展的虛擬硬盤?
首先,數據塊按需分配。建立可擴展的虛擬硬盤時,最初不爲其分配數據塊。新建立的映像僅包含前面描述的數據結構(包括可擴展的虛擬硬盤頭部和塊分配表BAT)。
當數據寫入映像時,可擴展的虛擬硬盤將爲寫入的數據擴展一個個新的數據塊。而後BAT被一一對應進行更新,以包含在映像內分配的每一個新數據塊的偏移量。
VHD有一個計算公式可讓虛擬硬盤知道其將虛擬硬盤的數據塊中的扇區映射到VHD映像文件塊中的那個扇區。
要從引用的扇區號計算塊號,該公式以下所示:
BlockNumber = floor(RawSectorNumber / SectorsPerBlock)
SectorInBlock = RawSectorNumber%SectorsPerBlock
BlockNumber用做BAT的索引。 BAT條目包含塊位圖開始的絕對扇區偏移,後面跟塊的數據。如下公式可用於計算數據的位置:
ActualSectorLocation = BAT[BlockNumber] + BlockBitmapSectorCount + SectorInBlock
以這種方式,能夠以任何順序分配塊,同時保持其經過BAT的排序找到數據。
當新分配一個數據塊時,頁腳區域必須被推回到文件的末尾。