溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PVS架構(gòu)之VHD虛擬磁盤

發(fā)布時(shí)間:2020-07-26 12:54:42 來源:網(wǎng)絡(luò) 閱讀:3160 作者:tasnrh 欄目:系統(tǒng)運(yùn)維

Citrix PVS架構(gòu)和產(chǎn)品中,位于最后端的存儲(chǔ)硬盤采用的是虛擬化時(shí)代,微軟開發(fā)的虛擬硬盤VHD/VHDX。VHD/VHDX格式是一種公開可用的映像格式規(guī)范,允許將硬盤封裝到單個(gè)文件中,以供操作系統(tǒng)作為虛擬硬盤以物理硬盤的方式使用。這些虛擬硬盤能夠托管本地文件系統(tǒng)(NTFS,FATexFATUDFS),同時(shí)支持標(biāo)準(zhǔn)硬盤和文件操作。VHD文件的最開始用于Windows7,Windows Server 2008Virtual ServerWindows Virtual PC以及Hyper-V。隨后Citrix PVS也使用了VHD虛擬硬盤。隨著微軟Windows Server 2012的發(fā)布以及新文件系統(tǒng)的開發(fā),VHD格式需要適應(yīng)這些變化。于是就在Windows Server 2012 中引入了一個(gè)新版本的 VHD 格式,稱為 VHDX。新的VHDX支持最新的ReFS文件系統(tǒng)以及具有更大的存儲(chǔ)容量。它還在電源故障期間提供數(shù)據(jù)損壞保護(hù)并且優(yōu)化動(dòng)態(tài)硬盤和差異硬盤的結(jié)構(gòu)對(duì)齊方式,以防止在新的大型扇區(qū)在物理硬盤上性能降級(jí)。

我們今天來介紹下VHD/VHDX虛擬硬盤的相關(guān)技術(shù):

1、它是如何與操作系統(tǒng)通信?

2、VHD/VHDX虛擬硬盤的架構(gòu)是什么,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不同?


 

一、VHD/VHDX虛擬硬盤如何與操作系統(tǒng)通信?



VHD/VHDX我們可以說她是一個(gè)映像文件,也可以說是一個(gè)虛擬硬盤。因?yàn)樗齻儽旧韺?duì)于文件系統(tǒng),表示的是一個(gè)映像文件,對(duì)于硬盤系統(tǒng),表示的是一個(gè)硬盤。因此微軟的VHD/VHDX虛擬硬盤我們可以給出一個(gè)定義是:使用一個(gè)映像文件來模擬物理硬盤并且存儲(chǔ)數(shù)據(jù)。

在我們的操作系統(tǒng)里面,文件系統(tǒng)會(huì)識(shí)別VHD/VHDX映像文件為.vhd.vhdx的文件。然后操作系統(tǒng)里面集成或安裝的虛擬硬盤驅(qū)動(dòng)系統(tǒng)通過加載VHD/VHDX映像文件操作,把映像文件虛擬成一個(gè)本地硬盤分區(qū),像正常的物理分區(qū)一樣進(jìn)行讀寫操作。而卸載虛擬硬盤之后,該虛擬硬盤分區(qū)消失,唯一留下的就是映像文件。虛擬硬盤消失之后,系統(tǒng)就無法訪問其中的文件,也不能對(duì)虛擬硬盤內(nèi)存儲(chǔ)的文件進(jìn)行任何操作。

那么Citrix PVS架構(gòu)下,Windows操作系統(tǒng)如果來識(shí)別和管理VHX/VHDX虛擬硬盤呢?

我們先來說VHD

Windows中對(duì)于VHD虛擬硬盤是通過VHDAPI來管理、掛載和創(chuàng)建的。其架構(gòu)圖如下所示:

PVS架構(gòu)之VHD虛擬磁盤

 

基于VDSVHD APIs

在圖中,基于用戶模式下,通過VDSWindows VHD API我們可以來管理、掛載、創(chuàng)建和銷毀VHD虛擬硬盤。VDS就是Virtual Disk Service,中文簡稱虛擬磁盤服務(wù),是一種Microsoft Windows服務(wù),可根據(jù)最終用戶,腳本和應(yīng)用程序的請(qǐng)求執(zhí)行查詢和配置操作。該服務(wù)通過以下方式擴(kuò)展Windows Server操作系統(tǒng)的現(xiàn)有存儲(chǔ)功能:

  • Windows中現(xiàn)有的卷和磁盤管理功能提供API。其中就包含對(duì)于VHD虛擬硬盤功能提供相應(yīng)API。

  • 在單個(gè)API下統(tǒng)一卷管理和硬件冗余獨(dú)立磁盤陣列(RAID)管理。

