动态大小VHD虚拟磁盘文件长度探究

2024-04-29 23:48:04王德劲
信息系统工程 2024年2期
关键词:计算公式

王德劲

摘要:为了避免使用动态大小VHD技术的虚拟化设备由于VHD文件逐步增长到不可预估大小而撑爆物理磁盘,基于常见开发环境对动态大小VHD虚拟磁盘文件长度做了深入研究,最终提出一个最大文件大小的计算公式。实践表明,在虚拟化产品的开发阶段做物理磁盘空间规划时利用该公式做指导,可以有效防止虚拟化产品在市场化应用过程中出现的系统无法正常运行问题。

关键词:VHD技术;虚拟化设备;文件大小;计算公式

一、前言

VHD(Virtual Hard Disk)是微软发布的一种虚拟硬盘格式规范,这种虚拟化技术通过在物理硬盘上创建一个虚拟磁盘文件,模拟一个独立的硬盘驱动器。VHD可分为固定大小和动态大小两种类型。固定大小VHD在创建时分配磁盘空间,创建后不能更改空间大小,磁盘文件大小也是固定的。动态大小VHD在创建时只分配实际使用的空间,只在需要时动态扩展。VHD技术在政府、医疗机构、学校和企业得到了广泛应用[1]。

二、问题与挑战

动态大小VHD由于其磁盘文件大小随着数据的写入动态增长,利用该特性可以最大限度共享物理磁盘空间,因此这种类型的VHD在诸如云桌面终端等虚拟化产品得到了广泛运用。但也因此特性,如果不能准确评估出最大虚拟磁盘文件大小,在物理磁盘空间有限的情况下,如果不断向虚拟磁盘写入数据,就有可能出现VHD文件撑爆物理磁盘,最终导致系统无法正常运行的风险。

三、分析与验证

(一)问题引入

要计算出动态大小VHD文件长度,就需要知道其文件构成。通过将组成的各部分相加,最终计算出文件总大小。VHD文件结构在Virtual Hard Disk Format Spec_10_18_06规范(以下简称规范)[2]文档里面有说明,如图1所示,可以对照规范来分析实际的VHD文件。

规范描述的动态大小VHD文件结构中的footer(首尾两个)、header,以及block data大小固定,分别为512字节、1024字节和2MB[3]。BAT和扇区位图总大小不固定,存在512字节对齐情况。经过与实际VHD文件对比分析,发现footer、header、block data大小与规范描述的一致,但BAT和位图可能存在差异。BAT是块分配表,用于存放数据块在文件中的偏移。一个BAT条目占4个字节,总BAT大小在创建虚拟磁盘时确定。位图表示在动态大小VHD中哪些扇区包含有效数据。经过分析计算,BAT和位图实际占用的字节数或地址空间的对齐值可能超过512字节这个值,到底超出多少是分析的重点。

规范中“动态磁盘应用”小节有这样一句描述:当向磁盘文件中写入数据时,动态磁盘将会扩展一个新的块。这个新的块既包含block data,也包括位图。前者是固定大小,因此可通过对比分析法先确定位图的对齐规则,然后通过类比分析法和假设分析法确定BAT的。

(二)问题分析

根据前文的分析思路,在Win10环境下,利用Windows磁盘管理器创建一个10MB的动态大小VHD文件10MB_dym.vhd,以及它的备份文件10MB_dym_org.vhd。创建后两个文件大小都为8192字节,如图2所示。挂载10MB_dym.vhd文件,再对其进行磁盘初始化,卸载磁盘后其文件大小为2109440字节。

存放初始化信息,需要创建一个新的块,这个新块包括block data和位图,大小为10MB_dym.vhd文件大小减去10MB_dym_org.vhd大小,即2109440减去8192字节。再将块大小减去block data的大小,即可得到位图大小,即为2109440–8192–2×1024×1024=4096字节。

位图对齐大小确定后,再来确定BAT对齐大小。动态大小VHD在刚创建时没有数据块被分配,只包含数据结构,即footer、header和BAT等信息。因此,可通过分析10MB_dym_org.vhd文件来进一步确定BAT的大小。VHD文件大小减去footer和header部分,理论上剩余部分为BAT。计算方法为:

文件大小–2×footer大小–header大小,即8192–2×512–1024=6144字节。

