分享

原生支持从VHD启动——Win7最强大的新功能

 qinmingk 2011-10-08

                原生支持从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系统也会变得更强大、更方便

"Win7 VHD Tools V4.0"——安装和维护“Win7 VHD 系统”好工具




VHD系统高级应用实例:


还在备份系统?你out了!系统自带虚拟机?你没有看错!

以下从别处引用

 

限制
原生 VHD 有一下限制:

* 原生VHD 启动 只支持 下列版本:
o Windowsreg; 7 Enterprise
o Windowsreg; 7 Ultimate
o Windows Server 2008 R2

* 原生 VHD磁盘最大附加VHD文件并行数量约为512个。
* 原生VHD启动不支持系统休眠,但睡眠还是支持的。(不知道什么是休眠,睡眠的看这里http://www./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的比较,性能差别微乎其微。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多