PVS架構之VHD虛擬磁盤

Citrix PVS架構和產品中,位於最後端的存儲硬盤採用的是虛擬化時代,微軟開發的虛擬硬盤VHD/VHDXVHD/VHDX格式是一種公開可用的映像格式規範,允許將硬盤封裝到單個文件中,以供操作系統作爲虛擬硬盤以物理硬盤的方式使用。這些虛擬硬盤能夠託管本地文件系統(NTFSFATexFATUDFS),同時支持標準硬盤和文件操作。VHD文件的最開始用於Windows7Windows Server 2008Virtual ServerWindows Virtual PC以及Hyper-V。隨後Citrix PVS也使用了VHD虛擬硬盤。隨着微軟Windows Server 2012的發佈以及新文件系統的開發,VHD格式需要適應這些變化。於是就在Windows Server 2012 中引入了一個新版本的 VHD 格式,稱爲 VHDX。新的VHDX支持最新的ReFS文件系統以及具有更大的存儲容量。它還在電源故障期間提供數據損壞保護並且優化動態硬盤和差異硬盤的結構對齊方式,以防止在新的大型扇區在物理硬盤上性能降級。

我們今天來介紹下VHD/VHDX虛擬硬盤的相關技術:

1、它是如何與操作系統通信?

2VHD/VHDX虛擬硬盤的架構是什麼,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不同?


 

一、VHD/VHDX虛擬硬盤如何與操作系統通信?



VHD/VHDX我們可以說她是一個映像文件,也可以說是一個虛擬硬盤。因爲她們本身對於文件系統,表示的是一個映像文件,對於硬盤系統,表示的是一個硬盤。因此微軟的VHD/VHDX虛擬硬盤我們可以給出一個定義是:使用一個映像文件來模擬物理硬盤並且存儲數據。

在我們的操作系統裏面,文件系統會識別VHD/VHDX映像文件爲.vhd.vhdx的文件。然後操作系統裏面集成或安裝的虛擬硬盤驅動系統通過加載VHD/VHDX映像文件操作,把映像文件虛擬成一個本地硬盤分區,像正常的物理分區一樣進行讀寫操作。而卸載虛擬硬盤之後,該虛擬硬盤分區消失,唯一留下的就是映像文件。虛擬硬盤消失之後,系統就無法訪問其中的文件,也不能對虛擬硬盤內存儲的文件進行任何操作。

那麼Citrix PVS架構下,Windows操作系統如果來識別和管理VHX/VHDX虛擬硬盤呢?

我們先來說VHD

Windows中對於VHD虛擬硬盤是通過VHDAPI來管理、掛載和創建的。其架構圖如下所示:

0?wx_fmt=png

 

基於VDSVHD APIs

在圖中,基於用戶模式下,通過VDSWindows 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的架構:

0?wx_fmt=png

N層架構使得VDS能夠與文件系統功能協調,同步提供程序活動和在應用程序之間進行仲裁。在應用和提供者之間,VDS嚮應用提供統一的功能,即使一些底層提供者可能缺乏這樣的一致性。

該服務實現了常用功能:格式化卷,添加和刪除驅動器盤符或掛載文件夾,以及管理未分配的磁盤(沒有分區信息的磁盤)。VDS還會向已註冊的應用程序返回事件通知。

也就是說,在Citrix PVS架構下,PVS控制檯可以通過調用WindowsVDSVHD API來管理存儲於PVS物理硬盤上的VHD虛擬硬盤。

VirtDisk.dll組件

我們說操作系統通過調用存儲系統的VDS VHD API來實現對於VHD虛擬硬盤的管理操作,但是具體的VHD API函數則存儲於也是位於用戶模式下VirtDisk.dll裏面,該DLLVHD管理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即是一個標準的操作系統又是一款存儲操作系統。什麼是存儲操作系統呢?就和傳統的存儲控制器一樣,其運行於存儲控制器中,具有管理NASSAN功能的操作系統。即我們可以將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是一樣的,只是相對應的服務有所區別而已。


 

二、VHD/VHDX虛擬硬盤的架構是什麼,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不同?



一個傳統的物理硬盤拋開物理組成部分的話,物理組成部分無非就是:接口、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多版本管理的技術。