但是VDS不執(zhí)行以下存儲(chǔ)管理功能:

  • 硬件子系統(tǒng)管理,如溫度監(jiān)控或磁盤陣列性能統(tǒng)計(jì)的監(jiān)控。

  • 存儲(chǔ)區(qū)域網(wǎng)絡(luò)(SAN)架構(gòu)管理,例如基于主機(jī)的適配器(HBA)連接的存儲(chǔ)分區(qū)。

為了進(jìn)一步了解應(yīng)用程序或者操作系統(tǒng)如何來調(diào)用VDS提供的VHD API,我們來看一下VDS的架構(gòu)。

VDS定義三個(gè)接口:應(yīng)用層和服務(wù)之間的單個(gè)接口,以及數(shù)據(jù)層中的服務(wù)和提供商程序之間的兩個(gè)接口。下圖顯示了VDS的架構(gòu):

PVS架構(gòu)之VHD虛擬磁盤

N層架構(gòu)使得VDS能夠與文件系統(tǒng)功能協(xié)調(diào),同步提供程序活動(dòng)和在應(yīng)用程序之間進(jìn)行仲裁。在應(yīng)用和提供者之間,VDS向應(yīng)用提供統(tǒng)一的功能,即使一些底層提供者可能缺乏這樣的一致性。

該服務(wù)實(shí)現(xiàn)了常用功能:格式化卷,添加和刪除驅(qū)動(dòng)器盤符或掛載文件夾,以及管理未分配的磁盤(沒有分區(qū)信息的磁盤)。VDS還會(huì)向已注冊(cè)的應(yīng)用程序返回事件通知。

也就是說,在Citrix PVS架構(gòu)下,PVS控制臺(tái)可以通過調(diào)用WindowsVDSVHD API來管理存儲(chǔ)于PVS物理硬盤上的VHD虛擬硬盤。

VirtDisk.dll組件

我們說操作系統(tǒng)通過調(diào)用存儲(chǔ)系統(tǒng)的VDS VHD API來實(shí)現(xiàn)對(duì)于VHD虛擬硬盤的管理操作,但是具體的VHD API函數(shù)則存儲(chǔ)于也是位于用戶模式下VirtDisk.dll里面,該DLLVHD管理API的通用庫。

內(nèi)核模式驅(qū)動(dòng)程序

以上的兩個(gè)組件是位于用戶模式下的組件,是可以供開發(fā)者進(jìn)行開發(fā)自定義的模塊。而位于內(nèi)核模式的驅(qū)動(dòng)程序,則不易被修改。在內(nèi)核模式下,有三個(gè)組件:

  • VDrvRoot.sys :根虛擬驅(qū)動(dòng)器枚舉。

  • FsDepends.sys :嵌套卷依賴關(guān)系管理。

  • Vhdmp.sys VHD解析器和依賴屬性提供程序。

用戶模式下VirtDisk.dll通過向下調(diào)用內(nèi)核模式下的這三個(gè)驅(qū)動(dòng)程序?qū)崿F(xiàn)真正的VHD映像文件操作。

這三個(gè)驅(qū)動(dòng)是虛擬設(shè)備驅(qū)動(dòng),把一個(gè)映像文件虛擬成一個(gè)磁盤設(shè)備,對(duì)虛擬設(shè)備直接進(jìn)行操作;同時(shí)它們又是一個(gè)過濾驅(qū)動(dòng),它修改IRP流【應(yīng)用程序的各種操作通過內(nèi)核的I/O管理器轉(zhuǎn)變?yōu)楦鞣NIRP請(qǐng)求。虛擬磁盤驅(qū)動(dòng)相應(yīng)文件系統(tǒng)驅(qū)動(dòng)程序的IRP對(duì)虛擬磁盤進(jìn)行相應(yīng)的讀寫操作?!?,使IRP在傳遞過程中兩次經(jīng)過文件系統(tǒng)。把對(duì)文件的位置請(qǐng)求,經(jīng)過處理,指定到真實(shí)的磁盤位置,并把命令和數(shù)據(jù)傳遞下去。由于虛擬磁盤驅(qū)動(dòng)主要在內(nèi)核態(tài)修改IRP流,所以用戶態(tài)的讀寫流程保持不變,而內(nèi)核態(tài)的IRP流要兩次經(jīng)過文件系統(tǒng):第一次經(jīng)過文件系統(tǒng)是操作虛擬磁盤內(nèi)的文件,第二次經(jīng)過文件系統(tǒng)是操作映像文件。

 

說完VHD,我們來介紹VHDX