计算得出的6144字节是否就是为BAT大小?需要做进一步分析。图3是输出10MB_dym_org.vhd文件的十六进制数据,最左侧是地址栏,中间部分是数据,最右侧划线处是十六进制数据对应的ASCII码。除最后一行输出,其他行与行之间的星号表示上下两行的数据与上一行完全相同。根据规范,图中0x000-0x1FF区域是footer,0x200-0x5FF是header,文件最后0x1E00-0x1FFF是footer的备份。BAT位于header之后,该区域存放数据块偏移值,这里称为表项,一个表项占用4字节,未使用的表项全部初始化为0xFFFFFFFF。根据规范描述,BAT以512字节对齐。由于10MB由5个2MB的数据块组成,因此BAT有5个表项,共占用20字节。再以512字节对齐,理论上BAT的区域为0x600-0x7FF,但是实际看起来好像不是。0x600-0xFFF区域的数据都为全0xFFFFFFFF,从0x1000开始数据变为0x00000000,从数据变化情况来看,BAT区域范围更像是0x600-0xFFF。

现在通过类比法和假设法分析BAT所在的区域。假设跟位图一样,BAT也是以4096字节对齐,那么0x600-0xFFF区域即为BAT的区域。但从0x1000到0x1E00这块区域的数据又是什么?文件最后footer数据从0x1E00地址开始,其末尾字节地址加1即8192,正好是4096的2倍,是否意味着文件VHD文件大小也要以4096字节对齐,而在BAT和footer之间填充全0来达到这个目的?

(三)推论验证

假设上一小节的推测是正确的,下面再通过创建新的VHD文件来验证。使用Windows磁盘管理器创建一个15GB大小的动态大小VHD文件15GB_dym.vhd,以及它的备份文件15GB_dym_org.vhd。初始化15GB_dym.vhd,文件大小如图4所示。

被初始化文件比备份文件多一个块,块大小为2MB +4096=2101248字节,也即2138112减去36864字节,这再一次说明位图以4096字节对齐。再来分析BAT和文件大小对齐字节,15GB动态大小VHD文件的BAT所需的字节数为15GB/2MB ×4 = 30720。BAT的起始地址为0x600,按照30720计算的结尾地址为0x600+30720–1=32255。下一个区域的首地址为32256,32256÷4096=7.875,不是对齐大小4096的整数倍。要实现4096对齐,需要在前面填充8×4096–32256=512Bytes。由此,BAT的结尾地址为0x600+30720+512–1=32767,即0x7FFF,地址范围为0x600–0x7FFF,如图5箭头指向的BAT所示。文件末尾的footer为512字节,无法构成4096的整数倍,也需要做填充,需填充的字节数为4096–512=3584。填充区域为0x8000–(0x8000+3584–1),即0x8000–0x8DFF,如图5箭头所指填充区域所示。由此分析,推测的结论在15GB VHD文件中成立。

四、文件长度算法

根据以上分析结论,结合动态大小VHD文件结构,可以得到动态VHD文件最大大小计算公式。

VHDFileSize=2×footerSize+headerSize+BATSize+TotalBlockSize+filePadSize

其中,公式中各变量大小及含义如下所示:

footerSize:footer结构大小,大小为512字节。

headerSize:header结构大小,大小为1024字节。

BATSize:BAT结构大小,等于VHDDiskSize/blockDataSize×4+((BATOffset+VHDDiskSize/blockDataSize×4)%4096)?(4096-(BATOffset+ VHDDiskSize/blockDataSize×4)%4096):0。

