代码改变世界

Win7/R2 原生VHD 启动

2009-10-30 03:11 by G yc {Son of VB.NET}, ... 阅读, ... 评论, 收藏, 编辑

    以前,虽然听说过这个特性,但一直没有尝试过。
    最近有机会尝试了一下,本以为是很难的东西,但实际操作起来,还是很简单的。

    首先,先解释一下什么是 原生 VHD 启动(Native VHD Boot)?

    实际上,Win7可以 启动VHD 里面的系统,并且里面的系统知道运行在 VHD磁盘上。

    那么VHD是什么? VHD是MS的虚拟硬盘文件,实际上,如果用过VPC,Virtual Server,Hyper-V,Windows Virtual PC,那么你应该也会知道了。(注:前2个可能不适用制作VHD文件)

    现在大家应该知道这个启动是怎么回事了,如果还没有理解,可以这么想想一下,在Win7内核 以及 启动引导中,增加了对 VHD 文件 的磁盘控制器的虚拟硬件。

    好的,接下来,说说 要求和限制

    要求

    VHD启动需要依赖一下几点:

    • 磁盘上至少有2个分区:一个是作为启动的,另一个是用来存放文件的。(注意不要加密)
    • 包含VHD文件的分区必须拥有足够大的可用空间。(稍后说明)

    限制

    原生 VHD 有一下限制:

    • 原生VHD 启动 只支持 下列版本:
      • Windows® 7 Enterprise
      • Windows® 7 Ultimate
      • 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的启动引导,还需要 Win7 系统,即VHD里面的安装的是 WIn7或者 WIn2008 R2。想安装XP是不可能的了。

    那么,接下来说说制作步骤。

    整个过程大概分成2部分。

    1、准备VHD镜像

    2、部署VHD镜像

     

    1、准备 VHD镜像文件

    这个部分又分成2中方式,一是从 安装镜像中,直接提取系统文件。二是在虚机中安装系统,然后使用sysprep 进行封装。

    1.1、从安装镜像提取文件

    这个需要用到 Windows(R) 7 的 Windows(R) 自动安装工具包 (AIK) 中的ImageX 工具。

    在开始之前,先说一下,我的实验环境是 Win2008 R2 虚机 ,并且已经安装了Win7的AIK。

    为了以后的方便,(为了以后),先把安装光盘中的文件复制到硬盘上, 例如 D:\Sources

    clip_image001

    首先是建立VHD磁盘,步骤如下:

    1: 在单击开始,输入“Diskmgmt.msc”,启动磁盘管理。

    clip_image002

    2: 单击 “显示/隐藏控制台树”(位于“磁盘管理”中)按钮。

    clip_image003

    3: 在“磁盘管理 (框线项目)”上右键单击。

    clip_image004

    4: 单击“创建 VHD (菜单项目)”。

    clip_image005

    5: 单击“浏览(B)... ” ,并选择一个虚拟磁盘的保存位置, 并起一个文件名,这里是“Test.vhd”,然后单击保存。

    clip_image006clip_image007clip_image008

    6: 选择一个磁盘类型,这里选择“动态扩展(D) ”。(注:选择哪个都可以,只不过,选择固定的创建起来有点费时,另外,后期可以通过虚机的磁盘管理器进行转换。)

    clip_image009

    7: 在“虚拟硬盘大小(S): ” 输入要创建的虚拟硬盘大小,这里输入“60” 单位选择“GB”,然后单击确定。 (注:有关这个大小的注意,请看后面)

    clip_image010clip_image011

    8: 在“磁盘管理”中,右键单击新建的磁盘 行头,选择“初始化磁盘(I) ”。

    clip_image012

    9: 在弹出的“初始化磁盘”对话框中,选择需要初始化的磁盘,并单击“确定”。

    clip_image013

    10: 右键单击 虚拟磁盘的空白区域,选择“新建简单卷(I)... ”。

    clip_image014

    11: 按照“新建简单卷向导”中的提示操作,创建一个新的分区。

    clip_image015clip_image016clip_image017clip_image018clip_image019

    再来就是提取安装镜像文件

    1: 单击“开始”,“所有程序”,“Microsoft Windows AIK ” ,单击 “部署工具命令提示 ”,打开 PE环境控制台。(如果不这么做的话,会提示ImageX 文件无法找到,当然,你也可以指定完整路径)

    clip_image020

    2: 在“管理员: 部署工具命令提示”中输入 “imagex /apply "D:\Sources\Win7 X64\sources\install.wim" "Windows 7 ULTIMATE" g:\”,展开镜像

    (解释一下,Imagex是WIM的编辑的工具, /apply 是解压 ,

    "D:\Sources\Win7 X64\sources\install.wim" 是Win7X64安装盘所在位置(install.wim是固定的),

    "Windows 7 ULTIMATE" 是Win7版本,这个是必须是影响中已经存在的,可以通过 “imagex /info 安装镜像WIM文件 "D:\Sources\Win7 X64\sources\install.wim" ”来查看

    g:\ 要解压到的位置)

    clip_image021clip_image022

    好,到此为止就算解压完镜像文件了。

    如果你想放入自动应答,让安装程序自动完成一部分。可以现在就做,否则,跳过。

    1、定位到虚拟磁盘上的 Windows 目录下,然后新建一个文件夹,名字是“Panther”(注:一定要是这个名字)

    2、然后将应答文件复制到这个目录中,并重命名为“unattend.xml”。(注:一定要是这个名字)

    3、如果应答文件中,使用了其他工具或者批处理文件,请将这些文件复制到对应的路径中。

    那么接下来,就是卸载VHD虚拟磁盘文件了

    1: 打开“磁盘管理”,在虚拟磁盘的行标头上右键单击,选择 “分离 VHD ”。

    clip_image023

    2: 在“分离虚拟硬盘”对话框中单击“确定”,即可分离磁盘了。

    clip_image024

    1.2 使用虚机制作VHD文件

    其实,使用虚机制作,就是用虚机去安装系统,然后把VHD文件拿出来。(注:VPC ,Virtual Server 安装的系统在部署后可能会有问题)

    这里我以Hyper-V 虚机为例,进行演示。

    1、打开“Hyper-V 管理器”,在操作中选择“新建”,“虚拟机”。

    clip_image025

    2、在打开的 “新建虚拟机向导”对话框,单击下一步,输入虚机的名字,然后单击下一步。

    clip_image026

    3、设置分配给虚机的内存,这里输入1024,即1G,然后单击下一步。(注:内存最少可以是512M,最大是物理内存大小,请根据具体情况选择合适大小)

    clip_image027

    4、配置网络,选择一个可用的网络,如果想配置干净的虚机,可以不设置或者选择一个不能上网的测试网络,免得安装补丁,单击下一步继续。

    clip_image028

    5、创建虚拟磁盘,可以创建一个新的虚拟磁盘,也可以选择一个现有的,单击下一步继续。(关于虚拟磁盘的大小问题,稍后会有说明)

    clip_image029

    6、设置安装光盘镜像的位置,单击下一步继续。

    clip_image030

    7、单击 “完成”,开始创建虚机。

    clip_image031

    8、在“Hyper-V 管理器”中,选中新建的虚机,单击操作中的连接。

    clip_image032

    9、启动虚机,并安装系统。

    clip_image033

    10、(可选)如果希望减少以后安装的麻烦,可以现在先安装上必要的工具。(如:VS,输入法,什么的)(注:虚机插件可以不用安装,Win7自带了对Hyper-V的驱动)

    11、封装系统,用管理员权限打开命令行, 执行如下命令:(如果怕出问题,可以先做个备份或者快照)

    如果,你安装的系统是WIn7,请先执行这个,否则封装将会出错。Win2008R2没有这个问题。

    “Net stop WMPNetworkSvc”

    (关闭 “Windows Media Player Network Sharing Service”服务)

    “cd %windir%\system32\sysprep”

    “sysprep.exe /oobe /shutdown /unattend:win7.xml”

    (/unattend 是 设置自动应答文件的,如果不需要可以不指定)

    clip_image034

    当封装完毕后,虚机系统会自动关闭。

    然后,我们可以在优化一下VHD文件的大小。

    1、参考上一部分的内容,将VHD文件附加到计算机上。

    2、然后 清理一下 VHD的虚拟磁盘上的东西,比如可以删除页面文件(pagefile.sys),还有者临时文件夹的内容。

    3、清理完后,卸载VHD镜像。

    4、在“Hyper-V 管理器”中,选中 对应的虚机,然后单击 右边的 “设置”。

    5、选中 “硬盘驱动器”,确认磁盘文件所在位置。

    5、在“Hyper-V 管理器”中选择,“编辑器磁盘”。

    clip_image035

    6、在“编辑虚拟磁盘向导“对话框中单击下一步继续。

    clip_image036

    7、选择刚才确定文件位置,然后单击下一步继续。

    clip_image037

    8、选择 “压缩”,然后单击下一步。

    clip_image038

    9、单击确定,开始压缩VHD。

    clip_image039

    好,这样就获得了VHD系统文件。

    VHD的准备就到此结束了。

    然后就是系统部署了。

    (压缩之后,一般可以大幅度的减少大小,我这成功的将40G清理到30G,这样在部署下载时候,能提高速度。)

    2、 部署VHD文件

    部署VHD也分成2个部分,一个是裸机部署,一个是在已有系统上进行部署。

    那么先从裸机部署开始。

    在开始之前,请先把要部署的VHD文件放到 共享中,或者FTP中。

    2.1 裸机部署VHD 文件

    所谓的裸机,是指硬盘上没有系统,或者要把原有硬盘内的东西清理掉,从而,机器中没有启动引导的一种状态。

    1、使用 Win7或者Win2008R2的安装光盘,U盘也可以,启动机器。(注: 在启动之前,可以往U盘中复制一些FTP工具等,方便操作。至于使用是X64位还是X86安装盘,请根据VHD文件内的系统类型选择。还有X64的安装盘启动的PE里面也是X64的,精简掉了32位运行子系统,所以工具需要是64位版的)

    2、进入安装界面后,选择好正确的语言,单击“下一步”。

    clip_image040

    3、选择“修复计算机”,稍等一会,之后出来系统恢复选项,单击下一步,然后选择“命令提示符”。

    clip_image041clip_image042clip_image043

    4、可以先输入“start”命令,打开一个新的命令行窗口, 然后在输入“startnet” 开启网络支持。

    clip_image044

    5、切换到另一个窗口,输入“Diskpart”,对系统进行分区。

    6、(可选)清除硬盘上的分区,在命令提示窗口中输入:

     

    List Disk 查看系统上磁盘
    Select disk 1 选择一个系统硬盘,根据上面返回的索引信息。
    Clean 清除磁盘上的所有内容。

    clip_image045

    7、创建系统分区(用于启动引导)。例如,这里建立一个100MB的系统分区。在命令提示窗口中输入:

    create partition primary size=100 
    format quick fs=ntfs 
    assign letter=
    active

    创建分区
    格式化
    分配盘符
    激活(非常重要)

     

    8、接下来在创建一个主分区。例如,可以用剩余空间。在命令提示窗口中输入:

    create partition primary 
    format quick fs=ntfs 
    assign letter=c

     

    9、接下来,将VHD复制到计算机上,切换到另一个命令窗口。

    如果使用Windows共享,请按一下步骤操作

    先用Net use 连接网络共享文件夹,如果提示要用户名话,建议输入 “机器名\用户名” 的形式

     

    net use y: \\network_share\

    然后复制VHD文件到本地磁盘

    copy y:\Windows7.vhd c:

    clip_image046

    如果使用FTP的话,建议使用第三方工具,系统内部的FTP因为一些问题无法正常工作。

    10、下载完成后,就可以附加VHD文件到系统了,切换回原来的窗口。这里假设VHD文件名字是“Windows7.vhd”,在命令提示窗口中输入:

     

    select vdisk file=c:\windows7.vhd 
    attach vdisk

    11、当附加完VHD文件之后,系统会自动分配一个盘符。可以通过卷列表查看盘符。在命令提示窗口中输入:

     

    list volume

    12、使用BCDboot工具(位于VHD内的Windows\System32 或者 Windows PE 媒体中),来将启动环境文件从VHD中的\Windows 文件夹复制到系统分区。BCDboot 工具会自动创建BCD配置文件来启动VHD。有关 BCDboot 的更多信息,请看本文最后的参考。

    cd v:\windows\system32 
    bcdboot v:
    \windows /s s:

     

    ( v 是附加VHD文件的卷的盘符)

    13、这完成后就可以分离VHD文件了。在命令提示窗口中输入:

     

    select vdisk file=c:\windows7.vhd 
    detach vdisk 
    Exit

    14、重启计算机。

    2.2 在已有系统的机器上 部署原生VHD启动

    其实,这个部分,可以换一个说法。就是将VHD文件添加到启动菜单中。

    1、先将VHD文件复制到本地机器。

    2、使用管理员模式打开命令行。

    3、复制已有的启动引导,然后使用VHD信息来修改启动数据。

    bcdedit /copy {current} /"vhd boot (locate)" 

    (注:/d 后面的是显示的启动名字,可以自定义,中文也可以,但如果你的系统不是中文的,会乱码。)
    当成功执行完这个命令后,会返回一个 {GUID} 字符串。

    4、复制上一个命令输出的 {GUID} 字符串,以便之后使用。

    5、设置 VHD 启动项目的 device 和 osdevice 选项。

     

    bcdedit /set {guid} device vhd=[locate]\windows7.vhd 
    bcdedit 
    /set {guid} osdevice vhd=[locate]\windows7.vhd

    (将 {GUID} 替换成 之前复制的内容, [locate] 内容换成本地盘符)

    6、在某些 x86系统中需要在启动配置中设置一个选项,来探测硬件信息。

    clip_image047

     

    bcdedit /set {guid} detecthal on

    7、重启计算机

     

     

     

    重启玩之后, Windows 启动管理器将会启动VHD文件中包含的系统。

    之后就可以随意使用了,和正常的使用没有多少区别。

     

    大家可能会有一些疑问,那么接下来,我来做一些回答。

    1、从VHD启动之后的系统,到底是运行在虚拟机上?还是直接运行在物理硬件之上?

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

    clip_image048

     

    2、从VHD启动,还需要哪些必备的条件?

    答:对于VHD启动本身,对硬件并没有多少要求,只能能运行系统即可。不过对于软件方面来说,系统必须是以下版本,

    • Windows® 7 Enterprise
    • Windows® 7 Ultimate
    • Windows Server 2008 R2

    XP和Vista是不行的,因为驱动问题。而WIn7 的版本必须是 企业版之上,这个策略限制,如果版本不对的话,会提示不支持,然后关机的。

     

    3、是否会有性能的损失?

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

    clip_image049

     

    4、VHD 文件格式 如何选择?

    答:VHD 文件分为 固定,动态扩展 还有差异 三种格式(其实,还有一种 连接到物理磁盘的格式,不过这里用不上)

    首先是固定,固定是固定大小,在建立完磁盘后,用空数据填充,使其达到设置的磁盘大小。

    动态是根据写入信息的多少,动态的增加磁盘大小。(当然,这种情况下,容易产生磁盘碎片)

    差异是一种父子关系,新建立的磁盘会保存和源盘不相同的内容。

    这3种类型选择哪个都可以,不过对于性能来说,应该选择 固定的。但 固定的建立需要填充文件,所以非常占用时间。

    不过,这里要说的是,经过我的测试发现,不管选择什么类型的VHD,在使用它启动系统后,都会变成固定的。

    也就是说,如果你设置VHD文件有127G,那么通过它进入系统后,你会看到VHD文件变成127G。

    因此,如果VHD文件所在的磁盘空间不够的话,将会无法启动系统。

    (如果是动态磁盘的话,在关机之后,文件会变回实际大小)

    但这个有个例外,就是差异文件。使用差异的话, 父盘的大小是不会变动的。

    个人比较推荐 差异,可以使用这个来建立多个系统。

    差异文件的建立方法是在Diskpart中,输入以下命令

     

    create vdisk file="D:\pathToVhd.vhd" parent="D:\pathtoparent.vhd"
    (就是用Parent 来指定父文件)

    下图就是一个事例,Win7Base.vhd 是父盘,Win7Disk.VHD是当前正在使用的系统文件。 可以看到 它的大小 已经变成了设置的最大大小(127G)

    clip_image050

    另外,也可以看到 页面文件 ,因为VHD文件本身会有一点性能损失,加上一些其他问题等,所以 页面文件不会放到VHD文件内部。

     

    5、在裸机部署完之后,重启后,看到菜单是英文的?

    答:是的。即使你用的是中文版的安装盘在第一次启动的时候,也是英文的,但不要紧,进入系统之后,下次重启时就会变成中文的了。主要原因是,在设置启动引导项目的时候,默认的语言是en-us,而不是zh-cn。

     

    6、是否可以挂接X64和X86 系统?

    答:可以。 在启动引导中添加相应的条目即可。如果使用的是PE环境部署的,建议使用PE里面的bcdboot 来设置启动项。

     

    7、部署方法有何区别?

    答:实际上,部署主要是将启动信息添加到系统的启动菜单中。

    有2个方法,使用BCDEDIT或者使用BCDBOOT,不管使用哪种部署,都可以使用。只不过后者需要先挂上VHD磁盘。

     

    (有待补充)

     

     

    最后附上一个自动应答文件,也可以使用 “Windows 系统映像管理器”创建一个。

    请自行替换XML中【】内容

    unattend

     

     

    参考:

    Understanding Virtual Hard Disks with Native Boot
    http://technet.microsoft.com/en-us/library/dd799282(WS.10).aspx

    Walkthrough: Deploy a Virtual Hard Disk for Native Boot
    http://technet.microsoft.com/en-us/library/dd744338(WS.10).aspx

    Add a Native-Boot Virtual Hard Disk to the Boot Menu
    http://technet.microsoft.com/en-us/library/dd799299(WS.10).aspx

    Windows 7对VHD文件的内建支持
    http://blogs.technet.com/fyu/archive/2009/01/19/windows-7-vhd.aspx

    从VHD文件启动计算机
    http://blogs.technet.com/fyu/archive/2009/01/19/vhd.aspx

    深入研究Windows 7中的Virtual Hard Disk (VHD) 技术
    http://blogs.technet.com/fyu/archive/2009/01/21/windows-7-virtual-hard-disk-vhd.aspx

    再谈从虚拟磁盘文件启动计算机
    http://blogs.technet.com/fyu/archive/2009/02/01/3195439.aspx

    BCDboot 命令行选项
    http://technet.microsoft.com/zh-cn/library/dd744347(WS.10).aspx

    BCDEdit 命令行选项
    http://technet.microsoft.com/zh-cn/library/cc709667(WS.10).aspx>

     

    使用工具

    Windows(R) 7 的 Windows(R) 自动安装工具包 (AIK)

    http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=696DD665-9F76-4177-A811-39C26D3B3B34&displaylang=zh-cn