虚拟磁盘格式2:VHD

参考文档:Virtual Hard Disk Image Format Specification

VHD是一种微软支持的虚拟磁盘格式,结构如下图所示

当虚拟磁盘文件大小超过了文件系统文件大小的限制,可以将虚拟磁盘文件分割为多个文件,第一个文件包含磁盘头等,扩展名为.vhd,最后一个文件包含磁盘尾,除第一个文件外,扩展名都以.v01,.v02等命名

本文以“新建虚拟硬盘.vhd”为例,它是一个Differencing磁盘,父磁盘是同目录下的my.vhd

种类

VHD虚拟磁盘有三种类型:

格式

所有采用大端存储

磁盘头

各字段意义如下:

偏移 意义
0-7 磁盘头标识,值为“cxsparse”
8-F 下一个结构的偏移,如未被使用,值设为FFFFFFFF
10-17 块表的偏移
18-1B 头版本号
1C-1F 目前的最大块数,最大块表项数,等于磁盘大小除以块的大小
20-23 块的大小,值必须为2的幂次
24-27 磁盘头的校验和
28-37 父磁盘的唯一标识,Differencing类型磁盘会存储
38-3B 父磁盘的时间戳,从2000.1.1 12:00:00 AM in UTC/GMT以来的秒数
3C-3F 保留
40-23F 共512B,父磁盘文件的unicode值

之后的字段仅用于Differencing类型磁盘,每24B一项,共8项,每一项存储一个父磁盘的定位器,用于定位Differencing类型磁盘的父磁盘的位置,每一项的结构如下

偏移 意义
0-3 表示定位器的路径格式,W2ru:windows下的相对路径,W2ku:windows下的绝对路径
4-7 存储父磁盘定位器所需的扇区数
8-B 父磁盘定位器的字节数
B-F 保留
10-17 父磁盘定位器的偏移地址

在例子“新建虚拟硬盘.vhd”中前512B为磁盘尾副本,直接看磁盘头,数据如下:

红框处为磁盘头标识,值为“cxsparse”
红线处为块表的地址,这里为20 00,即8192B
蓝色划线处为最大块数,值为15,因为现在磁盘文件30M,一个块2MB,所以目前最大块数为15
黄色划线处为每块大小,值为2097152B,也就是2MB
黑框及以后为父磁盘文件的unicode值,这里可以看到其确为父磁盘my.vhd的路径
从粉框开始为Differencing类型磁盘的专属字段,只看第一个24B即第一项
粉框处为定位器的路径格式,这里为W2ku,表示windows下的绝对路径
绿框表示存储父磁盘定位器所需的扇区数为4096
紫框表示父磁盘定位器的字节数为60B
紫线处表示父磁盘定位器偏移为4096B
跳转到4096B处,如下图所示,发现确实为绝对路径。而且确实使用了60B

接下来的24B为相对路径格式存储的父磁盘定位器,跳转到其偏移,数据如下图所示

磁盘尾

各字段意义如下:

偏移 意义
0-7 指明磁盘创造者的唯一标识,值为“conectix”的ASCII
8-B 表示磁盘的特殊类型,1:临时磁盘,关机时就删除,2:默认保留值
C-F 文件版本号
10-17 数据的偏移,从虚拟文件开头到下一个结构的偏移,对于固定类型磁盘,值为FFFFFFFF
18-1B 时间戳,从2000.1.1 12:00:00 AM in UTC/GMT以来的秒数
1C-1F 创建该虚拟磁盘的应用标识
20-23 创建该虚拟磁盘的应用的版本
24-27 创建该虚拟磁盘的操作系统标识,Wi2k:windows
28-2F 磁盘原始大小,以字节为单位(值仅供参考)
30-37 磁盘现在大小,以字节为单位,磁盘创建时与磁盘原始大小相同,之后随着扩展而改变
38-39 磁盘柱面数
3A 磁盘磁道数
3B 每磁道扇区数
3C-3F 磁盘种类,2:固定磁盘,3:动态磁盘,4:Differencing磁盘
40-43 校验和
44-53 磁盘唯一标识
54 保存状态标识,如果值为1,表示磁盘处于保存状态,不能进行压缩扩展
55- 保留,共427B

磁盘中第一个扇区数据如下所示,是磁盘尾的副本

磁盘最后一个扇区如下所示,是磁盘尾,数据都相同

红框处为磁盘创造者标识
红线处为从虚拟文件开头到下一个结构的偏移,为512,所以该磁盘尾大小为512B,磁盘头从512B处开始
黑线处为创建该虚拟磁盘的操作系统标识,值为Wi2k,也就是windows系统
绿线处为磁盘原始大小和现在大小,值都为480B
连续三个黑框表示磁盘柱面数,磁道数,扇区数分别为:903,4,17(这里似乎不对,暂不明白)
蓝线处值4,表示类型为Differencing磁盘

块表和数据块

块表中每一项对应一个块,存储这个块的偏移地址(相对于整个磁盘),未被使用的块表中的项全部初始化为F

数据块中包含一个扇区位图和数据。对于动态类型磁盘,扇区位图表明哪个扇区存储有数据(1填充)。对于differencing类型磁盘,哪个扇区在differencing磁盘中(1填充),哪个扇区在父磁盘中(0填充)。在文档中说存在,但是实际例子中没有找到扇区位图,这里存在疑问

从上知块表在偏移8192处,数据如下,只使用一个块,值为159,即该数据块从159扇区处开始,即159*512=81408

数据块如下

posted @ 2022-05-06 19:46  启林O_o  阅读(1191)  评论(0编辑  收藏  举报