幾種虛擬機鏡像格式
從用戶角度看,虛擬機鏡像文件是一個安裝有操作系統 的磁盤分區,客戶操作系統需要經過一個驅動層才能訪問到 .目前,有多種虛擬機鏡像格式可供選擇,包括raw,qcow2、vmdk、vdi、vhd、qed以及fvd等。表1列出了常 用的虛擬機及其支持的鏡像格式。


虛擬機鏡像文件及其訪問方式
虛擬機鏡像文件保存了虛擬機硬盤的全部信息,按照數據存儲方式的不同,可以分為兩種模式:全鏡像模式(Flat Mode)和稀疏模式(SparseMode)。
全鏡像模式保存了虛擬硬 盤中的所有字節數據,其中也包括對用戶而言無效的數據; raw格式就是全鏡像模式。
稀疏模式只保存對用戶和文件系 統有效的數據,只占用必要的存儲空間,這種模式的鏡像文件在存放數據時使用的可能不是連續的物理磁盤空間;前文提到的qcow2、qed、vmdk等都是稀疏模式。
在整個虛擬機的體系中,I/O請求的處理過程大致如下:
當VM的客戶操作系統中的用戶有磁盤I/O請求的時候,VMM(VMMonitor或者稱為hypervisor)會捕獲其I/O指令,根 據虛擬機實現策略的不同進行必要的轉換,最終通過宿主機 操作系統內核的系統調用來完成客戶操作系統的I/O請求。
在Xen中,有一個tapdisk進程運行在Dom0中,來負責處理來 自其他DomU的I/O請求,完成地址轉換過程。例如,虛擬機客戶操作系統需要讀或寫一個磁盤塊,VMM會調用宿主機內核的系統調用,定位到在鏡像文件中的相應的文件塊。在這 個過程中,由於虛擬化的原因,客戶虛擬機的塊地址需要經過 若干次的轉換才能找到它在物理磁盤上的准確位置。在客戶操作系統中,使用的是VBA(VirtualBlockAddress),在VMM 中使用的是IBA(ImageBlockAddress),就是鏡像文件內的一 個偏移量,在宿主機內核的系統調用中使用的是PBA (PhysicalBlockAddress)。在定位到這些塊的物理地址后,才 能進行客戶操作系統所需要的各種操作。在全鏡像模式中, 這種地址轉換的過程相對簡單,只需要一個線性的變換;而在 稀疏模式中,往往需要經過兩次以上的地址變換,才能完成 VBA到PBA的轉換過程。
幾種虛擬機鏡像格式的原理
raw
raw就是原始的,它直接將文件系統的存儲單元分配給 虛擬機使用,采取直讀直寫的策略。在raw格式的文件中,虛 擬出來的磁盤數據塊號的大小決定了該數據塊在raw文件中 的偏移量,也就是說虛擬磁盤存放數據的順序和raw文件中 存放數據的順序是一致的,由於這個特性,VBA到IBA的轉 換比較簡單,而IBA實際上就是PBA。在很多的實際應用中, 模板鏡像采用raw格式,以提高模板鏡像的讀性能,而增量鏡 像則使用其他格式,方便支持其他輔助特性。
raw格式的優點有:一是尋址簡單,訪問效率較高;二是 可以通過格式轉換工具方便地轉換為其他格式;三是可以方 便地被宿主機掛載,可以在不啟動虛擬機的情況下和宿主機 進行數據傳輸。但是,由於raw格式實現簡單,不支持諸如壓 縮、快照、加密和CoW等特性,另外,raw格式文件在創建時指 定大小之后,就占用了宿主機指定大小的空間,而不像qcow2 等稀疏模式的鏡像格式可以從很小的文件按需地增長。
qcow2和qed
qcow2是qcow的一種改進,是Qemu實現的一種虛擬 機鏡像格式。qcow2文件存儲數據的基本單元是cluster,每一 個cluster由若干個數據扇區組成,每個數據扇區的大小是 512字節。在qcow2中,要定位鏡像文件的cluster,需要經過兩 次地址查詢操作,類似於主存二級頁表轉換機制,如圖2