上述的三種,每一種類型都有着自己的文件格式。


1、固定虛擬硬盤



VHD虛擬硬盤的固定虛擬硬盤的格式:

0?wx_fmt=png

固定虛擬硬盤的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 文件標誌、類型、容量等相關信息。下面介紹頁腳區域各個字段的意義。

1Cookie標識佔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時區20001112: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)唯一ID16字節。每一塊硬盤都有一個唯一ID用於識別硬盤。該唯一的ID是一個128位的通用唯一標識符(UUID)。此字段用於將父硬盤映像與其差異硬盤映像進行關聯。

15)已保存狀態佔1字節。此字段保存一個字節標誌,描述系統是否處於保存狀態。如果硬盤處於保存狀態,則該值設置爲1。無法在保存狀態的硬盤上執行壓縮和擴展操作。

16)保留佔427字節。此字段顧名思義的保留字段,用於今後可能的參數以及字段擴展,其存儲的數據全部是0。它的大小是427字節。


2、可擴展方式(動態)虛擬硬盤



由於可擴展的VHD虛擬硬盤的動態性,因此不同於固定虛擬硬盤的VHD的格式。可擴展的VHD 大小隨着寫入的數據而動態變化。比如創建一個60GB的可擴展的VHD文件時,它的初始大小可能僅爲幾百MB,但是隨着後期數據的不斷寫入,可擴展的VHD文件逐漸增加,並最終達到60GB的最大值。這中間存儲的數據是隨機的,雜亂無章的。因此就必須得有一個類似於記錄本一樣的東西來記錄後來增加的這些數據是存儲於那個柱面的那個扇區上。

VHD可擴展的虛擬硬盤格式在規範文檔中表示如下:

0?wx_fmt=png

邏輯結構圖表示如下:

0?wx_fmt=png

由上圖可看出,一個擴展的VHD文件由頁腳備份區域、頭部區域、塊分配表、數據區和頁腳區域組成。頁腳備份區域是對頁腳區域的備份,位於文件的第0 扇區;頭部區域是1024字節的固定長度,位於文件的第12 扇區;塊分配表位於頭部區域之後,每個條目佔4 字節,其隨着數據的增長而動態擴展扇區,不固定長度;數據區位於塊分配表之後,每個數據塊包括扇區位圖和塊數據,分別爲512 字節和2 MB,同樣其隨着數據的增長而動態擴展扇區,不固定長度;頁腳區域是512字節,與固定虛擬硬盤VHD的頁腳區域是一樣的大小,只是其中關鍵值不同,其位於文件的最後一個扇區;


1、頁腳備份區域


是對頁腳區域的備份,其數據和頁腳區域一摸一樣,因此瞭解了頁腳區域就行,頁腳區域在上述的固定虛擬硬盤中以及進行了詳細計介紹。


2、頭部區域


可擴展的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虛擬硬盤頭部字段的詳細說明。

1Cookie標識佔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)母盤唯一ID16字節。此字段用於區分硬盤。差異硬盤存儲母盤的128UUID。可擴展的VHD 虛擬硬盤中這個字段置零。

9)母盤時間戳佔4字節。此字段存儲母盤的修改時間戳。這是從時區UTC / GMT 20001112: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字節。初始化爲零。

 

3、塊分配表


塊分配表簡稱BAT,是可擴展VHD文件格式中一個重要的結構,存儲了虛擬硬盤到VHD文件的地址映射信息。它由可擴展虛擬硬盤頭部的“表偏移”字段指向。

BAT的大小是在創建硬盤期間計算的。BAT中的條目數是完全展開時存儲磁盤內容所需的塊數。例如,使用2 MB塊的基本單位數據塊來存儲2GB數據,磁盤映像需要1024BAT條目。 每個條目都是4個字節長,那麼大小就爲4096個字節。,從塊分配表的第1個字節(0x600)開始,所有未使用的表條目都初始化爲0xFFFFFFFF

BAT總是擴展到扇區邊界。 可擴展磁盤頭部中的“最大表條目”字段指示有多少條目有效。

