[资料][Win7 VHD]原生支持从VHD启动——Win7最强大的新功能
原生支持从VHD启动——Win7最强大的新功能
转载至
http://hi.baidu.com/ming6595/blog/item/caf188c47caa78c738db4978.html
什么是VHD?
VHD 全称 Virtual Hard Disk 中文名 虚拟硬盘
VHD其实应该被称作 VHD技术 或 VHD功能
就是能够把 一个VHD文件虚拟成一个硬盘的技术
VHD文件
其扩展名是.vhd
一个VHD文件可以被虚拟成 一个硬盘
在其中可以如在真实硬盘中一样操作:
读取、写入、创建分区、格式化
以下提到的VHD可 能指VHD技术也可能指VHD文件
VHD最早被 VPC(Windows Virtual PC 微软出品的虚拟机软件) 所采用
VHD是VPC创建的虚拟机的一部分 如同硬盘是电脑的一部分
VPC虚拟机里的文件存放在VHD上 如同电脑里的文件存在硬盘上
然后VHD被用于Vista完整系统备份
就是将完整的系统数据保存在一个VHD文件 之中
(Win7继承了此功能)
在Win7出现之前VHD一直默默无闻 如小家碧玉 不为人所知
但 是随着Win7的横空出世 VHD开始崭露头角 乃至大放异彩
VHD启动——Win7最强大的新功能?
Win7(Windows 7)和Server08(Windows Server 2008)增加了一项新功能:
原生支持从VHD启动(Native boot from VHD)
也就是说 在系统内核以及启动引导中 增加了对VHD的支持
以下主要讲解Win7原生支持从 VHD启动相关内容
这项功能的简单应用:
将Win7系统装入一个VHD文件中 将此VHD加入引导 就能启动VHD中的Win7系统
因为Win7原生支持这项功能 所以这时Win7系统是知道自己是运行在VHD中的 也能够很好地运行
如 果把VHD里的系统换成Vista或XP则不能运行 因为它们根本就不支持从VHD启动
原生支持从VHD启动 能带来什么变化呢?
首先 不用分区 就把系统文件和其它文件分隔开了
安装多个系统不用再分区 只需对应地创建几个文件即可
同时为单分区用户对系统的整体操作提供了可能
其次 利用差分磁盘 可以达到还原软件和虚拟机的效果
多级差分 相当于创建多个还原点
而多个同级差分 相当于复制出互不影响的多个相同的系统
创建差分磁盘是瞬间可以实现的
然后 差分的子VHD和父VHD之间还能合并差异链 相当于更新还原点
有差异才会合并 合并差异链的时间远小于备份完整系统的时间
另 外 通过备份某一级VHD文件 可以保存某个还原点
不过鉴于VHD文件使用过程中会逐渐增大至数G 此方法有一定限制
关 于 差分磁盘 多级差分 合并差异链 后面会有专门的解释说明
强大、快速、方便 原生支持从VHD启动 一个看似不起眼的功能 却蕴藏着巨大的潜力
它将带来系统使用、备份和还原等各方面的巨大变革 我们甚至有理由相信它将是Win7最强大的新功能!
如何创建并初始化VHD?
图形界面操作
在 计算机上右键 选择管理 进入计算机管理 在磁盘管理上右键 选择创建VHD 按照提示进行
创建VHD并附加后 在虚拟硬盘上右键 选择初始化后 按照提示进行即可
由于我们是以启动系统为目的创建VHD 除了虚拟硬盘格式选择动态扩展外 其它一般使用默认参数即可
关 于VHD的格式 动态扩展与固定大小 的选择 请看下文
CMD操作
以创建15G的C:\System \Win7.vhd为例
以下均以此VHD为例演示
-------------------------------------------------------
diskpart
create vdisk file="C:\System\Win7.vhd" maximum=15 TYPE=EXPANDABLE
sel vdisk file="C:\System\Win7.vhd"
attach vdisk
create partition primary
format fs=ntfs quick
-------------------------------------------------------
还 可以为其设定盘符 如设定为Z
-------------------------------------------------------
assign letter=Z:
-------------------------------------------------------
VHD格式的选择
动态扩展 和 固定大小 格式的VHD 都可以被引导启动 它们的不同之处在于:
动态扩展VHD的体积 在刚创建时很小 之后随写入其中的数据的增多而变大 设定的最大值是上限
而固定大小VHD的体积始终是设定值
子VHD继承父VHD体积 上限值 同时不论何种格式VHD的子VHD 都具有动态扩展VHD的特性
如果是动态扩展的VHD或子VHD被引导启动 开机时它们会扩展成最大体积 关机后又会恢复实际体积
要注意为此类VHD预留空间 如果VHD所在分区的剩余空间不足 系统将无法启动
若 子VHD被引导启动 父VHD的体积不受影响
创建固定大小的VHD 根据其体积设定大小 会耗费很长时间 而创建动态扩展的VHD只需瞬间
系统在 固定大小VHD里运行 理论上要比 在动态扩展VHD里运行 速度要快
然 而因为一般是从子VHD启动 就算父VHD是固定大小 其速度优势也无法体现 反而可能影响子VHD的速度
固定大小的VHD比之动态扩展 的VHD 劣势明显 所以一般不予考虑
如何附加 VHD?
附加VHD 即将VHD文件作为一个独立的分区(硬盘)挂载在系统中
图 形界面操作
在计算机上右键 选择管理 进入计算机管理 在磁盘管理上右键 选择附加VHD 之后按照提示进行即可
需要指 出的是 由于我们是以灌装系统为目的 所以一般不选只读模式
CMD操作
-------------------------------------------------------
diskpart
sel vdisk file="C:\System\Win7.vhd"
attach vdisk
-------------------------------------------------------
同 样可以为其设定盘符
-------------------------------------------------------
sel partition 1
assign letter=Z:
-------------------------------------------------------
如何将系统灌入VHD?
附加VHD后 对挂载的虚拟硬盘分区如对普通分区一样的操作即可
需要指出的是 由于是由真实硬盘上的引导文件直接将VHD内文件引导 进入VHD系统
所 以无需将VHD内的分区激活 或 在VHD上创建启动文件 只需将系统文件灌入即可
这也是 原生启动的VHD 和 VPC的VHD 之间的不同之处
如何引导VHD?
可 在CMD里操作 也可用其它图形界面工具
下面主要讲在CMD里如何操作
如果硬盘上已有系统和引导文件
方法一
-------------------------------------------------------
for /f "delims={,} tokens=2" %a in ('bcdedit -create -d "VHD Win7" -application osloader') do set guid=%a
bcdedit -set {%guid%} device vhd="[C:]\System\Win7.vhd"
bcdedit -set {%guid%} path \windows\system32\boot\winload.exe
bcdedit -set {%guid%} locale zh-CN
bcdedit -set {%guid%} inherit {bootloadersettings}
bcdedit -set {%guid%} osdevice vhd="[C:]\System\Win7.vhd"
bcdedit -set {%guid%} systemroot \windows
bcdedit -set {%guid%} nx optin
bcdedit -set {%guid%} detecthal yes
bcdedit -displayorder {%guid%} /addlast
-------------------------------------------------------
方法二
-------------------------------------------------------
set guid=4681e9bd-e7ec-11de-aa78-00e04db6baa2
bcdedit -create {%guid%} -d "VHD Win7" -application OSLOADER
bcdedit -set {%guid%} device vhd="[C:]\System\Win7.vhd"
bcdedit -set {%guid%} path \windows\system32\boot\winload.exe
bcdedit -set {%guid%} locale zh-CN
bcdedit -set {%guid%} inherit {bootloadersettings}
bcdedit -set {%guid%} osdevice vhd="[C:]\System\Win7.vhd"
bcdedit -set {%guid%} systemroot \windows
bcdedit -set {%guid%} nx optin
bcdedit -set {%guid%} detecthal yes
bcdedit -displayorder {%guid%} /addlast
-------------------------------------------------------
注 意:
当使用方法二 创建多个启动项时 需手动更改guid的值
如果硬盘上无系统和引导文 件
先附加VHD
如果VHD内系统未安装
-------------------------------------------------------
bcdboot Z:\windows /s C:
-------------------------------------------------------
注 意:Z为VHD盘符 C为活动分区盘符 下同
如果VHD内系统已安装
复制 其它Win7系统的启动文件(Boot和bootmgr) 到活动分区根目录 然后
-------------------------------------------------------
for /f %a in ('dir /b/ad Z:\Recovery') do if exist Z:\Recovery\%a\Winre.wim if exist Z:\Recovery\%a\boot.sdi set reuid=%a
set RE=40556474-50f7-11df-8cf5-002618534e59
set RO=40556475-50f7-11df-8cf5-002618534e59
set RA=40556472-50f7-11df-8cf5-002618534e59
bcdedit -store C:\Boot\BCD -set {bootmgr} device partition=C:
bcdedit -store C:\Boot\BCD -set {memdiag} device partition=C:
bcdedit -store C:\Boot\BCD -set {default} device vhd="[C:]\System\Win7.vhd"
bcdedit -store C:\Boot\BCD -set {default} osdevice vhd="[C:]\System\Win7.vhd"
bcdedit -store C:\Boot\BCD -set {%RE%} device ramdisk=[Z:]\Recovery\%reuid%\Winre.wim,{%RO%}
bcdedit -store C:\Boot\BCD -set {%RE%} osdevice ramdisk=[Z:]\Recovery\%reuid%\Winre.wim,{%RO%}
bcdedit -store C:\Boot\BCD -set {%RO%} ramdisksdidevice partition=Z:
bcdedit -store C:\Boot\BCD -set {%RO%} ramdisksdipath \Recovery\%reuid%\boot.sdi
bcdedit -store C:\Boot\BCD -set {%RA%} device vhd="[C:]\System\Win7.vhd"
bcdedit -store C:\Boot\BCD -set {%RA%} filedevice vhd="[C:]\System\Win7.vhd"
-------------------------------------------------------
注 意:RE RO RA的值根据复制的BCD文件确定 通过以下命令 可查看
-------------------------------------------------------
bcdedit -store C:\Boot\BCD -enum all
-------------------------------------------------------
如 何分离VHD?
分离VHD 即将VHD文件虚拟成的分区(硬盘)从系统中卸载
图形 界面操作
在计算机上右键 选择管理 进入计算机管理 选择磁盘管理 在虚拟的硬盘上右键选择分离VHD即可
如果不需要 千万别勾选 同时删除VHD文件 否则 你懂的
CMD操作
-------------------------------------------------------
diskpart
sel vdisk file="C:\System\Win7.vhd"
detach vdisk
-------------------------------------------------------
差分磁盘
何为差分磁盘?
差分磁盘是以某一VHD为母盘创建的读取操作映射到母盘 而写入操作直接作用于自身的VHD
差分磁盘 亦称 子VHD 或称 差分VHD
母盘 亦称 父VHD 或称 母VHD
本 文中的 差分 可能是指 创建差分磁盘 也可能是指 差分磁盘
关于差分磁盘 一个形象的比喻就是 母盘是一幅画 差分盘是附在画上的一张半透明的摹写纸
你能看到画的内容 可要想添上几笔 却只能画(写)在摹写纸上
以一个 VHD为母盘可创建多个差分盘 此为多个同级差分
以一个差分盘为母盘可创建另一个差分盘 此为多级差分
如何创建差分磁盘?
可用CMD或其它图 形界面工具创建
以下主要讲下如何在CMD下创建
创建一个一级差分盘
一 级差分盘即为以一个不以其它VHD为母盘的VHD为母盘创建的差分盘
以"C:\System\Win7.vhd"为母盘创建一级差分 盘"C:\System\Win7_child1.vhd"
-------------------------------------------------------
diskpart
create vdisk file="C:\System\Win7_child1.vhd" parent="C:\System\Win7.vhd"
-------------------------------------------------------
刚 创建的子VHD非常小 只有几十KB
把创建的VHD的名称改下再创建 即为创建多个同级差分盘
创建一个二级差分盘
二 级差分盘即为以一级差分盘为母盘创建的差分盘
以一级差分盘"C:\System\Win7_child1.vhd"为母盘创建二级差分 盘"C:\System\Win7_child2.vhd"
-------------------------------------------------------
diskpart
create vdisk file="C:\System\Win7_child2.vhd" parent="C:\System\Win7_child1.vhd"
-------------------------------------------------------
创 建高级差分盘可据此类推 此即为多级差分
差分磁盘 的限制
差分盘和母盘 必须在 同一目录下 否则 无法引导启动差分磁盘
另外根据我 的经验
系统不能在安装时从差分磁盘启动
必须引导启动独立的VHD才能完成系统安装
而在系统安装完成后可 以再改为从差分磁盘启动
合并差异链
在 子VHD和父VHD之间可以合并差异链
合并差异链 即是把对子VHD的修改应用到父VHD中去
合并差异链可多级 合并
如对二级子VHD进行一级合并 即把二级子VHD的修改应用到一级子VHD中 而父VHD不变
如对二级子VHD进行 二级合并 即把二级子VHD和一级子VHD的修改都应用到父VHD中去
多级合并可类推 而我们一般只用到一级合并
有 差异才会合并 对子VHD修改的多少决定了合并的时间
合并差异链之后 子VHD会被还原到初始状态
怎样合并差异 链
一般在CMD中操作
对"C:\System\Win7_child2.vhd"进行一级合并
-------------------------------------------------------
diskpart
sel vdisk file="C:\System\Win7_child2.vhd"
merge vdisk DEPTH=1
-------------------------------------------------------
其 中DEPTH参数控制着合并的级别
差分磁盘+合并 差异链=无限试用
我们总是要不断创建或更新还原点来使系统更符合自己的使用习惯
事 实上 我们不可能一直通过创建更高级别的子VHD来创建新的还原点
因为 子VHD级别越高 系统运行速度越慢
不过我们 可以更新还原点
如果对还原点直接修改的话 一旦出错 就会损失这个还原点
就如同 不经试用直接买东西 万一买的是劣质产品 就会砸在手里
直接的方法不行我们可以用间接的方法 想要修改父VHD先修改子VHD
这就如同 买东西前 先试用
如果修改失败的话 就瞬间还原(把子VHD删除再新建) 如同 退货后再试用新产品
如果修改成功的话 就保存修改(合并差异链) 如同 试用满意后购买
你可以一直使用子VHD 直至 你决定 瞬间还原 或 保存修改
就如同 拥有无限的试用期
这样我们就没有了必须对系统做出正确修改的压力 系统使用起来也会很顺心
试想如果可以无限试用 再决定是否购买 谁会不满意这种购物方式呢?
这就是我推荐的对VHD系统的一种基本使用方式
实际上对于VHD系统的部署 和使用方式
我们可以考虑更多、更深 VHD系统也会变得更强大、更方便
VHD系统高级应用实例:
还在备份系统?你out了!系统自带虚拟机?你没有看错!
以下从别处引用
限制
原生 VHD 有一下限制:
* 原生VHD 启动 只支持 下列版本:
o Windowsreg; 7 Enterprise
o Windowsreg; 7 Ultimate
o Windows Server 2008 R2
* 原生 VHD磁盘最大附加VHD文件并行数量约为512个。
* 原生VHD启动不支持系统休眠,但睡眠还是支持的。(不知道什么是休眠,睡眠的看这里http://www.hackline.net/a/school/xtrm/2009/0823/227.html)
* VHD 文件不能嵌套。即不能VHD下的VHD文件。
* 原生VHD启动不支持 服务器消息块(SMB)共享。(说实话,这个我也不是太清楚,虽说Windows的共享就是这个。)
* 不能在VHD文件卷上使用 Bitlocker 加密,并且 在VHD内部的卷也不能使用 bitlocker 。
* VHD 的父文件不能是卷快照的一部分。
* 附加VHD磁盘不能被配置成动态磁盘。
* VHD 的父文件不能被配置成动态磁盘。
1、从VHD启动之后的系统,到底是运行在虚拟机上?还是直接运行在物理硬件之上?
答: 是运行在物理硬件上。 在Win7以及WIn2008 R2 中的引导程序和系统本身都包含了对VHD文件的读写(虚拟)驱动程序,以及虚拟的VHD磁盘控制器。不要被这个虚拟所误导,这里指的是模拟硬件,比如最常 见的虚拟光驱。因此我们可以在启动计算机的时候,访问VHD并且从其上启动;也可以在Windows 7中直接创建、加载和卸载VHD文件。不过行为有些不同,这些驱动是在系统内核中的,系统本身也会知道自己运行在VHD文件上。因此,会把虚拟内存文件放 到非VHD磁盘的 物理磁盘上,也不会写入到VHD内部。
3、是否会有性能的损失?
答:会有一些损失,但很小可以忽略。 主要原因是对文件系统读写访问的时候,需要经过额外的一层VHD读写驱动的解析,这里面有一些微量的I/O性能开销,但是跟虚拟化的情况相比,性能基本上 接近了真机。下图是在网上找到的测试资料,有一组直接读取硬盘和读写VHD的比较,性能差别微乎其微。