深入研究Windows 7中的Virtual Hard Disk VHD 技术.docx
《深入研究Windows 7中的Virtual Hard Disk VHD 技术.docx》由会员分享,可在线阅读,更多相关《深入研究Windows 7中的Virtual Hard Disk VHD 技术.docx(8页珍藏版)》请在冰豆网上搜索。
![深入研究Windows 7中的Virtual Hard Disk VHD 技术.docx](https://file1.bdocx.com/fileroot1/2022-11/27/c484ee9f-4c7b-4100-a2bb-4477a6644a6f/c484ee9f-4c7b-4100-a2bb-4477a6644a6f1.gif)
深入研究Windows7中的VirtualHardDiskVHD技术
深入研究Windows7中的VirtualHardDisk(VHD)技术
发表了Windows7对VHD文件的内建支持和从VHD文件启动计算机这两篇博客后,陆续收到不少技术爱好者的电子邮件询问这些功能的细节、技术实现和应用场景。
在做了一些功课之后,我整理汇总了这篇文章,详细全面的讨论一下Windows7中VHD文件支持。
下面的一些信息和测试步骤都是根据Windows7 Build6801和Beta1的,这篇文章发表于2009年1月22日。
如果您看到这篇文章的时间比较晚了,可能有些具体的细节会随着Windows7的进一步开发而发生变化,敬请留意!
欢迎大家转载这篇文章,但请保证文章的完整性,并注明出处,谢谢!
理解VHD格式
绝大多数人最初接触VHD格式的文件,是在使用VirtualPC或者VirtualServer时,VHD是以文件形式存在的虚拟机的磁盘。
微软在2005年公开了VHD格式文件的全部细节,可以从微软的TechNet网站下载VirtualHardDiskImageFormatSpecification。
这说明了微软不仅仅要把VHD应用在虚拟机领域,更希望VHD能够成为一种新的磁盘格式和载体在业界得到更多的支持。
让我们抛开虚拟机,把目光集中在VHD文件本身。
VHD是一块虚拟的硬盘,不同于传统硬盘的盘片、磁头和磁道,VHD硬盘的载体是文件系统上的一个VHD文件。
如果大家仔细阅读VHD文件的技术标准,就会发现标准中定义了很多Cylinder、Heads和Sectors等硬盘特有的术语,来模拟针对硬盘的I/O操作。
既然VHD是一块硬盘,那么就可以跟物理硬盘一样,进行分区、格式化、读写等操作。
我们这可以这样认为,VHD也是硬盘的一种,就像2.5寸、3.5寸、SCSI、SATA、IDE等不同规格的硬盘一样,VHD是在一个文件中的硬盘。
Windows7支持VHD的技术实现方式
在讨论具体的技术实现方式之前,我们首先需要理解操作系统对磁盘和文件的管理。
操作系统有磁盘系统和文件系统两部分,分别处理对硬盘的I/O读写指令(磁盘系统),和管理硬盘之上的分区、数据和文件格式(文件系统)。
VHD是存在于文件之上的磁盘,可想而知它的技术实现必须横跨磁盘系统和文件系统这两部分。
如果您对操作系统中这一部分不是非常的了解,可以听一听微软网站上的Windows存储技术系列Webcast。
简单的说,要把VHD文件当作硬盘一样读写,必须有相应的驱动程序。
在VirtualPC和VirtualServer中,微软就是通过在虚拟机种加入VHD的驱动程序,使得虚拟机可以从VHD启动并进行后续的操作。
在Windows7中,微软把VHD的驱动内置进了操作系统,也包括在了Windows7的引导程序中。
这也就是说,我们可在使用Windows7的时候,直接访问VHD文件中的内容(把VHD的硬盘映射到一个盘符,后面会详细描述),也可以通过Windows7的引导程序,启动位于VHD磁盘上的另一个操作系统。
理解VHD驱动的工作细节,需要比较多的Windows底层知识,下图是一个比较简单和抽象的结构,可以发现,VHD的驱动是跟磁盘驱动和文件系统紧密结合的。
眼花缭乱的VHD应用
既然在Windows7中可以对VHD直接读写,让我们来看看这个强大的功能到底能有多少过人之处。
首先,我们可以用命令行工具Diskpart创建VHD文件!
(是的,命令行工具,你可能已经想到了自动化批处理和批量部署可以用到这个技术,没错,网管说:
要硬盘,于是,大量的VHD就被创建出来了…)
1:
diskpart
2:
createvdiskfile=c:
\windows7.vhdmaximum=25600type=fixed
3:
selectvdiskfile=c:
\windows7.vhd
4:
attachvdisk
5:
createpartitionprimary
6:
assignletter=r
7:
formatquicklabel=vhd
8:
exit
上面这段命令,创建了一个固定尺寸的VHD文件,并且进行了分区、分配盘符和格式化,一气呵成。
Diskpart还能做很多事情,具体参数,请参考这个文档,如果你不喜欢命令行,那么Windows7的磁盘管理工具,一样可以完成上述操作。
现在我们看看VHD在Windows7中直接访问的几种方法:
方法一:
如右图,Foo.VHD文件中可以包含一个以上的磁盘分区,这些分区都可以映射到Windows操作系统中,可以为之分配盘符,也可以映射到一个NTFS的目录。
方法二:
如右图,VHD的磁盘中可以包含VHD文件,这个VHD文件还可以被映射到操作系统中,目前版本的Windows支持2层嵌套VHD。
(我实在想不出有什么实际的用处,据说这个功能可能会在正式版中被去掉,以免把用户搞糊涂)
方法三:
如果你还没有被上面的嵌套VHD搞糊涂的话,让我们继续看右图。
还记得VHD文件的差异磁盘功能吧?
Bar.VHD在嵌套的基础上,使用物理C盘上的BarParent.VHD做成了一个差异磁盘。
其实这种方法还是挺实用的,不考虑嵌套,Foo.VHD可以使用BarParent.VHD做差异磁盘,如果这样的话,从Foo.VHD启动计算机,每次用完都通过批处理自动销毁,硬盘保护卡的市场,恐怕从此要消失了。
。
。
方法四:
如右图,我们可以把网络共享里面的VHD文件,映射到系统中来。
这个功能,结合上面的那个差异磁盘,对,小硬盘学生机,都不用硬盘保护卡勒!
这些功能的确令人眼花缭乱,我们冷静一下,看看VHD有什么局限性和功能上的限制:
∙最多可以同时映射的VHD文件数量是512个(似乎也够用了)
∙VHD磁盘的父分区,不支持VolumeSnapshot
∙映射的VHD磁盘,不能被配置为动态磁盘,也就是不能在VHD上建软RAID(知足吧,VHD实现已经很复杂了,软RAID就不要来添乱了)
从VHD启动计算机
如果说你对在Windows7中映射和使用VHD文件无动于衷,那么,我相信从VHD启动计算机一定会抓住你的眼球。
我之前提到了,在Windows7中,微软把VHD的驱动内置进了操作系统,也包括在了Windows7的引导程序中。
这也就是说,在启动计算机的阶段,Windows7的引导程序可以大摇大摆的直接访问VHD文件,并且启动VHD中安装的系统。
慢着,什么是Windows7的引导程序?
简单地说,引导程序就是在操作系统内核或用户应用程序运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备(加载必要的驱动程序)、建立内存映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。
我们在裸机上安装Windows7时,首先做的,就是把Windows7的引导程序写入磁盘的特殊位置。
Windows7的引导程序带有VHD驱动,因此可以从VHD启动。
要完成从VHD启动计算机,需要以下几个步骤:
你必须得让VHD中有一个操作系统先。
有几种办法,可以用VirtualPC或者VirtualServer安装一个操作系统在VHD文件中,然后运行Sysprep,接着关闭虚拟机,这个VHD文件就可以用了。
运行Sysprep是必须的,否则VHD下次启动时,仍旧加载虚拟机环境下的驱动程序,会导致蓝屏。
如果你想玩一个高级的,可以使用ImageX命令,把Vista的镜像,或者其它的磁盘镜像直接灌入VHD文件,下面是一个具体的演示。
这些命令把Vista镜像灌入一个VHD,并且使用WinPE在物理机的磁盘上载入Windows7的引导程序,用Windows7引导程序启动硬盘上的VHD文件,注意:
物理机本身没有安装Windows7!
1.用Diskpart创建VHD这里就不在赘述了,前面一段有这些命令。
接着前面的一段命令,我们首先使用ImageX把一个操作系统的镜像,灌入VHD文件。
WIM格式文件是Vista及以后版本Windows的安装镜像,在安装DVD中可以找到。
cd\d"c:
\programfiles\\tools\\"
imagex/apply1r:
\
2.WIM镜像被灌入VHD之后,使用Diskpart把VHD文件从当前的系统中卸载。
diskpart
selectvdiskfile=c:
\windows7.vhd
detachvdisk
exit
3.把这个准备好的VHD文件放到一个网络共享中备用。
netusey:
\\network_share\
copyc:
\windows7.vhdy:
\network_share\vhd\
4.使用Windows7版本的WinPE光盘启动你的试验计算机,并运行如下命令把当前磁盘上的分区和数据清空。
(注意,此操作会导致无法挽回的数据丢失,请一定要备份数据先)
diskpart
seldisk0
clean
5.接下来用Diskpart创建两个分区,分别是200M的S盘和默认剩余硬盘空间尺寸的C盘。
S也成为系统分区,用于保存Windows7的引导程序和相应必须的一些文件。
然后把刚才放到网络共享的VHD文件,复制到C盘的根目录。
createpartitionprimarysize=200
formatquickfs=ntfs
assignletter=s
active
createpartitionprimary
formatquickfs=ntfs
assignletter=c
exit
6.用Diskpart命令加载VHD到当前的WinPE环境下,访问VHD中的WindowsSystem32目录,并执行bcdboot命令完成启动所必需的初始化配置。
bcdboot这个命令很神气,文档中的具体描述是:
UsetheBCDboottool,locatedinthe\System32directoryoftheWindows7VHD,tocopytheboot-environmentfilesfromthe\WindowsdirectoryintheVHDtothesystempartition.TheBCDboottoolwillcreatetheBCDconfigurationtobootfromtheVHD.FormoreinformationabouttheBCDboottool,seeBCDbootCommand-LineOptionsintheOEMPreinstallationKit(OPK)User'sGuideortheWindowsAutomatedInstallationKit(WindowsAIK)User'sGuide.
diskpart
selectvdiskfile=c:
\windows7.vhd
attachvdisk
exit
cdv:
\windows\system32
bcdbootv:
\windows/ss:
7.把WinPE光盘从光驱中移走,重启试验计算机,你会发现系统直接进入了VHD里面的Windows7!
8.如果你想在已有的Windows7环境下配置配置一个从VHD的多启动选项,可以使用BCDEdit命令。
(具体操作步骤在此)
上图是从VHD启动的大致结构,请注意VHD中操作系统的页面文件和Crashdump,不是包含在VHD中的,他们被保存在VHD文件的同一个目录中。
我们也需要了解一下VHD启动的一些注意事项和局限性:
1.从VHD启动是有版本限制的,目前(2009年1月)的文档指出只有WindowsServer2008R2、Windows7商业版及以上版本,才支持此功能,未来正式发布时可能会有变化,敬请留意。
2.UDFS文件系统暂时不被支持(UDFS是什么?
不支持也罢…)
3.启动用的VHD文件,不能保存在压缩或者加密的NTFS磁盘之上(这一点很多人会忽略)
4.根据一些朋友的反馈,动态的VHD文件无法启动,需要在建立vhd是设置成立即分配才可以从vhd启动
5.如果你的物理硬盘是RAID格式,则必须要在VHD中的操作系统镜像中注入RAID的驱动程序,可以使用peimg命令。
这个我没有测试过,感谢yueyezhan的反馈
性能性能性能
大家一定关心VHD的性能问题。
相比物理磁盘,VHD的读写I/O性能指标对比如下,测试数据根据Windows7Build6801获得,这些数据在近期的WinHEC大会上获得的。
我们可以发现,相对于物理硬盘,VHD的读写开销非常小,只有在进行连续区块写入操作时,才跟物理硬盘有较明显的性能差异。
引用一些网友关于VHD的描述:
实验成功!
原系统是win7X86,灌装了一个X64的win7,在虚拟机里vhd上的X64win7成功启动
速度上感觉不出有差异
已经成功从VHD启动
从磁盘管理可以看到当前系统盘C盘也就是20G的DISK2当然是VHD的啦,呵呵.
启动和运行速度和真机差不多吧~~
结论就是很好很强大,有着和真机几乎一样的速度,可以照完所有3D游戏,
说白了用起来和真机几乎没任何区别。
Win7让多系统变得简单,
根本不用为分区烦恼,一个系统就一个vhd镜像,蹦了复制一份替换即可,
就像用虚拟机一样。
当然虚拟的系统貌似只能是Win7及以上系统如server2008R2。
企业应用场景和未来展望
个人用户的多启动解决方案
企业操作系统的批量部署
接合差异磁盘的无盘(小盘)工作站,可以替代硬盘保护卡
就说这么多吧,还从来没有在LiveWeiter里面一下在写这么多内容呢,接下来大家多多做试验,集思广益吧!