VHDX格式由于是在WindowsServer 2012中才會(huì)被支持,而Windows Server2012對(duì)于存儲(chǔ)功能的管理相較與2008是有所區(qū)別的。比如說在2008中不支持的硬件子系統(tǒng)管理,如溫度監(jiān)控或磁盤陣列性能統(tǒng)計(jì)的監(jiān)控以及存儲(chǔ)區(qū)域網(wǎng)絡(luò)(SAN)架構(gòu)管理,例如基于主機(jī)的適配器(HBA)連接的存儲(chǔ)分區(qū)。在Windows Server 2012中均受到支持。我們可以這樣理解,Wind我是 Server 2008就是一個(gè)標(biāo)準(zhǔn)的操作系統(tǒng),而Windows Server 2012即是一個(gè)標(biāo)準(zhǔn)的操作系統(tǒng)又是一款存儲(chǔ)操作系統(tǒng)。什么是存儲(chǔ)操作系統(tǒng)呢?就和傳統(tǒng)的存儲(chǔ)控制器一樣,其運(yùn)行于存儲(chǔ)控制器中,具有管理NASSAN功能的操作系統(tǒng)。即我們可以將Windows Server 2012安裝到服務(wù)器中,并將該服務(wù)器當(dāng)做存儲(chǔ)控制器使用。

Windows Server 2012中,Windows Storage Management API取取代了VDS(Virtual Disk Service)的角色和位置。也就是說在Windows Server 2012以及R2中,對(duì)于VHDX虛擬硬盤的管理是通過WindowsStorage Management API來進(jìn)行的。CitrixPVS控制臺(tái)通過調(diào)用WindowsStorage Management API來最終進(jìn)行VHDX文件的管理。具體的讀寫流程和VHD是一樣的,只是相對(duì)應(yīng)的服務(wù)有所區(qū)別而已。


 

二、VHD/VHDX虛擬硬盤的架構(gòu)是什么,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不同?



一個(gè)傳統(tǒng)的物理硬盤拋開物理組成部分的話,物理組成部分無非就是:接口、Buffer、主控芯片、RAM、電機(jī)(SSD就是Flash顆粒)。剩下的就是一個(gè)地址序列,這個(gè)序列從0~n-1,每個(gè)地址包含512B(字節(jié))的控件。一般我們將這些地址稱作邏輯塊地址(LBA),每塊由512B組成。分區(qū)表的作用是:告訴系統(tǒng),磁盤的分區(qū)有幾個(gè),開始位置和結(jié)束位置。磁盤分區(qū)表格式目前主要有兩種MBR分區(qū)表和GUID分區(qū)表(GPT)。

VHD/VHDX虛擬硬盤是沒有所謂的物理組成部分的,因此VHD/VHDX虛擬硬盤的架構(gòu)其實(shí)就表現(xiàn)為是一個(gè)地址序列。

同樣,我們先來說說VHD

在微軟的VHD 文件格式規(guī)范中【http://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc】,虛擬硬盤VHD文件格式有三種類型:

  • 固定虛擬硬盤:VHD映像文件在存儲(chǔ)上預(yù)分配為所請(qǐng)求的最大大小。固定虛擬硬盤是用相同容量的VHD 文件模擬同樣容量的一個(gè)虛擬硬盤,固定虛擬硬盤的VHD 文件在創(chuàng)建時(shí),已分配了全部的空間,確定了大小,不隨著數(shù)據(jù)的寫入而改變。

  • 可擴(kuò)展方式:也稱為“動(dòng)態(tài)”和“可動(dòng)態(tài)擴(kuò)展”方式,VHD映像文件僅使用存儲(chǔ)上足夠空間來存儲(chǔ)虛擬磁盤當(dāng)前包含的實(shí)際數(shù)據(jù)。創(chuàng)建此類型的虛擬磁盤時(shí),VHD API不會(huì)根據(jù)請(qǐng)求的最大大小測(cè)試物理磁盤上的可用空間,因此可以成功創(chuàng)建最大大小大于可用物理磁盤空間的動(dòng)態(tài)虛擬磁盤空間。值得注意的是,VHD動(dòng)態(tài)虛擬磁盤的最大大小為2,040GB。

  • 差異方式:這種方式是建立在母盤(固定、動(dòng)態(tài)或差分VHD)上的快照,必須有一個(gè)基本的VHD虛擬硬盤作為父虛擬磁盤,不能獨(dú)立存在。在父虛擬磁盤之上創(chuàng)建差異磁盤之后,任何后續(xù)寫入都寫入到差異VHD映像文件中,并且不會(huì)修改父VHD映像文件。而且,差異磁盤可以在差異磁盤之上再建立差異磁盤。這也就是CitrixPVS多版本管理的技術(shù)。

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


1、固定虛擬硬盤



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

PVS架構(gòu)之VHD虛擬磁盤

固定虛擬硬盤的VHD 格式分為兩個(gè)結(jié)構(gòu):數(shù)據(jù)區(qū)域和頁腳區(qū)域。數(shù)據(jù)區(qū)域結(jié)構(gòu)和虛擬硬盤相同,即數(shù)據(jù)區(qū)的扇區(qū)與虛擬硬盤的扇區(qū)順序映射。頁腳結(jié)構(gòu)是所有類型的VHD 文件共有的結(jié)構(gòu),位于文件的尾部,占據(jù)一個(gè)扇區(qū)的大小(512B字節(jié))。整個(gè)文件的大小是設(shè)定的VHD虛擬硬盤大小加上頁腳大?。ㄒ粋€(gè)扇區(qū)),即VHD虛擬硬盤的真實(shí)大小是我們?cè)O(shè)置的值(比如40GB)加上一個(gè)扇區(qū)的大?。?/span>512B字節(jié))。 固定虛擬硬盤所支持的硬盤大小受到操作系統(tǒng)的限制。例如,在FAT32文件系統(tǒng)上,虛擬硬盤的最大大小為4 GB。