客戶操作系統的VBA,可以記為d,d=(d1,d2,d3),通過 d1所指示的L1表項的內容,找到L2表的位置A,再由d2指 示的L2表項的內容找到數據塊的地址B,d3則指示數據塊B 內的偏移量。在qcow2文件創建初始的時候,文件只有L1表 和文件頭,L1表初始為空,當VM提供一個VBA需要寫操作 的時候,qcow2的底層驅動會檢查d1所指示的L1表項是否 為空,如果為空,就會在文件尾部新建一個L2表,並且把d1 所指示的L1表項賦值為L2表的地址,同理,也可以定位第一 次寫數據塊的地址和d2所指示的L2表項的值。當VM有讀 數據操作的時候,qcow2驅動會首先確定該數據塊是否在鏡 像文件中,如果不在鏡像文件中,則會從模板鏡像中讀取。在 qcow2中,數據塊的IBA取決於第一次寫操作,文件大小也會 隨着寫操作的增加而不斷增長,基本上做到了用多少空間分 配多少空間,而不像raw格式一樣,文件創建初始就是占用了 比較大的磁盤空間。qcow2格式不僅支持CoW,還支持快照、 壓縮和加密等特性。
qed的實現是qcow2的一種改型,存儲定位查詢方式和 數據塊大小和qcow一樣不同的是,在實現Wqe將qcow的表Rt)重寫標 DirtFlag來代替
vmdk
vmdk是VMware實現的虛擬機鏡像格式,與qcow2類似, vmdk也可以支持CoW快照、壓縮等特性,鏡像文件的大小也 是隨着數據寫入操作的增長而增長,數據塊的尋址也需要通 過兩次查詢。在vmdk鏡像文件的頭部,會有一個文本描述 符(TextDescriptor),該文本描述了數據在虛擬鏡像文件中數 據的布局方式。文本描述符在vmdk鏡像文件中可以以單獨 的文件形式存在,也可以作為文件頭包含在鏡像文件中。 vmdk通常會由一個basedisk,若干個link和extent組成,link 指示的是basedisk和extent的關系,extent是一個物理上的存 儲區域,通常是一個文件。vmdk數據存儲的單位被叫作 grain,每個grain也由若干個512字節大小的sector組成。在 支持稀疏存儲的vmdk中,通過二級的元數據查詢機制進行 數據塊的定位。0級元數據稱為grain目錄(GrainDirectory, GD),1級元數據稱為grain表(GrainTable,GT),GD和GT的 關系如圖3所示。在實現上,基本上和qcow2類似。

fvd
vd不僅支持上述qcow2和vmdk除了壓縮以外的其他特
性,而且還支持CoR(copyonread)和預取(AdaptivePrefetching)。 fvd文件元數據的組織和實現主要基於以下三點:
1)使用位圖(Bitmap)來實現CoW。位圖里的一位表示
一個數據塊(Block)的狀態,為0時表示該數據塊在模板鏡像 中,為1時表示在fvd鏡像中。和qcow2中的數據組織單元 cluster一樣,fvd數據塊的默認大小為64B。在fvd中,一個 2MB的位圖可以代表1TB模板鏡像數據塊的狀態,而這個 2MB的位圖可以很方便地加載到內存中,可以大大提高CoW 的性能。在fvd中,位圖也用在CoR和預取之中。
2)改變qcow2的二級查詢方式,使用一級查詢方式實現 存儲定位。fvd把CoW和鏡像文件的存儲定位分開實現,在 CoW時,使用數據塊是64KB,在虛擬鏡像文件中存儲定位 時,使用數據塊(Chunk)大小為1MB。這樣做的好處是大幅 度減小了查詢表的大小,可以方便地將查詢表一次載入內存,
減少磁盤I/O,而且一次查詢就可以方便地定位到所需的數 據塊。
3)對位圖和一級查詢表格的操作記錄日志,日志滿的時 候一次性提交更改,以減少對位圖和查詢表格的操作次數,提 高性能。由於位圖和一級查詢表格都可以方便地加載在內存 之中,所以對這些數據的操作比較快。在fvd中,元數據可以 和存儲數據文件在一起,也可以和數據文件分開存儲。fvd格 式的實現的架構如圖4所示。