BAT的條目存儲了虛擬硬盤的塊地址映射到VHD文件的絕對扇區偏移量,表示虛擬硬盤的塊中的數據存儲在VHD 文件中以該扇區開始的數據塊內。如果向虛擬硬盤的塊寫入數據,那對應的塊分配表的條目爲該塊在VHD文件分配空間;如果虛擬硬盤的塊沒有數據寫入,那對應的塊分配表條目就不分配空間。這保證了虛擬硬盤通過塊分配表的動態更新可以隨時向VHD 文件寫入數據,也闡明瞭VHD文件容量的動態變化。

其具體的流程圖如下圖所示:

0?wx_fmt=png

上圖中描述了虛擬硬盤的數據塊到VHD文件的數據塊的映射關係。塊分配表的條目與虛擬硬盤塊的數目是保持一致的,且硬盤的第n個塊對應塊分配表的條目n,也就是一一對應的關係,這樣的好處是方便的進行讀取的時候按順序查找所存儲的數據在哪個數據塊上。但VHD文件的數據區的數據塊的順序不與此對應。圖中,塊分配表的條目0爲虛擬硬盤的第0塊分配到VHD文件中以某扇區開始的第1塊,即寫入虛擬硬盤第0 塊的數據會存儲在VHD 文件的某扇區第1塊數據塊區域,這裏的某扇區即是VHD文件存儲在真實硬盤上的扇區。因此我們就可以理順VHD虛擬硬盤快分配表的工作模式了:

1)、數據寫入到虛擬硬盤數據塊。數據首先寫入到VHD虛擬硬盤的數據塊中;

2)、記錄塊分配表。然後根據其數據塊寫入的對應塊分配表,記錄相應的虛擬硬盤數據塊到VHD文件的數據區域的數據塊的地址映射信息。


4、數據塊


數據塊由扇區位圖和數據組成。對於VHD可擴展硬盤,扇區位圖指示了哪些扇區包含有效數據(值爲1),以及哪些扇區未被使用(值爲0)。對於差異硬盤,扇區位圖指示哪些扇區位於差異磁盤(值爲1)內,哪些扇區位於母盤(值爲0)中。位圖總計有512字節即一個扇區大小。

0?wx_fmt=png

塊是扇區倍數的乘方。默認情況下,塊的大小爲4096512字節扇區(2 MB)。虛擬硬盤的所有塊必須具有相同的大小。此大小在可擴展虛擬硬盤頭部的“塊大小”字段中定義。

位圖中的相應位爲零的塊中的所有扇區必須在虛擬硬盤上包含512字節的零。訪問磁盤映像的軟件可以利用該假設來提高性能。

虛擬硬盤的塊經塊分配表分配空間後,指向數據塊中的扇區位圖,通過查看扇區位圖的每一位,確認塊數據區的使用情況,然後進行對數據的操作。

明白了上述的基本知識之後,我們來說說如何實現可擴展的虛擬硬盤?

首先,數據塊按需分配。創建可擴展的虛擬硬盤時,最初不爲其分配數據塊。新創建的映像僅包含前面描述的數據結構(包括可擴展的虛擬硬盤頭部和塊分配表BAT)。

當數據寫入映像時,可擴展的虛擬硬盤將爲寫入的數據擴展一個個新的數據塊。然後BAT被一一對應進行更新,以包含在映像內分配的每個新數據塊的偏移量。

VHD有一個計算公式可以讓虛擬硬盤知道其將虛擬硬盤的數據塊中的扇區映射到VHD映像文件塊中的那個扇區。

要從引用的扇區號計算塊號,該公式如下所示:

BlockNumber = floorRawSectorNumber / SectorsPerBlock

SectorInBlock = RawSectorNumberSectorsPerBlock

BlockNumber用作BAT的索引。 BAT條目包含塊位圖開始的絕對扇區偏移,後面跟塊的數據。以下公式可用於計算數據的位置:

ActualSectorLocation = BAT[BlockNumber] + BlockBitmapSectorCount + SectorInBlock

以這種方式,可以以任何順序分配塊,同時保持其通過BAT的排序找到數據。

 

5、頁腳區域


當新分配一個數據塊時,頁腳區域必須被推回到文件的末尾。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章