PVS架构中的VHD虚拟磁盘怎么理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
1、差异虚拟硬盘
差异虚拟硬盘将差异虚拟硬盘本身内的母盘文件定位器存储起来,当驱动尝试打开差异硬盘时,将同时打开差异虚拟硬盘和母盘。 母盘也可以是差异虚拟硬盘,在这种情况下,可能有一连串差异虚拟硬盘,最终终止于非差异虚拟硬盘。
母盘定位器表仅由差异虚拟硬盘来使用,如本文前面的“可扩展虚拟硬盘头部格式”中所述。差异虚拟硬盘是一种可扩展的VHD,它的文件结构与可扩展VHD相同,只是在页脚区域中“类型”字段为4,表示这是一个差异虚拟硬盘。由于差异虚拟硬盘不能独立运行,须依赖其母盘,因此在头部中的“母盘UUID”、“母盘名称”及“母盘定位器”等字段存储着有关重要信息:母盘UUID、母盘名称用于差异虚拟硬盘识别母盘;母盘定位器存储着差异虚拟硬盘在不同平台(Windows或Mac等)上的母盘的定位编码信息,用于在不同平台上的迁移操作。
在Windows中,有两种类型的平台定位器:W2ku和W2ru。 前者是母盘的绝对路径名,后者是母盘相对于差异虚拟硬盘的路径名。
例如,位于Windows的计算机上的根驱动器中的母盘映像将存储格式如下:
Type |
Example |
W2ku |
c:\\directory\\parent.vhd |
W2ru |
.\\directory\\parent.vhd |
相对路径名的优点是它允许差异虚拟硬盘和母盘移植到不同的位置。使用绝对路径名,每当移动母盘时,必须显式重新链接母盘和子硬盘。
当创建差异虚拟硬盘时,如果可能,应该初始化相应平台上的两种类型的平台定位器的路径名。
差异虚拟硬盘的写操作:
对于写操作,所有数据都将写入差异虚拟硬盘映像。对于写入特定块的所有扇区,块位图被标记为dirty。
差异虚拟硬盘的读操作:
当驱动读取硬盘映像的扇区时,虚拟硬盘子系统检查差异虚拟硬盘中的块位图。然后硬盘子系统从差异虚拟硬盘中读取标记为dirty的扇区,并从母盘读取标记为clean的扇区。
例如,考虑在母盘映像和子硬盘映像中都保存扇区4096至8191的块。块的第一个扇区保存该块的位图。单个单元格表示位图中的一个位,黑点×××表示块中的特定扇区已被数据写入。
母盘数据块:
4096 |
4097 |
4098 |
4099 |
4100 |
4101 |
● 4102 |
● 4103 |
● 4104 |
4105 |
4106 |
4107 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
|||||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
|||||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
差异虚拟硬盘子数据块:
4096 |
4097 |
4098 |
4099 |
4100 |
4101 |
● 4102 |
● 4103 |
● 4104 |
4105 |
4106 |
4107 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
|||||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
|||||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
如果上层驱动发出从4098到4104的扇区的读取操作,则硬盘子系统将从母盘块读取扇区4098到4101,并且将从差异虚拟硬盘子块中读取4102到4104。
如果驱动针对扇区从4102到4106发出写操作,则整个数据将被写入差异虚拟硬盘子块,并且位图将被标记为dirty,用于差异虚拟硬盘子块中的扇区4105和4106。
差异虚拟硬盘子数据块:
4096 |
4097 |
4098 |
4099 |
4100 |
4101 |
● 4102 |
● 4103 |
● 4104 |
4105 |
4106 |
4107 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
|||||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
|||||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
针对扇区从4102到4106发出写操作:
4096 |
4097 |
4098 |
4099 |
4100 |
4101 |
● 4102 |
● 4103 |
● 4104 |
● 4105 |
● 4106 |
4107 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
dirty |
dirty |
|||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
dirty |
dirty |
|||||||||
Clean |
Clean |
Clean |
Clean |
Clean |
Clean |
dirty |
dirty |
dirty |
dirty |
dirty |
综上,使用差异虚拟硬盘模式时,会同时打开差异虚拟硬盘和它的母盘。当对一个差异虚拟硬盘进行写操作时,会把所写入的数据存储在差异虚拟硬盘上,不对母盘改动;当对其进行读操作时,如果所读数据已经修改,则读取存储在差异虚拟硬盘上的改动数据,数据没有改动则读取母盘的原始数据。如果读取的数据包含了母盘的原始数据和差异虚拟硬盘上的改动数据,则先读取母盘的原始数据,然后在读取差异虚拟硬盘上的改动数据并将其组合为统一的数据。
2、VHD虚拟硬盘的寻址过程
对于固定方式的VHD 文件,虚拟硬盘的扇区与文件的扇区顺序对应,对固定方式VHD 进行寻址,通过页脚区域查找对应扇区即可。
对于可扩展的VHD,其数据块由块分配表动态分配,其虚拟硬盘和VHD 文件的地址要经过层次的索引,进而达到存储或读写数据的目的。
详细说明如下:
(1)读可扩展VHD文件的页脚区域,通过页脚区域的“类型”“数据偏移量”等字段,确定是否是可扩展VHD 文件以及头部的位置在哪儿。
(2)读取头部,确定块大小,块分配表的位置和数量。
(3)找到块分配表,定位对应块分配条目,读取条目的值。
(4)根据分配表条目的值,确定其值(数据块的扇区位图地址)对应的数据块,读取扇区位图,确定数据区域的扇区使用情况,然后读取数据;若分配表条目的值为0xFFFFFFFF,说明该数据块未写入任何数据。
(1)读差异VHD文件的页脚区域,通过页脚区域的“类型”“数据偏移量”等字段,确定是否是差异VHD 文件以及头部的位置在哪儿。
(2)读取头部,通过头部中的“母盘UUID”、“母盘名称”及“母盘定位器”等字段确定母盘位置,然后确定差异虚拟硬盘本身的块大小,块分配表的位置和数量。
(3)找到母盘,重复可扩展模式下的寻址过程,找到所需要读取的数据;同时,其差异虚拟硬盘本身找寻自己的块分配表,定位对应块分配条目,读取条目的值。
(4)根据分配表条目的值,确定其值(数据块的扇区位图地址)对应的数据块,读取扇区位图,确定数据区域的扇区使用情况,然后读取数据;若分配表条目的值为0xFFFFFFFF,说明该数据块未写入任何数据。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注云搜网行业资讯频道,感谢您对云搜网的支持。