您好,登錄后才能下訂單哦!
在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、它是如何與操作系統通信?
2、VHD/VHDX虛擬硬盤的架構是什么,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不同?
VHD/VHDX我們可以說她是一個映像文件,也可以說是一個虛擬硬盤。因為她們本身對于文件系統,表示的是一個映像文件,對于硬盤系統,表示的是一個硬盤。因此微軟的VHD/VHDX虛擬硬盤我們可以給出一個定義是:使用一個映像文件來模擬物理硬盤并且存儲數據。
在我們的操作系統里面,文件系統會識別VHD/VHDX映像文件為.vhd或.vhdx的文件。然后操作系統里面集成或安裝的虛擬硬盤驅動系統通過加載VHD/VHDX映像文件操作,把映像文件虛擬成一個本地硬盤分區,像正常的物理分區一樣進行讀寫操作。而卸載虛擬硬盤之后,該虛擬硬盤分區消失,唯一留下的就是映像文件。虛擬硬盤消失之后,系統就無法訪問其中的文件,也不能對虛擬硬盤內存儲的文件進行任何操作。
那么Citrix PVS架構下,Windows操作系統如果來識別和管理VHX/VHDX虛擬硬盤呢?
我們先來說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字節。
2、可擴展方式(動態)虛擬硬盤
由于可擴展的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的排序找到數據。
當新分配一個數據塊時,頁腳區域必須被推回到文件的末尾。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。