- 概述
VHD 是微軟虛擬磁盤文件格式,qemu和tapdisk2都能支持VHD鏡像格式,不僅提供基本的虛擬機卷功能,還可提供磁盤快照、磁盤擴容等高級功能
vhd-util是個linux下的開源軟件,通過封裝libvhd庫函數,提供vhd鏡像相關操作。例如可用於創建vhd鏡像、快照等功能。
本文關注vhd-util的使用,及背后vhd鏡像格式、libvhd的基本流程
- vhd鏡像規范
規范可參考 http://wenku.baidu.com/link?url=k-Q8rXCQOTJDhlOalj5KGMyJNQrLKwa6wPaJ0Llg0JAVefxQG_6ITTkqUE03iy3Y3ZsfJteUvZywm30ewJpbGQ0NOPBzj_HtFHIq1ZmRy1u
vhd鏡像基本格式如下圖
- 創建鏡像
vhd支持三種鏡像格式:fix卷、dynamic卷、diff(差分)卷(快照),以下以創建100MB動態卷為例
vhd-util create -n parent.vhd -s 100 #創建動態卷 vhd-util query -n parent.img -sv #查看卷物理大小和虛擬大小
關鍵信息:
(1)在centos/kvm環境測試,發現創建的卷物理大小為3584byte,結合以上vhd格式規范及代碼,發現此vhd文件內容如下:
copyoffooter(512)|header(1024)|bat(512)|batmap(1024)|footer(512)
bat記錄的是數據塊的地址信息,故512bypte計算方法為:100MB物理卷,即50個block,每個block地址為4byte,及總共200byte,按照扇區(512byte)補齊,則占用1個扇區(512byte)
batmap記錄的是掩碼信息(?尚在研究中),包括batmapheader(512byte)和batmap(512byte)
(2)fix卷的格式為data|footer(512byte),故創建100MB的fix卷,物理大小為100MB+512byte
- 創建快照
以下以基於100MB動態卷,創建快照為例
vhd-util snapshot -n son.vhd -p parent.vhd vhd-util snapshot -n grandson.vhd -p son.vhd vhd-util query -n grandson.vhd -p
關鍵信息:
(1)和parent.vhd比較,快照卷(diff卷)增加了parentlocator數據,內容如下:
copyoffooter(512)|header(1024)|bat(512)|batmap(1024)|parentlocator(3*512byte)|footer(512)
parentlocator就是平台碼,用來表示文件格式,代碼里頭會產生PLAT_CODE_MACX(File URL)、PLAT_CODE_W2KU(windows系統,絕對路徑)、PLAT_CODE_W2RU(windows系統、相對路徑)三條 locator信息
(2)運行以上例子的命令,發現grandson.vhd的parent是parent.vhd而非son.vhd。原因是grandson.vhd沒有臟數據(沒有寫過數據)的場景,vhd-util將grandson.vhd接到son.vhd的上一級鏡像上
- 磁盤擴容
以下以基於100MB動態卷,動態擴容到200MB為例
vhd-util resize -n parent.img -s 200 -j journal
關鍵信息:
(1)磁盤擴容成功后,磁盤虛擬大小為200MB,物理大小未發生變化(3584)byte。原因是擴容100MB,導致:(1)bat增加 50(100MB為50個block)4byte空間記錄新分配的數據塊情況。而bat剩余空間(512byte-504byte(原100MB空間)已 滿足要求,無需新分配空間);(2)batmap增加空間,而batmap剩余空間已滿足要求,無需新分配空間