而固定虛擬硬盤的VHD虛擬硬盤頁腳區(qū)域里面有什么呢?根據(jù)VHD文件格式的規(guī)范文檔說明,該頁腳格式是所有的VHD類型都共享的格式,也就是該頁腳區(qū)域的格式是通用的。其頁腳區(qū)域規(guī)定:

硬盤頁腳字段

大?。ㄗ止?jié))

Cookie(標(biāo)識(shí))

8

Features(特性)

4

File Format Version(文件格式版本)

4

Data Offset(數(shù)據(jù)偏移量)

8

Time Stamp(時(shí)間戳)

4

Creator Application(應(yīng)用程序創(chuàng)建者)

4

Creator Version(創(chuàng)建者版本)

4

Creator Host OS(創(chuàng)建者系統(tǒng))

4

Original Size(原始長度)

8

Current Size(當(dāng)前長度)

8

Disk Geometry(磁盤參數(shù))

4

Disk Type(磁盤類型)

4

Checksum(校驗(yàn)和)

4

Unique Id(唯一ID)

16

Saved State(保存狀態(tài))

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


標(biāo)識(shí)

特性

文件格式版本

數(shù)據(jù)偏移量


時(shí)間戳

應(yīng)用程序創(chuàng)建者

創(chuàng)建者版本

創(chuàng)建者系統(tǒng)

原始長度


當(dāng)前長度

磁盤參數(shù)

磁盤類型

校驗(yàn)和

唯一ID


唯一ID

存態(tài)

保留


保留(427字節(jié))








從圖上可以看出,頁腳結(jié)構(gòu)共有512 字節(jié),其定義了VHD 文件標(biāo)志、類型、容量等相關(guān)信息。下面介紹頁腳區(qū)域各個(gè)字段的意義。

1Cookie標(biāo)識(shí)占8 字節(jié)。Cookie用于標(biāo)識(shí)硬盤映像的原始唯一創(chuàng)建者。值區(qū)分大小寫。固定虛擬硬盤的值是“conectix”字符串。cookie存儲(chǔ)為8個(gè)字符的ASCII字符串,其中“c”在第一個(gè)字節(jié),“o”在第二個(gè)字節(jié),依此類推。

2)特性占4 字節(jié)。這個(gè)字段說明該文件支持的特定功能,常用特性有:無、臨時(shí)、保留。無特性表明該文件沒有嵌入特定功能;特性為臨時(shí),表明這是一個(gè)臨時(shí)的VHD 文件,當(dāng)關(guān)機(jī)時(shí)會(huì)被刪除;保留特性下,這一位的值必須置為1。

功能

未啟用任何功能

0x00000000

臨時(shí)

0x00000001

保留

0x00000002

3)文件格式版本占4 字節(jié)。表明VHD 的版本信息。此字段分為主要/次要版本,并與創(chuàng)建文件時(shí)使用的規(guī)范的版本相匹配。最高有效的兩個(gè)字節(jié)用于主要版本。最低有效兩個(gè)字節(jié)是次要版本。這必須與文件格式規(guī)范匹配。對(duì)于當(dāng)前規(guī)范,此字段必須初始化為0x00010000。

4)數(shù)據(jù)偏移量占8字節(jié)。該字段保存從文件開頭到下一個(gè)結(jié)構(gòu)的絕對(duì)字節(jié)偏移量。此字段用于動(dòng)態(tài)磁盤和差異磁盤,但不用于固定磁盤。對(duì)于固定磁盤,此字段應(yīng)設(shè)置為0xFFFFFFFF。

5)時(shí)間戳占4字節(jié)。此字段存儲(chǔ)硬盤映像的創(chuàng)建時(shí)間。這是從UTC/ GMT時(shí)區(qū)20001112:00:00:00開始計(jì)時(shí)以來的秒數(shù)。

6)應(yīng)用程序創(chuàng)建者占4字節(jié)。此字段用于記錄哪個(gè)應(yīng)用程序創(chuàng)建了硬盤。該字段是一個(gè)左對(duì)齊的文本字段。它使用單字節(jié)字符集。如果硬盤由Microsoft Virtual PC創(chuàng)建,則在此字段中寫入“vpc”。如果硬盤映像由MicrosoftVirtual Server創(chuàng)建,則在此字段中寫入“vs”。其他應(yīng)用程序應(yīng)使用自己的唯一標(biāo)識(shí)符。每個(gè)應(yīng)用程序在Windwos中都會(huì)有一個(gè)自己唯一的標(biāo)識(shí)符。

