无忧启动论坛

标题: 从VHD启动Win7 [打印本页]

作者: ming6595    时间: 2010-12-16 00:59
标题: 从VHD启动Win7
本帖最后由 ming6595 于 2014-9-24 20:07 编辑

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


本文原创 转载请注明出处




什么是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


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

还可以为其设定盘符 如设定为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\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


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

注意:

当使用方法二 创建多个启动项时 需手动更改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会被还原到初始状态


怎样合并差异链

一般在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系统也会变得更强大、更方便


[ 本帖最后由 ming6595 于 2011-4-24 19:04 编辑 ]
作者: ming6595    时间: 2010-12-16 01:02
以下从别处引用

原生 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 的父文件不能被配置成动态磁盘。

从VHD启动之后的系统,到底是运行在虚拟机上?还是直接运行在物理硬件之上?
答:是运行在物理硬件上。 在Win7以及WIn2008 R2 中的引导程序和系统本身都包含了对VHD文件的读写(虚拟)驱动程序,以及虚拟的VHD磁盘控制器。不要被这个虚拟所误导,这里指的是模拟硬件,比如最常见的虚拟光驱。因此我们可以在启动计算机的时候,访问VHD并且从其上启动;也可以在Windows 7中直接创建、加载和卸载VHD文件。不过行为有些不同,这些驱动是在系统内核中的,系统本身也会知道自己运行在VHD文件上。因此,会把虚拟内存文件放到非VHD磁盘的 物理磁盘上,也不会写入到VHD内部。


是否会有性能的损失?
答:会有一些损失,但很小可以忽略。 主要原因是对文件系统读写访问的时候,需要经过额外的一层VHD读写驱动的解析,这里面有一些微量的I/O性能开销,但是跟虚拟化的情况相比,性能基本上接近了真机。下图是在网上找到的测试资料,有一组直接读取硬盘和读写VHD的比较,性能差别微乎其微。


[ 本帖最后由 ming6595 于 2011-4-24 19:04 编辑 ]
作者: 445112826    时间: 2010-12-16 21:39
好帖,学习。打算有时间照楼主的方法造一个win7VHD用用看。
作者: jebbs    时间: 2011-1-7 11:37
很全面的介绍,顶~~~~~~~~
作者: 2010zgczq    时间: 2011-3-2 16:25
VHD的基础知识,看了以后不再是一头雾水了
作者: MR.L    时间: 2011-3-4 19:47
说的很详细,终于能比较清楚的明白了
作者: 2011wueng2007    时间: 2011-3-5 11:45
這真是很值得學習的技術,頂到深處
作者: 2011laobei    时间: 2011-3-9 14:21
创建和附加都是在同一虚拟硬盘上吗?
作者: 2011附子    时间: 2011-3-15 03:00
这个太强大了,建议斑竹置顶!!!
作者: imsidac    时间: 2011-3-16 16:46
非常好的文章,先支持再看
作者: 2011killwintel    时间: 2011-4-3 17:41
不顶不要看了。非常之完美。
作者: lvzhhai    时间: 2011-4-15 21:56
这是在无忧看到的最好的帖子。通俗易懂,逻辑透彻。顶一下。
作者: tinyhe    时间: 2011-8-30 12:49
学习了,多谢~~~!
作者: 小豪diao    时间: 2011-9-18 12:07
你好,看了帖子,有几个地方不懂。求教
里面的设定
set RE=40556474-50f7-11df-8cf5-002618534e59
set RO=40556475-50f7-11df-8cf5-002618534e59
set RA=40556472-50f7-11df-8cf5-002618534e59

RE,RO ,RA分别指代什么呢,

我只看得懂RA是VHD系统的菜单项。
剩下两个都是加载到内存上的,

RE是WIM的(这个是PE吗)

ROboot.sdi(这个是恢复项吗)

另外,你文章里面的%RA%挂载命令是:
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"

我想指代,为什么是“filedevice VHD=”而不是平常的“OSdevice VHD=”
有什么区别吗
作者: 白手王    时间: 2011-12-28 01:58
很详细!认识了VHD了
作者: 2011lxnaxx    时间: 2011-12-29 13:20
刚刚接触vhd学习学习
作者: 2011xilou    时间: 2012-1-11 11:49
先顶再仔细拜读。。=




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3