在Citrix PVS架構(gòu)和產(chǎn)品中,位于最后端的存儲硬盤采用的是虛擬化時代,微軟開發(fā)的虛擬硬盤VHD/VHDX。VHD/VHDX格式是一種公開可用的映像格式規(guī)范,允許將硬盤封裝到單個文件中,以供操作系統(tǒng)作為虛擬硬盤以物理硬盤的方式使用。這些虛擬硬盤能夠托管本地文件系統(tǒng)(NTFS,F(xiàn)AT,exFAT和UDFS),同時支持標(biāo)準(zhǔn)硬盤和文件操作。VHD文件的最開始用于Windows7,Windows Server 2008,Virtual Server和Windows Virtual PC以及Hyper-V。隨后Citrix PVS也使用了VHD虛擬硬盤。隨著微軟Windows Server 2012的發(fā)布以及新文件系統(tǒng)的開發(fā),VHD格式需要適應(yīng)這些變化。于是就在Windows Server 2012 中引入了一個新版本的 VHD 格式,稱為 VHDX。新的VHDX支持最新的ReFS文件系統(tǒng)以及具有更大的存儲容量。它還在電源故障期間提供數(shù)據(jù)損壞保護(hù)并且優(yōu)化動態(tài)硬盤和差異硬盤的結(jié)構(gòu)對齊方式,以防止在新的大型扇區(qū)在物理硬盤上性能降級。
創(chuàng)新互聯(lián)技術(shù)團(tuán)隊10多年來致力于為客戶提供網(wǎng)站制作、做網(wǎng)站、成都品牌網(wǎng)站建設(shè)、成都全網(wǎng)營銷、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗豐富的技術(shù)團(tuán)隊,先后服務(wù)、推廣了千余家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。我們今天來介紹下VHD/VHDX虛擬硬盤的相關(guān)技術(shù):
1、它是如何與操作系統(tǒng)通信?
2、VHD/VHDX虛擬硬盤的架構(gòu)是什么,和物理的硬盤相比,VHD/VHDX虛擬硬盤有何不同?
VHD/VHDX我們可以說她是一個映像文件,也可以說是一個虛擬硬盤。因為她們本身對于文件系統(tǒng),表示的是一個映像文件,對于硬盤系統(tǒng),表示的是一個硬盤。因此微軟的VHD/VHDX虛擬硬盤我們可以給出一個定義是:使用一個映像文件來模擬物理硬盤并且存儲數(shù)據(jù)。
在我們的操作系統(tǒng)里面,文件系統(tǒng)會識別VHD/VHDX映像文件為.vhd或.vhdx的文件。然后操作系統(tǒng)里面集成或安裝的虛擬硬盤驅(qū)動系統(tǒng)通過加載VHD/VHDX映像文件操作,把映像文件虛擬成一個本地硬盤分區(qū),像正常的物理分區(qū)一樣進(jìn)行讀寫操作。而卸載虛擬硬盤之后,該虛擬硬盤分區(qū)消失,唯一留下的就是映像文件。虛擬硬盤消失之后,系統(tǒng)就無法訪問其中的文件,也不能對虛擬硬盤內(nèi)存儲的文件進(jìn)行任何操作。
那么Citrix PVS架構(gòu)下,Windows操作系統(tǒng)如果來識別和管理VHX/VHDX虛擬硬盤呢?
我們先來說VHD:
在Windows中對于VHD虛擬硬盤是通過VHDAPI來管理、掛載和創(chuàng)建的。其架構(gòu)圖如下所示:
在圖中,基于用戶模式下,通過VDS的Windows VHD API我們可以來管理、掛載、創(chuàng)建和銷毀VHD虛擬硬盤。VDS就是Virtual Disk Service,中文簡稱虛擬磁盤服務(wù),是一種Microsoft Windows服務(wù),可根據(jù)最終用戶,腳本和應(yīng)用程序的請求執(zhí)行查詢和配置操作。該服務(wù)通過以下方式擴(kuò)展Windows Server操作系統(tǒng)的現(xiàn)有存儲功能:
為Windows中現(xiàn)有的卷和磁盤管理功能提供API。其中就包含對于VHD虛擬硬盤功能提供相應(yīng)API。
在單個API下統(tǒng)一卷管理和硬件冗余獨(dú)立磁盤陣列(RAID)管理。
但是VDS不執(zhí)行以下存儲管理功能:
硬件子系統(tǒng)管理,如溫度監(jiān)控或磁盤陣列性能統(tǒng)計的監(jiān)控。
存儲區(qū)域網(wǎng)絡(luò)(SAN)架構(gòu)管理,例如基于主機(jī)的適配器(HBA)連接的存儲分區(qū)。
為了進(jìn)一步了解應(yīng)用程序或者操作系統(tǒng)如何來調(diào)用VDS提供的VHD API,我們來看一下VDS的架構(gòu)。
VDS定義三個接口:應(yīng)用層和服務(wù)之間的單個接口,以及數(shù)據(jù)層中的服務(wù)和提供商程序之間的兩個接口。下圖顯示了VDS的架構(gòu):
N層架構(gòu)使得VDS能夠與文件系統(tǒng)功能協(xié)調(diào),同步提供程序活動和在應(yīng)用程序之間進(jìn)行仲裁。在應(yīng)用和提供者之間,VDS向應(yīng)用提供統(tǒng)一的功能,即使一些底層提供者可能缺乏這樣的一致性。
該服務(wù)實現(xiàn)了常用功能:格式化卷,添加和刪除驅(qū)動器盤符或掛載文件夾,以及管理未分配的磁盤(沒有分區(qū)信息的磁盤)。VDS還會向已注冊的應(yīng)用程序返回事件通知。
也就是說,在Citrix PVS架構(gòu)下,PVS控制臺可以通過調(diào)用Windows的VDS的VHD API來管理存儲于PVS物理硬盤上的VHD虛擬硬盤。
我們說操作系統(tǒng)通過調(diào)用存儲系統(tǒng)的VDS VHD API來實現(xiàn)對于VHD虛擬硬盤的管理操作,但是具體的VHD API函數(shù)則存儲于也是位于用戶模式下VirtDisk.dll里面,該DLL是VHD管理API的通用庫。
以上的兩個組件是位于用戶模式下的組件,是可以供開發(fā)者進(jìn)行開發(fā)自定義的模塊。而位于內(nèi)核模式的驅(qū)動程序,則不易被修改。在內(nèi)核模式下,有三個組件:
VDrvRoot.sys :根虛擬驅(qū)動器枚舉。
FsDepends.sys :嵌套卷依賴關(guān)系管理。
Vhdmp.sys :VHD解析器和依賴屬性提供程序。
用戶模式下VirtDisk.dll通過向下調(diào)用內(nèi)核模式下的這三個驅(qū)動程序?qū)崿F(xiàn)真正的VHD映像文件操作。
這三個驅(qū)動是虛擬設(shè)備驅(qū)動,把一個映像文件虛擬成一個磁盤設(shè)備,對虛擬設(shè)備直接進(jìn)行操作;同時它們又是一個過濾驅(qū)動,它修改IRP流【應(yīng)用程序的各種操作通過內(nèi)核的I/O管理器轉(zhuǎn)變?yōu)楦鞣NIRP請求。虛擬磁盤驅(qū)動相應(yīng)文件系統(tǒng)驅(qū)動程序的IRP對虛擬磁盤進(jìn)行相應(yīng)的讀寫操作?!?,使IRP在傳遞過程中兩次經(jīng)過文件系統(tǒng)。把對文件的位置請求,經(jīng)過處理,指定到真實的磁盤位置,并把命令和數(shù)據(jù)傳遞下去。由于虛擬磁盤驅(qū)動主要在內(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中才會被支持,而Windows Server2012對于存儲功能的管理相較與2008是有所區(qū)別的。比如說在2008中不支持的硬件子系統(tǒng)管理,如溫度監(jiān)控或磁盤陣列性能統(tǒng)計的監(jiān)控以及存儲區(qū)域網(wǎng)絡(luò)(SAN)架構(gòu)管理,例如基于主機(jī)的適配器(HBA)連接的存儲分區(qū)。在Windows Server 2012中均受到支持。我們可以這樣理解,Wind我是 Server 2008就是一個標(biāo)準(zhǔn)的操作系統(tǒng),而Windows Server 2012即是一個標(biāo)準(zhǔn)的操作系統(tǒng)又是一款存儲操作系統(tǒng)。什么是存儲操作系統(tǒng)呢?就和傳統(tǒng)的存儲控制器一樣,其運(yùn)行于存儲控制器中,具有管理NAS和SAN功能的操作系統(tǒng)。即我們可以將Windows Server 2012安裝到服務(wù)器中,并將該服務(wù)器當(dāng)做存儲控制器使用。
在Windows Server 2012中,Windows Storage Management API取取代了VDS(Virtual Disk Service)的角色和位置。也就是說在Windows Server 2012以及R2中,對于VHDX虛擬硬盤的管理是通過WindowsStorage Management API來進(jìn)行的。CitrixPVS控制臺通過調(diào)用WindowsStorage Management API來最終進(jìn)行VHDX文件的管理。具體的讀寫流程和VHD是一樣的,只是相對應(yīng)的服務(wù)有所區(qū)別而已。
一個傳統(tǒng)的物理硬盤拋開物理組成部分的話,物理組成部分無非就是:接口、Buffer、主控芯片、RAM、電機(jī)(SSD就是Flash顆粒)。剩下的就是一個地址序列,這個序列從0~n-1,每個地址包含512B(字節(jié))的控件。一般我們將這些地址稱作邏輯塊地址(LBA),每塊由512B組成。分區(qū)表的作用是:告訴系統(tǒng),磁盤的分區(qū)有幾個,開始位置和結(jié)束位置。磁盤分區(qū)表格式目前主要有兩種MBR分區(qū)表和GUID分區(qū)表(GPT)。
VHD/VHDX虛擬硬盤是沒有所謂的物理組成部分的,因此VHD/VHDX虛擬硬盤的架構(gòu)其實就表現(xiàn)為是一個地址序列。
同樣,我們先來說說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映像文件在存儲上預(yù)分配為所請求的大大小。固定虛擬硬盤是用相同容量的VHD 文件模擬同樣容量的一個虛擬硬盤,固定虛擬硬盤的VHD 文件在創(chuàng)建時,已分配了全部的空間,確定了大小,不隨著數(shù)據(jù)的寫入而改變。
可擴(kuò)展方式:也稱為“動態(tài)”和“可動態(tài)擴(kuò)展”方式,VHD映像文件僅使用存儲上足夠空間來存儲虛擬磁盤當(dāng)前包含的實際數(shù)據(jù)。創(chuàng)建此類型的虛擬磁盤時,VHD API不會根據(jù)請求的大大小測試物理磁盤上的可用空間,因此可以成功創(chuàng)建大大小大于可用物理磁盤空間的動態(tài)虛擬磁盤空間。值得注意的是,VHD動態(tài)虛擬磁盤的大大小為2,040GB。
差異方式:這種方式是建立在母盤(固定、動態(tài)或差分VHD)上的快照,必須有一個基本的VHD虛擬硬盤作為父虛擬磁盤,不能獨(dú)立存在。在父虛擬磁盤之上創(chuàng)建差異磁盤之后,任何后續(xù)寫入都寫入到差異VHD映像文件中,并且不會修改父VHD映像文件。而且,差異磁盤可以在差異磁盤之上再建立差異磁盤。這也就是CitrixPVS多版本管理的技術(shù)。
上述的三種,每一種類型都有著自己的文件格式。
VHD虛擬硬盤的固定虛擬硬盤的格式:
固定虛擬硬盤的VHD 格式分為兩個結(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ù)一個扇區(qū)的大?。?12B字節(jié))。整個文件的大小是設(shè)定的VHD虛擬硬盤大小加上頁腳大?。ㄒ粋€扇區(qū)),即VHD虛擬硬盤的真實大小是我們設(shè)置的值(比如40GB)加上一個扇區(qū)的大小(512B字節(jié))。 固定虛擬硬盤所支持的硬盤大小受到操作系統(tǒng)的限制。例如,在FAT32文件系統(tǒng)上,虛擬硬盤的大大小為4 GB。
而固定虛擬硬盤的VHD虛擬硬盤頁腳區(qū)域里面有什么呢?根據(jù)VHD文件格式的規(guī)范文檔說明,該頁腳格式是所有的VHD類型都共享的格式,也就是該頁腳區(qū)域的格式是通用的。其頁腳區(qū)域規(guī)定:
硬盤頁腳字段 | 大小(字節(jié)) |
Cookie(標(biāo)識) | 8 |
Features(特性) | 4 |
File Format Version(文件格式版本) | 4 |
Data Offset(數(shù)據(jù)偏移量) | 8 |
Time Stamp(時間戳) | 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(校驗和) | 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ù)據(jù)偏移量 | |||||||||||||||||||||
時間戳 | 應(yīng)用程序創(chuàng)建者 | 創(chuàng)建者版本 | 創(chuàng)建者系統(tǒng) | 原始長度 | ||||||||||||||||||||
當(dāng)前長度 | 磁盤參數(shù) | 磁盤類型 | 校驗和 | 唯一ID | ||||||||||||||||||||
唯一ID | 存態(tài) | 保留 | ||||||||||||||||||||||
保留(427字節(jié)) | ||||||||||||||||||||||||
從圖上可以看出,頁腳結(jié)構(gòu)共有512 字節(jié),其定義了VHD 文件標(biāo)志、類型、容量等相關(guān)信息。下面介紹頁腳區(qū)域各個字段的意義。
(1)Cookie標(biāo)識占8 字節(jié)。Cookie用于標(biāo)識硬盤映像的原始唯一創(chuàng)建者。值區(qū)分大小寫。固定虛擬硬盤的值是“conectix”字符串。cookie存儲為8個字符的ASCII字符串,其中“c”在第一個字節(jié),“o”在第二個字節(jié),依此類推。
(2)特性占4 字節(jié)。這個字段說明該文件支持的特定功能,常用特性有:無、臨時、保留。無特性表明該文件沒有嵌入特定功能;特性為臨時,表明這是一個臨時的VHD 文件,當(dāng)關(guān)機(jī)時會被刪除;保留特性下,這一位的值必須置為1。
功能 | 值 |
未啟用任何功能 | 0x00000000 |
臨時 | 0x00000001 |
保留 | 0x00000002 |
(3)文件格式版本占4 字節(jié)。表明VHD 的版本信息。此字段分為主要/次要版本,并與創(chuàng)建文件時使用的規(guī)范的版本相匹配。最高有效的兩個字節(jié)用于主要版本。最低有效兩個字節(jié)是次要版本。這必須與文件格式規(guī)范匹配。對于當(dāng)前規(guī)范,此字段必須初始化為0x00010000。
(4)數(shù)據(jù)偏移量占8字節(jié)。該字段保存從文件開頭到下一個結(jié)構(gòu)的絕對字節(jié)偏移量。此字段用于動態(tài)磁盤和差異磁盤,但不用于固定磁盤。對于固定磁盤,此字段應(yīng)設(shè)置為0xFFFFFFFF。
(5)時間戳占4字節(jié)。此字段存儲硬盤映像的創(chuàng)建時間。這是從UTC/ GMT時區(qū)2000年1月1日12:00:00:00開始計時以來的秒數(shù)。
(6)應(yīng)用程序創(chuàng)建者占4字節(jié)。此字段用于記錄哪個應(yīng)用程序創(chuàng)建了硬盤。該字段是一個左對齊的文本字段。它使用單字節(jié)字符集。如果硬盤由Microsoft Virtual PC創(chuàng)建,則在此字段中寫入“vpc”。如果硬盤映像由MicrosoftVirtual Server創(chuàng)建,則在此字段中寫入“vs”。其他應(yīng)用程序應(yīng)使用自己的唯一標(biāo)識符。每個應(yīng)用程序在Windwos中都會有一個自己唯一的標(biāo)識符。
(7)創(chuàng)建者版本占4字節(jié)。此字段保存創(chuàng)建硬盤映像的應(yīng)用程序的主要/次要版本。
(8)創(chuàng)建者系統(tǒng)占4字節(jié)。此字段存儲在其上創(chuàng)建此磁盤映像的主機(jī)操作系統(tǒng)的類型。
(9)原始長度占8字節(jié)。此字段存儲創(chuàng)建時從虛擬機(jī)的角度來看的硬盤大?。ㄒ宰止?jié)為單位)。此字段用于信息目的。
(10)當(dāng)前長度占8字節(jié)。此字段從虛擬機(jī)的角度存儲硬盤的當(dāng)前大?。ㄒ宰止?jié)為單位)。在固定虛擬硬盤格式下,此值與創(chuàng)建硬盤時的原始大小相同。在動態(tài)方式下,此值可根據(jù)硬盤是否擴(kuò)展而更改。
(11)硬盤參數(shù)占4字節(jié)。此字段存儲硬盤的磁道,磁頭和每磁道的扇區(qū)值。
磁盤參數(shù)字段 | 大?。ㄗ止?jié)) |
Cylinder | 2 |
Heads | 1 |
Sectors per track/cylinder | 1 |
當(dāng)硬盤被配置為ATA硬盤時,ATA控制器使用CHS值(即,磁道,磁頭,每磁道的扇區(qū))來確定磁盤的大小。當(dāng)用戶創(chuàng)建具有一定大小的硬盤時,虛擬機(jī)中的硬盤映像的大小小于用戶創(chuàng)建的硬盤映像的大小。這是因為從硬盤大小計算的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)校驗和占4字節(jié)。此字段只檢驗VHD 文件的頁腳區(qū)域,不包括數(shù)據(jù)部分。校驗和是由頁腳中除去校驗和字段的信息之后計算得到的。如果校驗和出錯,則認(rèn)定文件損壞。
(14)唯一ID占16字節(jié)。每一塊硬盤都有一個唯一ID用于識別硬盤。該唯一的ID是一個128位的通用唯一標(biāo)識符(UUID)。此字段用于將父硬盤映像與其差異硬盤映像進(jìn)行關(guān)聯(lián)。
(15)已保存狀態(tài)占1字節(jié)。此字段保存一個字節(jié)標(biāo)志,描述系統(tǒng)是否處于保存狀態(tài)。如果硬盤處于保存狀態(tài),則該值設(shè)置為1。無法在保存狀態(tài)的硬盤上執(zhí)行壓縮和擴(kuò)展操作。
(16)保留占427字節(jié)。此字段顧名思義的保留字段,用于今后可能的參數(shù)以及字段擴(kuò)展,其存儲的數(shù)據(jù)全部是0。它的大小是427字節(jié)。
2、可擴(kuò)展方式(動態(tài))虛擬硬盤
由于可擴(kuò)展的VHD虛擬硬盤的動態(tài)性,因此不同于固定虛擬硬盤的VHD的格式??蓴U(kuò)展的VHD 大小隨著寫入的數(shù)據(jù)而動態(tài)變化。比如創(chuàng)建一個60GB的可擴(kuò)展的VHD文件時,它的初始大小可能僅為幾百M(fèi)B,但是隨著后期數(shù)據(jù)的不斷寫入,可擴(kuò)展的VHD文件逐漸增加,并最終達(dá)到60GB的大值。這中間存儲的數(shù)據(jù)是隨機(jī)的,雜亂無章的。因此就必須得有一個類似于記錄本一樣的東西來記錄后來增加的這些數(shù)據(jù)是存儲于那個柱面的那個扇區(qū)上。
VHD可擴(kuò)展的虛擬硬盤格式在規(guī)范文檔中表示如下:
邏輯結(jié)構(gòu)圖表示如下:
由上圖可看出,一個擴(kuò)展的VHD文件由頁腳備份區(qū)域、頭部區(qū)域、塊分配表、數(shù)據(jù)區(qū)和頁腳區(qū)域組成。頁腳備份區(qū)域是對頁腳區(qū)域的備份,位于文件的第0 扇區(qū);頭部區(qū)域是1024字節(jié)的固定長度,位于文件的第1、2 扇區(qū);塊分配表位于頭部區(qū)域之后,每個條目占4 字節(jié),其隨著數(shù)據(jù)的增長而動態(tài)擴(kuò)展扇區(qū),不固定長度;數(shù)據(jù)區(qū)位于塊分配表之后,每個數(shù)據(jù)塊包括扇區(qū)位圖和塊數(shù)據(jù),分別為512 字節(jié)和2 MB,同樣其隨著數(shù)據(jù)的增長而動態(tài)擴(kuò)展扇區(qū),不固定長度;頁腳區(qū)域是512字節(jié),與固定虛擬硬盤VHD的頁腳區(qū)域是一樣的大小,只是其中關(guān)鍵值不同,其位于文件的最后一個扇區(qū);
是對頁腳區(qū)域的備份,其數(shù)據(jù)和頁腳區(qū)域一摸一樣,因此了解了頁腳區(qū)域就行,頁腳區(qū)域在上述的固定虛擬硬盤中以及進(jìn)行了詳細(xì)計介紹。
可擴(kuò)展的VHD的頭部區(qū)域表示文件的概況,包括數(shù)據(jù)塊大小,塊分配表位置和數(shù)量,以及關(guān)于差分等重要信息。
在VHD格式規(guī)范文檔中,可擴(kuò)展的VHD文件頭部的格式如下表所示:
可擴(kuò)展磁盤頭部字段 | 大?。ㄗ止?jié)) |
Cookie(標(biāo)識) | 8 |
Data Offset(數(shù)據(jù)偏移量) | 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 |
其邏輯結(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ù)據(jù)偏移量 | 表偏移量 | ||||||||||||||||||||||
頭部版本 | 大表條目 | 塊大小 | 校驗和 | 母盤唯一ID | ||||||||||||||||||||
母盤唯一ID | 母盤時間戳 | 保留 | 母盤Unicode名稱 | |||||||||||||||||||||
母盤Unicode名稱(512B字節(jié)) | ||||||||||||||||||||||||
母盤定位器條目1 | ||||||||||||||||||||||||
………… | ||||||||||||||||||||||||
母盤定位器條目8 | ||||||||||||||||||||||||
保留(256B字節(jié)) | ||||||||||||||||||||||||
下面提供了可擴(kuò)展VHD虛擬硬盤頭部字段的詳細(xì)說明。
(1)Cookie標(biāo)識占8字節(jié)。此字段保存值為“cxsparse”。此字段標(biāo)識頭部是否為合法的頭部字段。
(2)數(shù)據(jù)偏移量占8字節(jié)。此字段包含硬盤映像中下一個結(jié)構(gòu)的絕對字節(jié)偏移量。目前未被現(xiàn)有任何所格式使用,默認(rèn)設(shè)置為0xFFFFFFFF。
(3)表偏移量占8字節(jié)。此字段存儲文件中塊分配表(BAT)的絕對字節(jié)偏移量。由于前兩個字段為固定長度,因此塊分配表總是從0x600 處開始,字段固定為0x600。
(4)頭部版本占4字節(jié)。此字段用于存儲可擴(kuò)展VHD虛擬硬盤頭部的版本。該字段分為主/次版本。最低有效兩個字節(jié)表示次版本,最高有效兩個字節(jié)表示主版本。這必須與文件格式規(guī)范匹配。對于本規(guī)范,此字段必須初始化為0x00010000。主版本將僅在標(biāo)頭格式修改為不再與產(chǎn)品的舊版本兼容時增加。
(5)大表條目占4字節(jié)。此字段保存BAT中存在的大條目。這應(yīng)該等于磁盤中的塊數(shù)(即磁盤大小除以塊大?。?。
(6)塊大小占4字節(jié)。該字段定義了塊的容量。塊是動態(tài)和差異硬盤的擴(kuò)展單元。它以字節(jié)存儲。此大小不包括塊位圖的大小。它只是塊的數(shù)據(jù)部分的大小。每個塊的扇區(qū)必須總是2的冪次方。默認(rèn)值為0x00200000(表示塊大小為2 MB)。
(7)校驗和占4字節(jié)。此字段持有動態(tài)頭部的基本校驗和。它是除去頭部字段之外其他所有字段之和的一個補(bǔ)碼,和頁腳區(qū)域的校驗和計算是一樣的。如果校驗和驗證失敗,則會判定文件已損壞。
(8)母盤唯一ID占16字節(jié)。此字段用于區(qū)分硬盤。差異硬盤存儲母盤的128位UUID??蓴U(kuò)展的VHD 虛擬硬盤中這個字段置零。
(9)母盤時間戳占4字節(jié)。此字段存儲母盤的修改時間戳。這是從時區(qū)UTC / GMT 2000年1月1日12:00:00:00開始計算以來的秒數(shù)。
(10)保留占4字節(jié)。此字段置為零。
(11)母盤Unicode名稱占512字節(jié)。此字段包含母盤文件名的Unicode字符串(UTF-16)。
(12)母盤定位器條目占192字節(jié)(8個條目,每個條目24字節(jié))。這些條目在存儲差異硬盤的母盤定位器的文件中存儲絕對字節(jié)偏移量。用來在不同平臺之間遷移VHD文件。此字段僅用于差異磁盤,對于動態(tài)磁盤設(shè)置為零。
下表描述了每個定位器條目內(nèi)的字段。
母盤定位器表字段 | 大小(字節(jié)) |
Platform Code | 4 |
Platform Data Space | 4 |
Platform Data Length | 4 |
Reserved | 4 |
Platform Data Offset | 8 |
平臺代碼占4字節(jié)。平臺代碼描述了哪種平臺特定的格式用于文件定位器。對于Windows,文件定位器存儲為路徑(例如,“c\disksp_w_picpaths\ParentDisk.vhd”)。在Macintosh系統(tǒng)上,文件定位器是包含“別名”的二進(jìn)制大對象(blob)。母盤定位器表用于支持跨平臺移動硬盤映像。
一些當(dāng)前的平臺代碼包括以下:
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. |
平臺數(shù)據(jù)空間占4字節(jié)。此字段存儲存儲母盤定位器所需的512字節(jié)扇區(qū)數(shù)。
平臺數(shù)據(jù)長度占4字節(jié)。此字段存儲母盤定位器的實際長度(以字節(jié)為單位)。
保留占4字節(jié)。此字段必須設(shè)置為零。
平臺數(shù)據(jù)偏移占8字節(jié)。該字段存儲存儲平臺特定文件定位器數(shù)據(jù)的絕對文件偏移量(以字節(jié)為單位)。
(13)保留占256字節(jié)。初始化為零。
塊分配表簡稱BAT,是可擴(kuò)展VHD文件格式中一個重要的結(jié)構(gòu),存儲了虛擬硬盤到VHD文件的地址映射信息。它由可擴(kuò)展虛擬硬盤頭部的“表偏移”字段指向。
BAT的大小是在創(chuàng)建硬盤期間計算的。BAT中的條目數(shù)是完全展開時存儲磁盤內(nèi)容所需的塊數(shù)。例如,使用2 MB塊的基本單位數(shù)據(jù)塊來存儲2GB數(shù)據(jù),磁盤映像需要1024個BAT條目。 每個條目都是4個字節(jié)長,那么大小就為4096個字節(jié)。,從塊分配表的第1個字節(jié)(0x600)開始,所有未使用的表條目都初始化為0xFFFFFFFF。
BAT總是擴(kuò)展到扇區(qū)邊界。 可擴(kuò)展磁盤頭部中的“大表條目”字段指示有多少條目有效。
BAT的條目存儲了虛擬硬盤的塊地址映射到VHD文件的絕對扇區(qū)偏移量,表示虛擬硬盤的塊中的數(shù)據(jù)存儲在VHD 文件中以該扇區(qū)開始的數(shù)據(jù)塊內(nèi)。如果向虛擬硬盤的塊寫入數(shù)據(jù),那對應(yīng)的塊分配表的條目為該塊在VHD文件分配空間;如果虛擬硬盤的塊沒有數(shù)據(jù)寫入,那對應(yīng)的塊分配表條目就不分配空間。這保證了虛擬硬盤通過塊分配表的動態(tài)更新可以隨時向VHD 文件寫入數(shù)據(jù),也闡明了VHD文件容量的動態(tài)變化。
其具體的流程圖如下圖所示:
上圖中描述了虛擬硬盤的數(shù)據(jù)塊到VHD文件的數(shù)據(jù)塊的映射關(guān)系。塊分配表的條目與虛擬硬盤塊的數(shù)目是保持一致的,且硬盤的第n個塊對應(yīng)塊分配表的條目n,也就是一一對應(yīng)的關(guān)系,這樣的好處是方便的進(jìn)行讀取的時候按順序查找所存儲的數(shù)據(jù)在哪個數(shù)據(jù)塊上。但VHD文件的數(shù)據(jù)區(qū)的數(shù)據(jù)塊的順序不與此對應(yīng)。圖中,塊分配表的條目0為虛擬硬盤的第0塊分配到VHD文件中以某扇區(qū)開始的第1塊,即寫入虛擬硬盤第0 塊的數(shù)據(jù)會存儲在VHD 文件的某扇區(qū)第1塊數(shù)據(jù)塊區(qū)域,這里的某扇區(qū)即是VHD文件存儲在真實硬盤上的扇區(qū)。因此我們就可以理順VHD虛擬硬盤快分配表的工作模式了:
1)、數(shù)據(jù)寫入到虛擬硬盤數(shù)據(jù)塊。數(shù)據(jù)首先寫入到VHD虛擬硬盤的數(shù)據(jù)塊中;
2)、記錄塊分配表。然后根據(jù)其數(shù)據(jù)塊寫入的對應(yīng)塊分配表,記錄相應(yīng)的虛擬硬盤數(shù)據(jù)塊到VHD文件的數(shù)據(jù)區(qū)域的數(shù)據(jù)塊的地址映射信息。
數(shù)據(jù)塊由扇區(qū)位圖和數(shù)據(jù)組成。對于VHD可擴(kuò)展硬盤,扇區(qū)位圖指示了哪些扇區(qū)包含有效數(shù)據(jù)(值為1),以及哪些扇區(qū)未被使用(值為0)。對于差異硬盤,扇區(qū)位圖指示哪些扇區(qū)位于差異磁盤(值為1)內(nèi),哪些扇區(qū)位于母盤(值為0)中。位圖總計有512字節(jié)即一個扇區(qū)大小。
塊是扇區(qū)倍數(shù)的乘方。默認(rèn)情況下,塊的大小為4096個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)行對數(shù)據(jù)的操作。
明白了上述的基本知識之后,我們來說說如何實現(xiàn)可擴(kuò)展的虛擬硬盤?
首先,數(shù)據(jù)塊按需分配。創(chuàng)建可擴(kuò)展的虛擬硬盤時,最初不為其分配數(shù)據(jù)塊。新創(chuàng)建的映像僅包含前面描述的數(shù)據(jù)結(jié)構(gòu)(包括可擴(kuò)展的虛擬硬盤頭部和塊分配表BAT)。
當(dāng)數(shù)據(jù)寫入映像時,可擴(kuò)展的虛擬硬盤將為寫入的數(shù)據(jù)擴(kuò)展一個個新的數(shù)據(jù)塊。然后BAT被一一對應(yīng)進(jìn)行更新,以包含在映像內(nèi)分配的每個新數(shù)據(jù)塊的偏移量。
VHD有一個計算公式可以讓虛擬硬盤知道其將虛擬硬盤的數(shù)據(jù)塊中的扇區(qū)映射到VHD映像文件塊中的那個扇區(qū)。
要從引用的扇區(qū)號計算塊號,該公式如下所示:
BlockNumber = floor(RawSectorNumber / SectorsPerBlock)
SectorInBlock = RawSectorNumber%SectorsPerBlock
BlockNumber用作BAT的索引。 BAT條目包含塊位圖開始的絕對扇區(qū)偏移,后面跟塊的數(shù)據(jù)。以下公式可用于計算數(shù)據(jù)的位置:
ActualSectorLocation = BAT[BlockNumber] + BlockBitmapSectorCount + SectorInBlock
以這種方式,可以以任何順序分配塊,同時保持其通過BAT的排序找到數(shù)據(jù)。
當(dāng)新分配一個數(shù)據(jù)塊時,頁腳區(qū)域必須被推回到文件的末尾。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
標(biāo)題名稱:PVS架構(gòu)之VHD虛擬磁盤-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article42/dpddec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、App設(shè)計、網(wǎng)站導(dǎo)航、網(wǎng)站制作、網(wǎng)站改版、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容