7)創(chuàng)建者版本占4字節(jié)。此字段保存創(chuàng)建硬盤映像的應(yīng)用程序的主要/次要版本。

8)創(chuàng)建者系統(tǒng)占4字節(jié)。此字段存儲(chǔ)在其上創(chuàng)建此磁盤映像的主機(jī)操作系統(tǒng)的類型。

9)原始長度占8字節(jié)。此字段存儲(chǔ)創(chuàng)建時(shí)從虛擬機(jī)的角度來看的硬盤大?。ㄒ宰止?jié)為單位)。此字段用于信息目的。

10)當(dāng)前長度占8字節(jié)。此字段從虛擬機(jī)的角度存儲(chǔ)硬盤的當(dāng)前大?。ㄒ宰止?jié)為單位)。在固定虛擬硬盤格式下,此值與創(chuàng)建硬盤時(shí)的原始大小相同。在動(dòng)態(tài)方式下,此值可根據(jù)硬盤是否擴(kuò)展而更改。

11)硬盤參數(shù)占4字節(jié)。此字段存儲(chǔ)硬盤的磁道,磁頭和每磁道的扇區(qū)值。

磁盤參數(shù)字段

大?。ㄗ止?jié))

Cylinder

2

Heads

1

Sectors per track/cylinder

1

當(dāng)硬盤被配置為ATA硬盤時(shí),ATA控制器使用CHS值(即,磁道,磁頭,每磁道的扇區(qū))來確定磁盤的大小。當(dāng)用戶創(chuàng)建具有一定大小的硬盤時(shí),虛擬機(jī)中的硬盤映像的大小小于用戶創(chuàng)建的硬盤映像的大小。這是因?yàn)閺挠脖P大小計(jì)算的CHS值向下取整。

12)磁盤類型占4字節(jié)。

磁盤類型字段

0

Reserved (deprecated)

1

Fixed hard disk

2

Dynamic hard disk

3

Differencing hard disk

4

Reserved (deprecated)

5

Reserved (deprecated)

6

13)校驗(yàn)和占4字節(jié)。此字段只檢驗(yàn)VHD 文件的頁腳區(qū)域,不包括數(shù)據(jù)部分。校驗(yàn)和是由頁腳中除去校驗(yàn)和字段的信息之后計(jì)算得到的。如果校驗(yàn)和出錯(cuò),則認(rèn)定文件損壞。

14)唯一ID16字節(jié)。每一塊硬盤都有一個(gè)唯一ID用于識(shí)別硬盤。該唯一的ID是一個(gè)128位的通用唯一標(biāo)識(shí)符(UUID)。此字段用于將父硬盤映像與其差異硬盤映像進(jìn)行關(guān)聯(lián)。

15)已保存狀態(tài)占1字節(jié)。此字段保存一個(gè)字節(jié)標(biāo)志,描述系統(tǒng)是否處于保存狀態(tài)。如果硬盤處于保存狀態(tài),則該值設(shè)置為1。無法在保存狀態(tài)的硬盤上執(zhí)行壓縮和擴(kuò)展操作。

16)保留占427字節(jié)。此字段顧名思義的保留字段,用于今后可能的參數(shù)以及字段擴(kuò)展,其存儲(chǔ)的數(shù)據(jù)全部是0。它的大小是427字節(jié)。


2、可擴(kuò)展方式(動(dòng)態(tài))虛擬硬盤



由于可擴(kuò)展的VHD虛擬硬盤的動(dòng)態(tài)性,因此不同于固定虛擬硬盤的VHD的格式??蓴U(kuò)展的VHD 大小隨著寫入的數(shù)據(jù)而動(dòng)態(tài)變化。比如創(chuàng)建一個(gè)60GB的可擴(kuò)展的VHD文件時(shí),它的初始大小可能僅為幾百MB,但是隨著后期數(shù)據(jù)的不斷寫入,可擴(kuò)展的VHD文件逐漸增加,并最終達(dá)到60GB的最大值。這中間存儲(chǔ)的數(shù)據(jù)是隨機(jī)的,雜亂無章的。因此就必須得有一個(gè)類似于記錄本一樣的東西來記錄后來增加的這些數(shù)據(jù)是存儲(chǔ)于那個(gè)柱面的那個(gè)扇區(qū)上。

VHD可擴(kuò)展的虛擬硬盤格式在規(guī)范文檔中表示如下:

PVS架構(gòu)之VHD虛擬磁盤

邏輯結(jié)構(gòu)圖表示如下:

PVS架構(gòu)之VHD虛擬磁盤

