虛擬硬盤:VHDX解析①

虛擬硬盤是虛擬化的關鍵。當一個服務器通電時,每一個虛擬機加載到服務器內存並從其相應的VHDX文件啓動。隨着虛擬機的運行,VHDX文件可經過更新來反映數據或狀態改變。本質上來講,虛擬磁盤就是放在物理硬盤上的一個單獨的文件。虛擬磁盤文件的目的是捕獲駐留在服務器內存的虛擬機的完整狀態,並將信息以一個已明確的磁盤文件格式顯示出來。下面咱們來講說虛擬硬盤VHDX的技術實現。安全

在前面的文章中曾經描述了VHD虛擬硬盤的文件格式以及尋址等技術,在本文下面部分將描述VHD虛擬硬盤的升級版本VHDX的文件格式以及尋址等技術。在VHDX虛擬硬盤中,也存在着和VHD虛擬硬盤一樣的是三種類型:固定、動態以及差別。可是與VHD虛擬硬盤所不一樣的是,VHDX虛擬硬盤針對這三種類型的格式都是統一的格式架構。
服務器

首先咱們介紹下VHDX的一些基本的信息:VHDX格式功能在操做系統的硬盤系統層以及操做系統的文件系統層提供,並通過優化,可與現代存儲硬件配置配合使用。在操做系統的硬盤系統層,VHDX可以支持虛擬磁盤的大小高達64TB,之前的VHD只支持到2TB;支持的邏輯扇區大小高達4 KB,有助於將4 KB物理磁盤扇區轉換爲虛擬磁盤,並支持高達256 MB的虛擬磁盤的大數據塊,使得咱們能夠調整數據塊大小並與應用程序或系統的IO模式相匹配,也就是說,相比VHDVHDX 提供更大的塊容量和扇區容量,能夠提供更高的性能。在操做系統的文件系統層,VHDX使用日誌記錄VHDX元數據結構的更新,可避免因電源故障等損壞數據,提供內置的保護能力;元數據區設立用戶元數據區,可以存儲有關用戶的自定義元數據。同時,VHDX 還改進了虛擬硬盤的對齊方式,不但以此能夠適應新型物理磁盤,還能夠改進和優化VHDX文件的大小。並且VHDX格式的設計還爲從此作了考慮,微軟未來能夠在此基礎上方便的引入其餘功能,也容許其餘第三方的解析器實現對VHDX文件的擴展等等。數據結構

下面咱們來看一下VHDX文件的架構:架構

與舊的VHD 格式相比,VHDX 的結構有了較大的改變。下圖描述了VHDX 的邏輯佈局架構。ide

wKioL1jQm4iA-PbLAABye6btNx8929.png

從上圖咱們能夠看到,VHDX文件和VHD文件的結構有很大的區別:佈局

1)VHDX 沒有VHD中的頁腳區域;性能

2)、增長了VHD所沒有的日誌區域;大數據

3)、增長了元數據區域,其內設置了系統元數據區域和用戶元數據區域;優化

若是看這個比較抽象,那麼咱們看看VHDX文件的文件佈局圖:ui

wKiom1jQm67we8fxAAAjJwNTLrM589.png

如上圖所示,一個VHDX文件整體上能夠由三個部分組成:

1、固定大小的頭部區域(1MB

2、非重疊的對象

3、自由空間

VHDX文件以固定1MB大小的頭部區域開頭。此後,非重疊對象和自由空間以任何特定順序自由組合惟一的限制是全部對象在文件中須要按照1 MB大小對齊。非重疊對象的意思就是當前定義的這些對象:塊分配表(也稱爲BAT),元數據區域,日誌,有效載荷塊(數據塊)和扇區位圖塊。這些對象不能相互重疊,好比元數據區域和元數據區域之間不能連着在一塊兒,只要對象不重疊而且保持MB對齊,就能夠在文件中自由移動對象。

wKiom1jQm-_wnrbqAAC27qKJrvY094.jpg-wh_50

例如,其中一個VHDX文件:

wKiom1jQnCehywM4AABUSwzrX7A000.png

由上圖所示:VHDX文件的結構由頭部、日誌、塊分配表(也稱爲BAT)、扇區位圖、數據塊(有效載荷塊)、自由空間、元數據區等這樣的結構組成。在後面的部分,自由空間和這些對象進行了自由組合。

下面將詳細講解這些組成對象:

一、首部區域



VHDX文件的頭部區域是虛擬硬盤上的第一個對象,是打開VHDX文件時首先檢查的結構。頭部大小爲1 MB,包含五個大小爲64 KB的項目:文件類型標識符,兩個標頭和兩個區域表。

wKiom1jQnFDS3aNcAAAse8zi-2g297.png

其文件佈局以下圖所示:

wKioL1jQnJzgq-JvAAAQpdAgUNU534.png

1.一、文件類型標識符



文件類型標識符佔64KB大小。包含一個簡短的固定文件簽名和一個文件建立者字段,文件簽名字段必須爲0x656C696678646876(「vhdxfile」爲ASCII),用以將文件標識爲VHDX;文件建立者字段用於標識VHDX文件的建立者。其結構體以下圖所示:

wKioL1jQnM2D4SfBAAAewutjktY713.png

文件類型標識符存儲在從VHDX文件偏移量爲0開始的前64KB中。該區域不會被覆蓋,確保即便由於寫入失敗破壞了文件的扇區,該文件仍然能夠被識別爲VHDX

文件簽名字段包含了描述文件類型是VHDX的一個UINT64結構體。文件建立者字段包含描述建立VHDX文件的解析器的UTF-16字符串。此字段不能爲空而且是可選的,若是沒有填入的狀況下,默認置零值。該字段是解析器在建立VHDX文件的時候,填充的一個惟一能夠標識VHDX文件建立者的字符。這個字段在目的是用於解析器在出現錯誤的時候讀取該字段來進行診斷問故障問題的,不會使用此字段影響解析器的行爲。

解析器必須在建立文件時寫入文件類型標識符結構,而且在加載VHDX文件時必須驗證簽名字段。在建立文件後,解析器不能覆蓋文件的前64 KB中的任何數據。


1.二、標頭(Headers)


每一個標頭佔64KB大小,兩個頭部區域中的每個標頭都是相同的。一個標頭存儲在偏移量爲64 KB處開始的地方,另外一個標頭存儲在128 KB處開始的地方。標頭的做用是用來定位日誌的,所以沒法經過日誌對標頭進行更新。爲了提供電源故障一致性保證,每一個VHDX文件中都有兩個標頭。

標頭做爲VHDX根數據結構樹,提供版本信息,日誌的位置和大小以及一些基本的文件元數據。其結構體以下圖所示:

wKiom1jQnQTzm-NpAABehN18ejA689.png-wh_50

如上圖,標頭自己包含了簽名、校驗和、序列號、文件寫入全局惟一標識符、數據寫入全局惟一標識符、日誌全局惟一標識符、日誌版本、版本、日誌長度、日誌偏移以及保留部分組成。除了標識標頭自己以及日誌的信息外,標頭自己還包含了基於自己HA機制的序列號和校驗和等元數據,這些數據只用於標頭自己的高可用。上述咱們說明了,頭部區域包含了兩個標頭,所以在這裏,頭部區域中每次只有一個標頭處於活動狀態,另一個標頭處於待命狀態。這樣的機制可使得VHDX的標頭增長安全性,噹噹前使用的標頭遭到破壞的時候,能夠安全地使用或覆蓋另外一個標頭,從而保證VHDX文件不被破壞。所以在標頭中,每一個標頭都額外包含了序列號和校驗和來確保這種機制。

下面咱們詳細說明每一個字段:

1)、簽名字段:簽名字段必須爲0x64616568(「headASCII表示)。該字段標識其爲一個標頭。

2)、校驗和字段:校驗和字段是一個CRC-32C哈希結構,是對4 KB爲單位結構利用CRC-32C哈希出來的值。該字段不爲空,在計算校驗和值期間取值爲零。

3)、序列號字段:是一個64位無符號整數。若是簽名和校驗和都正確驗證,則表示標頭是有效的。若是標頭是有效的標頭而且其序列號字段大於另外一個標頭的序列號字段,則該標頭是處於活動狀態的標頭。解析器經過讀取序列號的值來肯定使用當前那個標頭的數據。若是序列號值相同或者沒有值,則沒法肯定當前的活動標頭,則解析器會認爲VHDX文件已損壞。

4)、文件寫入全局惟一標識符字段:該字段指定一個128位全局惟一標識符來標識文件寫入的內容。在每次打開VHDX文件時,解析器必須在對文件進行第一次修改以前將此全局惟一標識符更改成新的全局惟一標識符,包括系統和用戶元數據以及日誌回收。若是存儲文件的存儲介質爲只讀,或者該文件在只讀模式下打開,解析器則會跳過此字段。

5)、數據寫入全局惟一標識符字段:該字段指定一個128位的全局唯一標識符來標識用戶可見數據的內容。在每次打開VHDX文件時,解析器必須對用戶可見數據進行第一次修改以前將此字段更改成新的全局惟一標識符。若是虛擬磁盤的用戶經過讀取虛擬磁盤來進行數據的更改,則解析器必須更新此字段。這包括更改系統和用戶元數據,原始塊數據,磁盤大小或數據塊轉換的狀態。由於若是不更新這個字段,將致使虛擬磁盤扇區讀取與先前讀取的數據不一樣,由於數據已經發送更改操做,可能新的數據塊已經存儲到了別的地方。值得注意的是,這不包括文件中數據塊的移動,由於數據塊的移動僅僅是改變文件的物理佈局,而不是虛擬磁盤的佈局。數據寫入全局惟一標識符字段用於差別VHDX鏈的完整性驗證。解析器必須特別注意以確保它們按照所述進行更新。

