注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

元元流长

用心才能够成功

 
 
 

日志

 
 
 
 

VHD启动  

2011-08-23 21:20:20|  分类: 技术相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

什么是VHD?

VHD 全称 Virtual Hard Disk 中文名 虚拟硬盘

VHD其实应该被称作 VHD技术 或 VHD功能

就是能够把一个VHD文件虚拟成一个硬盘的技术

VHD文件

其扩展名是.vhd

一个VHD文件可以被虚拟成一个硬盘

在其中可以如在真实硬盘中一样操作:

读取、写入、创建分区、格式化

以下提到的VHD可能指VHD技术也可能指VHD文件

VHD最早被 VPC(Windows Virtual PC 微软出品的虚拟机软件) 所采用

VHDVPC创建的虚拟机的一部分 如同硬盘是电脑的一部分

VPC虚拟机里的文件存放在VHD上 如同电脑里的文件存在硬盘上

然后VHD被用于Vista完整系统备份

就是将完整的系统数据保存在一个VHD文件之中

(Win7继承了此功能 Win7VHD备份还可被引导启动 引导启动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里的系统换成VistaXP则不能运行 因为它们的系统内核不支持从VHD启动

原生支持从VHD启动 能带来什么变化呢?

首先 不用分区 就把系统文件和其它文件分隔开了

     安装多个系统不用再分区 只需对应地创建几个文件即可

     同时为单分区用户对系统的整体操作提供了可能

其次 利用差分磁盘 可以达到还原软件和虚拟机的效果

     多级差分 相当于创建多个还原点

     而多个同级差分 相当于复制出互不影响的多个相同的系统

     创建差分磁盘是瞬间可以实现的

然后 差分的子VHD和父VHD之间还能合并差异链 相当于更新还原点

     有差异才会合并 合并差异链的时间远小于备份完整系统的时间

另外 通过备份某一级VHD文件 可以保存某个还原点

     不过鉴于VHD文件使用过程中会逐渐增大至数G 此方法有一定限制

关于 差分磁盘 多级差分 合并差异链 后面会有专门的解释说明

强大、快速、方便 原生支持从VHD启动 一个看似不起眼的功能 却蕴藏着巨大的潜力

它将带来系统使用、备份和还原等各方面的巨大变革 我们甚至有理由相信它将是Win7最强大的新功能!

如何创建并初始化VHD?

图形界面操作

在计算机上右键 选择管理 进入计算机管理 在磁盘管理上右键 选择创建VHD 按照提示进行

创建VHD并附加后 在虚拟硬盘上右键 选择初始化后 按照提示进行即可

由于我们是以启动系统为目的创建VHD 除了虚拟硬盘格式选择动态扩展外 其它一般使用默认参数即可

关于VHD的格式 动态扩展与固定大小 的选择 请看下文

CMD操作

以创建15GC:\System\Win7.vhd为例

以下均以此VHD为例演示

-------------------------------------------------------

1.      diskpart

2.      create vdisk file="C:\System\Win7.vhd" maximum=15368 TYPE=EXPANDABLE

3.      sel vdisk file="C:\System\Win7.vhd"

4.      attach vdisk

5.      create partition primary

6.      format fs=ntfs quick

复制代码

-------------------------------------------------------

还可以为其设定盘符 如设定为Z

-------------------------------------------------------

1.      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操作

-------------------------------------------------------

1.      diskpart

2.      sel vdisk file="C:\System\Win7.vhd"

3.      attach vdisk

复制代码

-------------------------------------------------------

同样可以为其设定盘符

-------------------------------------------------------

1.      sel partition 1

2.      assign letter=Z:

复制代码

-------------------------------------------------------

如何将系统灌入VHD?

附加VHD后 对挂载的虚拟硬盘分区如对普通分区一样的操作即可

需要指出的是 由于是由真实硬盘上的引导文件直接将VHD内文件引导 进入VHD系统

所以无需将VHD内的分区激活 或 在VHD上创建启动文件 只需将系统文件灌入即可

这也是 原生启动的VHD VPCVHD 之间的不同之处

如何引导VHD?

可在CMD里操作 也可用其它图形界面工具

下面主要讲在CMD里如何操作

如果硬盘上已有系统和引导文件

方法一

-------------------------------------------------------

1.      for /f "delims={,} tokens=2" %a in ('bcdedit -create -d "VHD Win7" -application osloader') do set guid=%a

2.      bcdedit -set {%guid%} device vhd="[C:]\System\Win7.vhd"

3.      bcdedit -set {%guid%} path \windows\system32\winload.exe

4.      bcdedit -set {%guid%} locale zh-CN

5.      bcdedit -set {%guid%} inherit {bootloadersettings}

6.      bcdedit -set {%guid%} osdevice vhd="[C:]\System\Win7.vhd"

7.      bcdedit -set {%guid%} systemroot \windows

8.      bcdedit -set {%guid%} nx optin

9.      bcdedit -set {%guid%} detecthal yes

10.   bcdedit -displayorder {%guid%} /addlast

复制代码

-------------------------------------------------------

方法二

-------------------------------------------------------

1.      set guid=4681e9bd-e7ec-11de-aa78-00e04db6baa2

2.      bcdedit -create {%guid%} -d "VHD Win7" -application OSLOADER

3.      bcdedit -set {%guid%} device vhd="[C:]\System\Win7.vhd"

4.      bcdedit -set {%guid%} path \windows\system32\winload.exe

5.      bcdedit -set {%guid%} locale zh-CN

6.      bcdedit -set {%guid%} inherit {bootloadersettings}

7.      bcdedit -set {%guid%} osdevice vhd="[C:]\System\Win7.vhd"

8.      bcdedit -set {%guid%} systemroot \windows

9.      bcdedit -set {%guid%} nx optin

10.   bcdedit -set {%guid%} detecthal yes

11.   bcdedit -displayorder {%guid%} /addlast

复制代码

-------------------------------------------------------

注意:

当使用方法二 创建多个启动项时 需手动更改guid的值

如果硬盘上无系统和引导文件

先附加VHD

如果VHD内系统未安装

-------------------------------------------------------

1.      bcdboot Z:\windows /s C:

复制代码

-------------------------------------------------------

注意:ZVHD盘符 C为活动分区盘符 下同

如果VHD内系统已安装

复制 其它Win7系统的启动文件(Bootbootmgr) 到活动分区根目录 然后

-------------------------------------------------------

1.      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

2.      set RE=40556474-50f7-11df-8cf5-002618534e59

3.      set RO=40556475-50f7-11df-8cf5-002618534e59

4.      set RA=40556472-50f7-11df-8cf5-002618534e59

5.      bcdedit -store C:\Boot\BCD -set {bootmgr} device partition=C:

6.      bcdedit -store C:\Boot\BCD -set {memdiag} device partition=C:

7.      bcdedit -store C:\Boot\BCD -set {default}   device vhd="[C:]\System\Win7.vhd"

8.      bcdedit -store C:\Boot\BCD -set {default} osdevice vhd="[C:]\System\Win7.vhd"

9.      bcdedit -store C:\Boot\BCD -set {%RE%}   device ramdisk=[Z:]\Recovery\%reuid%\Winre.wim,{%RO%}

10.   bcdedit -store C:\Boot\BCD -set {%RE%} osdevice ramdisk=[Z:]\Recovery\%reuid%\Winre.wim,{%RO%}

11.   bcdedit -store C:\Boot\BCD -set {%RO%} ramdisksdidevice partition=Z:

12.   bcdedit -store C:\Boot\BCD -set {%RO%} ramdisksdipath \Recovery\%reuid%\boot.sdi

13.   bcdedit -store C:\Boot\BCD -set {%RA%}     device vhd="[C:]\System\Win7.vhd"

14.   bcdedit -store C:\Boot\BCD -set {%RA%} filedevice vhd="[C:]\System\Win7.vhd"

复制代码

-------------------------------------------------------

注意:RE RO RA的值根据复制的BCD文件确定 通过以下命令 可查看

-------------------------------------------------------

1.      bcdedit -store C:\Boot\BCD -enum all

复制代码

-------------------------------------------------------

如何分离VHD?

分离VHD 即将VHD文件虚拟成的分区(硬盘)从系统中卸载

图形界面操作

在计算机上右键 选择管理 进入计算机管理 选择磁盘管理 在虚拟的硬盘上右键选择分离VHD即可

如果不需要 千万别勾选 同时删除VHD文件 否则 你懂的

CMD操作

-------------------------------------------------------

1.      diskpart

2.      sel vdisk file="C:\System\Win7.vhd"

3.      detach vdisk

复制代码

-------------------------------------------------------

差分磁盘

何为差分磁盘?

差分磁盘是以某一VHD为母盘创建的读取操作映射到母盘而写入操作直接作用于自身的VHD

差分磁盘 亦称 子VHD 或称 差分VHD

母盘 亦称 父VHD 或称 母VHD

本文中的 差分 可能是指 创建差分磁盘 也可能是指 差分磁盘

关于差分磁盘 一个形象的比喻就是 母盘是一幅画 差分盘是附在画上的一张半透明的摹写纸

你能看到画的内容 可要想添上几笔 却只能画()在摹写纸上

以一个VHD为母盘可创建多个差分盘 此为多个同级差分

以一个差分盘为母盘可创建另一个差分盘 此为多级差分

如何创建差分磁盘?

可用CMD或其它图形界面工具创建

以下主要讲下如何在CMD下创建

创建一个一级差分盘

一级差分盘即为以一个不以其它VHD为母盘的VHD为母盘创建的差分盘

"C:\System\Win7.vhd"为母盘创建一级差分盘"C:\System\Win7_child1.vhd"

-------------------------------------------------------

1.      diskpart

2.      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"

-------------------------------------------------------

1.      diskpart

2.      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"进行一级合并

-------------------------------------------------------

1.      diskpart

2.      sel vdisk file="C:\System\Win7_child2.vhd"

3.      merge vdisk DEPTH=1

复制代码

-------------------------------------------------------

其中DEPTH参数控制着合并的级别

差分磁盘+合并差异链=无限试用

我们总是要不断创建或更新还原点来使系统更符合自己的使用习惯

事实上 我们不可能一直通过创建更高级别的子VHD来创建新的还原点

因为 子VHD级别越高 系统运行速度越慢

不过我们可以更新还原点

如果对还原点直接修改的话 一旦出错 就会损失这个还原点

就如同 不经试用直接买东西 万一买的是劣质产品 就会砸在手里

直接的方法不行我们可以用间接的方法 想要修改父VHD先修改子VHD

这就如同 买东西前 先试用

如果修改失败的话 就瞬间还原(把子VHD删除再新建) 如同 退货后再试用新产品

如果修改成功的话 就保存修改(合并差异链) 如同 试用满意后购买

你可以一直使用子VHD 直至 你决定 瞬间还原 或 保存修改

就如同 拥有无限的试用期

这样我们就没有了必须对系统做出正确修改的压力 系统使用起来也会很顺心

试想如果可以无限试用 再决定是否购买 谁会不满意这种购物方式呢?

这就是我推荐的对VHD系统的一种基本使用方式

实际上对于VHD系统的部署和使用方式

我们可以考虑更多、更深 VHD系统也会变得更强大、更方便

  评论这张
 
阅读(662)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018