由上圖可看出,一個(gè)擴(kuò)展的VHD文件由頁腳備份區(qū)域、頭部區(qū)域、塊分配表、數(shù)據(jù)區(qū)和頁腳區(qū)域組成。頁腳備份區(qū)域是對(duì)頁腳區(qū)域的備份,位于文件的第0 扇區(qū);頭部區(qū)域是1024字節(jié)的固定長度,位于文件的第12 扇區(qū);塊分配表位于頭部區(qū)域之后,每個(gè)條目占4 字節(jié),其隨著數(shù)據(jù)的增長而動(dòng)態(tài)擴(kuò)展扇區(qū),不固定長度;數(shù)據(jù)區(qū)位于塊分配表之后,每個(gè)數(shù)據(jù)塊包括扇區(qū)位圖和塊數(shù)據(jù),分別為512 字節(jié)和2 MB,同樣其隨著數(shù)據(jù)的增長而動(dòng)態(tài)擴(kuò)展扇區(qū),不固定長度;頁腳區(qū)域是512字節(jié),與固定虛擬硬盤VHD的頁腳區(qū)域是一樣的大小,只是其中關(guān)鍵值不同,其位于文件的最后一個(gè)扇區(qū);


1、頁腳備份區(qū)域


是對(duì)頁腳區(qū)域的備份,其數(shù)據(jù)和頁腳區(qū)域一摸一樣,因此了解了頁腳區(qū)域就行,頁腳區(qū)域在上述的固定虛擬硬盤中以及進(jìn)行了詳細(xì)計(jì)介紹。


2、頭部區(qū)域


可擴(kuò)展的VHD的頭部區(qū)域表示文件的概況,包括數(shù)據(jù)塊大小,塊分配表位置和數(shù)量,以及關(guān)于差分等重要信息。

VHD格式規(guī)范文檔中,可擴(kuò)展的VHD文件頭部的格式如下表所示:

可擴(kuò)展磁盤頭部字段

大?。ㄗ止?jié))

Cookie(標(biāo)識(shí))

8

Data Offset(數(shù)據(jù)偏移量)

8

Table Offset(表偏移量)

8

Header Version(頭部版本)

4

Max Table Entries(最大表?xiàng)l目)

4

Block Size(塊大小)

4

Checksum(校驗(yàn)和)

4

Parent Unique ID(母盤唯一ID)

16

Parent Time Stamp(母盤時(shí)間戳)

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

其邏輯結(jié)構(gòu)如下圖所示:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


標(biāo)識(shí)

數(shù)據(jù)偏移量

表偏移量


頭部版本

最大表?xiàng)l目

塊大小

校驗(yàn)和

母盤唯一ID


母盤唯一ID

母盤時(shí)間戳

保留

母盤Unicode名稱


母盤Unicode名稱(512B字節(jié))



母盤定位器條目1


…………


母盤定位器條目8


保留(256B字節(jié))




下面提供了可擴(kuò)展VHD虛擬硬盤頭部字段的詳細(xì)說明。

1Cookie標(biāo)識(shí)占8字節(jié)。此字段保存值為“cxsparse”。此字段標(biāo)識(shí)頭部是否為合法的頭部字段。

2)數(shù)據(jù)偏移量占8字節(jié)。此字段包含硬盤映像中下一個(gè)結(jié)構(gòu)的絕對(duì)字節(jié)偏移量。目前未被現(xiàn)有任何所格式使用,默認(rèn)設(shè)置為0xFFFFFFFF。

3)表偏移量占8字節(jié)。此字段存儲(chǔ)文件中塊分配表(BAT)的絕對(duì)字節(jié)偏移量。由于前兩個(gè)字段為固定長度,因此塊分配表總是從0x600 處開始,字段固定為0x600。

4)頭部版本占4字節(jié)。此字段用于存儲(chǔ)可擴(kuò)展VHD虛擬硬盤頭部的版本。該字段分為主/次版本。最低有效兩個(gè)字節(jié)表示次版本,最高有效兩個(gè)字節(jié)表示主版本。這必須與文件格式規(guī)范匹配。對(duì)于本規(guī)范,此字段必須初始化為0x00010000。主版本將僅在標(biāo)頭格式修改為不再與產(chǎn)品的舊版本兼容時(shí)增加。

5)最大表?xiàng)l目占4字節(jié)。此字段保存BAT中存在的最大條目。這應(yīng)該等于磁盤中的塊數(shù)(即磁盤大小除以塊大?。?。

6)塊大小占4字節(jié)。該字段定義了塊的容量。塊是動(dòng)態(tài)和差異硬盤的擴(kuò)展單元。它以字節(jié)存儲(chǔ)。此大小不包括塊位圖的大小。它只是塊的數(shù)據(jù)部分的大小。每個(gè)塊的扇區(qū)必須總是2的冪次方。默認(rèn)值為0x00200000(表示塊大小為2 MB)。