6)、日誌全局惟一標識符字段:該字段指定一個128位的惟一標識符用於肯定日誌條目的有效性。若是此字段爲零,則日誌爲空或沒有有效條目,不能使用日誌進行數據恢復。只有在標頭中包含此標識符的日誌條目時纔是有效的日誌條目。打開時,解析器必須在覆蓋日誌區域中的現有空間以前將此字段更新爲新的非零值。

7)、日誌版本字段:該字段指定VHDX文件中使用的日誌格式的版本。 此字段必須設置爲零。 若是不是,解析器不能繼續解析文件,除非日誌全局惟一標識符字段爲零,表示沒有要回放的日誌。

8)、版本字段:該字段指定VHDX文件中使用的VHDX格式的版本。此字段必須設置爲1。若是不是,解析器就不能使用此格式規範中的詳細信息來解析文件。

9)、日誌長度和偏移量字段:該字段指定文件中的字節偏移量和日誌的長度。這些值必須是1 MB的倍數,並且日誌偏移量必須至少1 MB大小。

10)、保留字段:保留字段定義了剩餘的空間的區域地址信息。

上述就是處於頭部區域中標頭的介紹部分。咱們說在頭部區域中存在着兩個標頭做爲HA機制而存在,並且因爲VHDX格式中固定、動態以及差別都是同一種結構。所以隨着數據的是變化,好比數據的動態增長,其頭部區域的標頭部分所記錄的鍵值也須要進行隨時更新。下面咱們來講說頭部區域中標頭的更新機制。

在每次打開VHDX文件並容許寫入VHDX文件時,必須在修改文件的以前(文件的任何部分)更新標頭。同時,在使用VHDX文件時,當虛擬硬盤或VHDX文件上的操做影響標頭中包含的字段時,也須要更新標頭。

第一次在打開VHDX文件後更新標頭,解析器必須爲文件寫入全局惟一標識符字段生成新的隨機值。在用戶請求可能影響虛擬磁盤內容或用戶可見虛擬磁盤元數據(如磁盤大小或扇區大小)的操做以前,解析器不該更新DataWriteGuid字段。

解析器能夠遵循如下過程將非當前報頭改變爲當前報頭:

1.標識當前標頭和非當前標頭。

2.在內存中生成一個新標題。將SequenceNumber字段設置爲當前標頭的SequenceNumber字段加一。

3.根據須要將其餘字段設置爲其當前值或更新值。若是這是會話中的第一個頭更新,請爲FileWriteGuid使用一個新值。

4.檢查內存中的標頭。

5.使用內存中頭部覆蓋文件中的非當前頭部。發出flush命令以確保主機磁盤存儲介質上的標題更新是穩定的。

在此過程以後,非當前頭成爲當前頭。解析器應該再次執行更新過程,以便當前和非當前頭部都包含最新的信息;這確保若是一個頭損壞,該文件仍然能夠打開。


1.三、區域表



區域表列出了文件中的虛擬連續,可變大小,MB對齊的數據片斷的區域。這些對象當前包括BAT和元數據區域,可是能夠經過解析器或將來對規範的修訂來擴展,而不破壞不一樣解析器的實現和版本的兼容性。解析器必須保持他們不理解的對象而不破壞它們。解析器必須沒法打開包含標記爲必需但該解析器不理解的區域的VHDX文件。

區域表由一個標題後跟可變數量的條目組成,這些條目指定文件中區域的標識和位置。區域表的兩個副本存儲在文件偏移量192 KB256 KB。必須經過日誌更新區域表結構。

wKiom1jQnSLTGl7hAAAlZLhVKVY432.png-wh_50

其中區域表的頭部包含如下內容:

wKioL1jQnVKATb8iAAAskaETLy0403.png

簽名字段必須爲0x69676572

校驗和字段是整個64 KB表上的CRC-32C哈希值,該字段在計算校驗和值期間,默認取值爲零,直到算出校驗和爲止。

條目數字段指定要遵循的有效條目的數量。這個值必須小於或等於2047

而區域表的後半段區域表條目部分,其組成結構以下所示:

wKiom1jQnXaBhl4SAAAtL9krGA8234.png

Guid字段指定對象的128位標識符,而且必須是惟一值。

文件偏移量字段和長度字段指定文件中對象的64位字節偏移量和32位字節長度。這些值必須是1 MB的倍數,其中文件偏移量字段必須至少爲1 MB

在該表中的全部對象不可以重疊,不只相對於區域表條目內部彼此之間,也相對於日誌(在頭部中定義)和數據塊和扇區位圖塊(在BAT中定義)。

必需字段指定該區域是否必須由解析器識別才能加載VHDX文件。 若是此字段的值爲1,而且解析器沒法識別此區域,則解析器必須拒絕加載VHDX文件。

保留區域表記錄的是保留的空間地址段

下表總結了VHDX規範中定義的區域的屬性。


wKioL1jQnZzD_AL0AAAt4Q25CLY613.png

       未完待續...

相關文章
相關標籤/搜索