其中,VHDDiskSize为在创建VHD时,设置的磁盘空间大小,单位为MB。blockDataSize表示块中block data的大小,为2MB。BATOffset为BAT在VHD文件中的地址偏移,固定为0x600,十进制为1536。故BATSize计算公式可进一步简化为:2×VHDDiskSize+((1536+2×VHDDiskSize)%4096?(4096-(1536+2× VHDDiskSize)%4096):0

TotalBlockSize:总块大小,等于VHDDiskSize/blockDataSize×4096+1024×1024×VHDDiskSize,因blockDataSize为2MB,故计算公式进一步简化为2048×VHDDiskSize+1024×1024×VHDDiskSize,即1050624×VHDDiskSize,单位为字节。

filePadSize:文件大小4096字节对齐填充的字节数,为3584。

综合上面各等式,VHDFileSize的计算公式可进一步归纳为。

VHDFileSize=5632+1050626×VHDDiskSize+((1536+2×VHDDiskSize)%4096?(4096-(1536+2×VHDDiskSize)%4096):0

可以看出,简化之后的公式中动态大小VHD文件最大大小最后只与VHDDiskSize有关。

下面以10MB_dym.vhd为例做计算验证。将其挂载并格式化成NTFS文件系统,将磁盘空间填满后,在磁盘管理器和此电脑界面显示的状态如图6所示。图中,磁盘管理器显示磁盘可用空间只有7MB,实际可使用的空间更小,因为有部分空间需要预留给磁盘初始化信息和文件系统使用。将VHDDiskSize=10代入上述公式计算此VHD文件的最大大小值为:

VHDFileSize=5632+1050626×10+((1536+2*10) %4096? (4096 - (1536 + 2× 10)%4096):0=10514432字节。

实际大小值为8413184字节,与公式得出的结果不一致。图7所示为该文件的二进制数据,其中BAT区域有4个字节被使用,即用了4个块,还有一个块没有使用。如果加上此块所占用的空间,则文件大小为8413184+2×1024×1024+4096=10514432,与上面用公式计算出的值完全一致。

前面的推导过程所创建的VHD磁盘大小都为2MB的倍数,公式在计算过程也能整除。如果所创建的VHD磁盘大小不为2MB的倍数,计算文件最大大小时上面公式还能否使用?使用Windows磁盘管理器创建一个9MB大小的动态大小VHD文件,分析其二进制数据可知其BAT数目5,block data的值为2MB。说明磁盘管理器分配了10MB(5×2MB)的空间给这个9MB的动态VHD,这与创建10MB大小的VHD磁盘一致。对于非2MB倍数的VHD,其文件最大大小比与其磁盘大小加1MB的动态大小VHD要小,故在进行最大占用空间分析评估时,依然采用上述公式。

五、环境影响

上述分析的动态大小VHD都是在Win10系统上使用Windows磁盘管理器创建的。经过测试分析,使用其他常用工具创建的,如bootice、vhdx_onekey_2013,VHD文件结构未变。

Linux下也有一款开源的VHD管理工具vhd-util,使用它创建的动态大小VHD与Win10环境工具创建的相比,footer与header没有变化,磁盘空间分配规则也没有变化,变化的是增加了tdbatmap字段[4],且VHD文件是以512字节对齐。对于如果将vhd-util创建的动态大小VHD放到Windows下挂载和使用,tdbatmap会被重新用作位图,BAT、位图,以及最终的文件大小仍然以512字节对齐。

六、结语

VHDX(Virtual Hard Disk v2)是新一代VHD技术[5],具有更大的磁盘容量和更好的性能,但由于VHD技术应用较成熟,且很多虚拟化产品后台管理系统是Linux,目前Linux下主要的开源VHD管理工具为vhd-util,该工具还无法支持对VHDX的管理,因此目前市场上大多数虚拟化产品依然使用VHD技术。另外,VHDX也存在跟VHD一样的虚拟磁盘文件增长问题。本文针对此问题进行了深入探究,并得到了在Win10系统环境下计算动态大小VHD磁盘文件最大大小的公式。尽管本文的分析只基于主流的系统开发环境或工具,没有全面覆盖。即便如此,所得出的计算公式足以满足常规产品开发需要,所使用的分析方法也能为其他系统环境分析提供很好的指导作用。

参考文献

[1]张丹珏.基于VHD技术的通用计算机考试系统的应用研究[J].现代电子技术.2017,40(03):121-123.

[2]Virtual Hard Disk Format Spec_10_18_06.do[EB/OL].https://www.microsoft.com/en-US/download/2006,10,11.

[3]连建永,顾忠明,黄道颖,等.VHD文件结构解析[J]电脑开发与应用.2014,27(08):62-66.

[4]vhd-util[EB/OL].https://github.com/emonty/vhd-util 2017.5.23

[5] [MS-VHDX]: Virtual Hard Disk v2 (VHDX) File Format[EB/OL]. https://learn.microsoft.com/zh-cn/openspecs/windows_protocols/ms-vhdx/2022.10.1

作者单位:福州职业技术学院信息工程系

责任编辑:周航

猜你喜欢
计算公式
电机温升计算公式的推导和应用
防爆电机(2022年4期)2022-08-17 05:59:50
2019离职补偿金计算公式一览表
CF-901型放射性气溶胶取样泵计算公式修正
谈拟柱体的体积
蒸发冷却空调机组耗水量计算公式的推导与分析
泥石流整体冲压力简化计算公式
河北地质(2016年4期)2016-03-20 13:52:07
惠斯通电桥的计算公式及性质分析
河南科技(2014年22期)2014-02-27 14:18:40
复合绝缘子爬电距离计算公式推导及应用
河南科技(2014年22期)2014-02-27 14:18:16
采用初等代数推导路基计算公式的探讨
关于节能评估中n值计算公式及修正