7)校驗(yàn)和占4字節(jié)。此字段持有動(dòng)態(tài)頭部的基本校驗(yàn)和。它是除去頭部字段之外其他所有字段之和的一個(gè)補(bǔ)碼,和頁腳區(qū)域的校驗(yàn)和計(jì)算是一樣的。如果校驗(yàn)和驗(yàn)證失敗,則會(huì)判定文件已損壞。

8)母盤唯一ID16字節(jié)。此字段用于區(qū)分硬盤。差異硬盤存儲(chǔ)母盤的128UUID??蓴U(kuò)展的VHD 虛擬硬盤中這個(gè)字段置零。

9)母盤時(shí)間戳占4字節(jié)。此字段存儲(chǔ)母盤的修改時(shí)間戳。這是從時(shí)區(qū)UTC / GMT 20001112:00:00:00開始計(jì)算以來的秒數(shù)。

10)保留占4字節(jié)。此字段置為零。

11)母盤Unicode名稱占512字節(jié)。此字段包含母盤文件名的Unicode字符串(UTF-16)。

12)母盤定位器條目占192字節(jié)(8個(gè)條目,每個(gè)條目24字節(jié))。這些條目在存儲(chǔ)差異硬盤的母盤定位器的文件中存儲(chǔ)絕對(duì)字節(jié)偏移量。用來在不同平臺(tái)之間遷移VHD文件。此字段僅用于差異磁盤,對(duì)于動(dòng)態(tài)磁盤設(shè)置為零。

下表描述了每個(gè)定位器條目內(nèi)的字段。

母盤定位器表字段

大?。ㄗ止?jié))

Platform Code

4

Platform Data Space

4

Platform Data Length

4

Reserved

4

Platform Data Offset

8

平臺(tái)代碼占4字節(jié)。平臺(tái)代碼描述了哪種平臺(tái)特定的格式用于文件定位器。對(duì)于Windows,文件定位器存儲(chǔ)為路徑(例如,“c\disksp_w_picpaths\ParentDisk.vhd”)。在Macintosh系統(tǒng)上,文件定位器是包含“別名”的二進(jìn)制大對(duì)象(blob)。母盤定位器表用于支持跨平臺(tái)移動(dòng)硬盤映像。

一些當(dāng)前的平臺(tái)代碼包括以下:

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.

平臺(tái)數(shù)據(jù)空間占4字節(jié)。此字段存儲(chǔ)存儲(chǔ)母盤定位器所需的512字節(jié)扇區(qū)數(shù)。

平臺(tái)數(shù)據(jù)長度占4字節(jié)。此字段存儲(chǔ)母盤定位器的實(shí)際長度(以字節(jié)為單位)。

保留占4字節(jié)。此字段必須設(shè)置為零。

平臺(tái)數(shù)據(jù)偏移占8字節(jié)。該字段存儲(chǔ)存儲(chǔ)平臺(tái)特定文件定位器數(shù)據(jù)的絕對(duì)文件偏移量(以字節(jié)為單位)。

13)保留占256字節(jié)。初始化為零。

 

3、塊分配表


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

BAT的大小是在創(chuàng)建硬盤期間計(jì)算的。BAT中的條目數(shù)是完全展開時(shí)存儲(chǔ)磁盤內(nèi)容所需的塊數(shù)。例如,使用2 MB塊的基本單位數(shù)據(jù)塊來存儲(chǔ)2GB數(shù)據(jù),磁盤映像需要1024個(gè)BAT條目。 每個(gè)條目都是4個(gè)字節(jié)長,那么大小就為4096個(gè)字節(jié)。,從塊分配表的第1個(gè)字節(jié)(0x600)開始,所有未使用的表?xiàng)l目都初始化為0xFFFFFFFF

BAT總是擴(kuò)展到扇區(qū)邊界。 可擴(kuò)展磁盤頭部中的“最大表?xiàng)l目”字段指示有多少條目有效。

BAT的條目存儲(chǔ)了虛擬硬盤的塊地址映射到VHD文件的絕對(duì)扇區(qū)偏移量,表示虛擬硬盤的塊中的數(shù)據(jù)存儲(chǔ)在VHD 文件中以該扇區(qū)開始的數(shù)據(jù)塊內(nèi)。如果向虛擬硬盤的塊寫入數(shù)據(jù),那對(duì)應(yīng)的塊分配表的條目為該塊在VHD文件分配空間;如果虛擬硬盤的塊沒有數(shù)據(jù)寫入,那對(duì)應(yīng)的塊分配表?xiàng)l目就不分配空間。這保證了虛擬硬盤通過塊分配表的動(dòng)態(tài)更新可以隨時(shí)向VHD 文件寫入數(shù)據(jù),也闡明了VHD文件容量的動(dòng)態(tài)變化。

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

PVS架構(gòu)之VHD虛擬磁盤

