虚拟磁盘格式2:VHD
参考文档:Virtual Hard Disk Image Format Specification
VHD是一种微软支持的虚拟磁盘格式,结构如下图所示
当虚拟磁盘文件大小超过了文件系统文件大小的限制,可以将虚拟磁盘文件分割为多个文件,第一个文件包含磁盘头等,扩展名为.vhd,最后一个文件包含磁盘尾,除第一个文件外,扩展名都以.v01,.v02等命名
本文以“新建虚拟硬盘.vhd”为例,它是一个Differencing磁盘,父磁盘是同目录下的my.vhd
种类
VHD虚拟磁盘有三种类型:
- 固定磁盘:创建时已经预先分配了存储空间
- 动态磁盘:随着文件的不断写入,逐步分配存储空间,直到达到预先设置的存储空间
- Differencing磁盘:当需要多个系统盘时,可以将系统装在一个父盘中,其它Differencing磁盘依赖于父盘,从而节省安装系统的空间。参考:https://blog.51cto.com/yupeizhi/1317925与https://www.techtarget.com/whatis/definition/differencing-disk
格式
所有采用大端存储
磁盘头
各字段意义如下:
偏移 | 意义 |
---|---|
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
数据块如下