2011-03-14 20:18:55| 分类: 计算机与Internet | 标签: |举报 |字号大中小 订阅
原生支持从VHD启动——Win7最强大的新功能
安装多系统不用对硬盘重新分区、不需要安装虚拟机,性能几乎不打折扣,系统VHD备份可直接引导启动,还原速度快。
出处-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备份还可被引导启动 引导启动VHD见下文)
在Win7出现之前VHD一直默默无闻 如小家碧玉 不为人所知
但是随着Win7的横空出世 VHD开始崭露头角 乃至大放异彩
VHD启动——Win7最强大的新功能?
Win7(Windows 7)和Server08 R2(Windows Server 2008 R2)增加了一项新功能:
原生支持从VHD启动(Native boot from VHD)
也就是说 在系统内核以及启动引导中 增加了对VHD的支持
以下主要讲解Win7原生支持从VHD启动相关内容
这项功能的简单应用:
将Win7系统装入一个VHD文件中 将此VHD加入引导 就能启动VHD中的Win7系统
如果把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=15368 TYPE=EXPANDABLE
sel vdisk file="C:\System\Win7.vhd"
attach vdisk
create partition primary
format fs=ntfs quick
assign letter=Z:
diskpart
sel vdisk file="C:\System\Win7.vhd"
attach vdisk
sel partition 1
assign letter=Z:
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\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\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
bcdboot Z:\windows /s C:
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"
bcdedit -store C:\Boot\BCD -enum all
diskpart
sel vdisk file="C:\System\Win7.vhd"
detach vdisk
diskpart
create vdisk file="C:\System\Win7_child1.vhd" parent="C:\System\Win7.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会被还原到初始状态
怎样合并差异链
一般在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系统高级应用实例:
"Win7 VHD Tools V4.0"——安装和维护“Win7 VHD 系统”好工具
以下从别处引用
限制
原生 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的比较,性能差别微乎其微。
评论