上圖中描述了虛擬硬盤的數(shù)據(jù)塊到VHD文件的數(shù)據(jù)塊的映射關(guān)系。塊分配表的條目與虛擬硬盤塊的數(shù)目是保持一致的,且硬盤的第n個(gè)塊對(duì)應(yīng)塊分配表的條目n,也就是一一對(duì)應(yīng)的關(guān)系,這樣的好處是方便的進(jìn)行讀取的時(shí)候按順序查找所存儲(chǔ)的數(shù)據(jù)在哪個(gè)數(shù)據(jù)塊上。但VHD文件的數(shù)據(jù)區(qū)的數(shù)據(jù)塊的順序不與此對(duì)應(yīng)。圖中,塊分配表的條目0為虛擬硬盤的第0塊分配到VHD文件中以某扇區(qū)開始的第1塊,即寫入虛擬硬盤第0 塊的數(shù)據(jù)會(huì)存儲(chǔ)在VHD 文件的某扇區(qū)第1塊數(shù)據(jù)塊區(qū)域,這里的某扇區(qū)即是VHD文件存儲(chǔ)在真實(shí)硬盤上的扇區(qū)。因此我們就可以理順VHD虛擬硬盤快分配表的工作模式了:

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

2)、記錄塊分配表。然后根據(jù)其數(shù)據(jù)塊寫入的對(duì)應(yīng)塊分配表,記錄相應(yīng)的虛擬硬盤數(shù)據(jù)塊到VHD文件的數(shù)據(jù)區(qū)域的數(shù)據(jù)塊的地址映射信息。


4、數(shù)據(jù)塊


數(shù)據(jù)塊由扇區(qū)位圖和數(shù)據(jù)組成。對(duì)于VHD可擴(kuò)展硬盤,扇區(qū)位圖指示了哪些扇區(qū)包含有效數(shù)據(jù)(值為1),以及哪些扇區(qū)未被使用(值為0)。對(duì)于差異硬盤,扇區(qū)位圖指示哪些扇區(qū)位于差異磁盤(值為1)內(nèi),哪些扇區(qū)位于母盤(值為0)中。位圖總計(jì)有512字節(jié)即一個(gè)扇區(qū)大小。

PVS架構(gòu)之VHD虛擬磁盤

塊是扇區(qū)倍數(shù)的乘方。默認(rèn)情況下,塊的大小為4096個(gè)512字節(jié)扇區(qū)(2 MB)。虛擬硬盤的所有塊必須具有相同的大小。此大小在可擴(kuò)展虛擬硬盤頭部的“塊大小”字段中定義。

位圖中的相應(yīng)位為零的塊中的所有扇區(qū)必須在虛擬硬盤上包含512字節(jié)的零。訪問磁盤映像的軟件可以利用該假設(shè)來提高性能。

虛擬硬盤的塊經(jīng)塊分配表分配空間后,指向數(shù)據(jù)塊中的扇區(qū)位圖,通過查看扇區(qū)位圖的每一位,確認(rèn)塊數(shù)據(jù)區(qū)的使用情況,然后進(jìn)行對(duì)數(shù)據(jù)的操作。

明白了上述的基本知識(shí)之后,我們來說說如何實(shí)現(xiàn)可擴(kuò)展的虛擬硬盤?

首先,數(shù)據(jù)塊按需分配。創(chuàng)建可擴(kuò)展的虛擬硬盤時(shí),最初不為其分配數(shù)據(jù)塊。新創(chuàng)建的映像僅包含前面描述的數(shù)據(jù)結(jié)構(gòu)(包括可擴(kuò)展的虛擬硬盤頭部和塊分配表BAT)。

當(dāng)數(shù)據(jù)寫入映像時(shí),可擴(kuò)展的虛擬硬盤將為寫入的數(shù)據(jù)擴(kuò)展一個(gè)個(gè)新的數(shù)據(jù)塊。然后BAT被一一對(duì)應(yīng)進(jìn)行更新,以包含在映像內(nèi)分配的每個(gè)新數(shù)據(jù)塊的偏移量。

VHD有一個(gè)計(jì)算公式可以讓虛擬硬盤知道其將虛擬硬盤的數(shù)據(jù)塊中的扇區(qū)映射到VHD映像文件塊中的那個(gè)扇區(qū)。

要從引用的扇區(qū)號(hào)計(jì)算塊號(hào),該公式如下所示:

BlockNumber = floorRawSectorNumber / SectorsPerBlock

SectorInBlock = RawSectorNumberSectorsPerBlock

BlockNumber用作BAT的索引。 BAT條目包含塊位圖開始的絕對(duì)扇區(qū)偏移,后面跟塊的數(shù)據(jù)。以下公式可用于計(jì)算數(shù)據(jù)的位置:

ActualSectorLocation = BAT[BlockNumber] + BlockBitmapSectorCount + SectorInBlock

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

 

5、頁腳區(qū)域


當(dāng)新分配一個(gè)數(shù)據(jù)塊時(shí),頁腳區(qū)域必須被推回到文件的末尾。

 

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI