以前,虽然听说过这个特性,但一直没有尝试过。
最近有机会尝试了一下,本以为是很难的东西,但实际操作起来,还是很简单的。
首先,先解释一下什么是 原生 VHD 启动(Native VHD Boot)?
实际上,Win7可以 启动VHD 里面的系统,并且里面的系统知道运行在 VHD磁盘上。
那么VHD是什么? VHD是MS的虚拟硬盘文件,实际上,如果用过VPC,Virtual Server,Hyper-V,Windows Virtual PC,那么你应该也会知道了。(注:前2个可能不适用制作VHD文件)
现在大家应该知道这个启动是怎么回事了,如果还没有理解,可以这么想想一下,在Win7内核 以及 启动引导中,增加了对 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
首先是建立VHD磁盘,步骤如下:
1: 在单击开始,输入“Diskmgmt.msc”,启动磁盘管理。
2: 单击 “显示/隐藏控制台树”(位于“磁盘管理”中)按钮。
3: 在“磁盘管理 (框线项目)”上右键单击。
4: 单击“创建 VHD (菜单项目)”。
5: 单击“浏览(B)... ” ,并选择一个虚拟磁盘的保存位置, 并起一个文件名,这里是“Test.vhd”,然后单击保存。
6: 选择一个磁盘类型,这里选择“动态扩展(D) ”。(注:选择哪个都可以,只不过,选择固定的创建起来有点费时,另外,后期可以通过虚机的磁盘管理器进行转换。)
7: 在“虚拟硬盘大小(S): ” 输入要创建的虚拟硬盘大小,这里输入“60” 单位选择“GB”,然后单击确定。 (注:有关这个大小的注意,请看后面)
8: 在“磁盘管理”中,右键单击新建的磁盘 行头,选择“初始化磁盘(I) ”。
9: 在弹出的“初始化磁盘”对话框中,选择需要初始化的磁盘,并单击“确定”。
10: 右键单击 虚拟磁盘的空白区域,选择“新建简单卷(I)... ”。
11: 按照“新建简单卷向导”中的提示操作,创建一个新的分区。
再来就是提取安装镜像文件
1: 单击“开始”,“所有程序”,“Microsoft Windows AIK ” ,单击 “部署工具命令提示 ”,打开 PE环境控制台。(如果不这么做的话,会提示ImageX 文件无法找到,当然,你也可以指定完整路径)
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:\ 要解压到的位置)
好,到此为止就算解压完镜像文件了。
如果你想放入自动应答,让安装程序自动完成一部分。可以现在就做,否则,跳过。
1、定位到虚拟磁盘上的 Windows 目录下,然后新建一个文件夹,名字是“Panther”(注:一定要是这个名字)
2、然后将应答文件复制到这个目录中,并重命名为“unattend.xml”。(注:一定要是这个名字)
3、如果应答文件中,使用了其他工具或者批处理文件,请将这些文件复制到对应的路径中。
那么接下来,就是卸载VHD虚拟磁盘文件了
1: 打开“磁盘管理”,在虚拟磁盘的行标头上右键单击,选择 “分离 VHD ”。
2: 在“分离虚拟硬盘”对话框中单击“确定”,即可分离磁盘了。
1.2 使用虚机制作VHD文件
其实,使用虚机制作,就是用虚机去安装系统,然后把VHD文件拿出来。(注:VPC ,Virtual Server 安装的系统在部署后可能会有问题)
这里我以Hyper-V 虚机为例,进行演示。
1、打开“Hyper-V 管理器”,在操作中选择“新建”,“虚拟机”。
2、在打开的 “新建虚拟机向导”对话框,单击下一步,输入虚机的名字,然后单击下一步。
3、设置分配给虚机的内存,这里输入1024,即1G,然后单击下一步。(注:内存最少可以是512M,最大是物理内存大小,请根据具体情况选择合适大小)
4、配置网络,选择一个可用的网络,如果想配置干净的虚机,可以不设置或者选择一个不能上网的测试网络,免得安装补丁,单击下一步继续。
5、创建虚拟磁盘,可以创建一个新的虚拟磁盘,也可以选择一个现有的,单击下一步继续。(关于虚拟磁盘的大小问题,稍后会有说明)
6、设置安装光盘镜像的位置,单击下一步继续。
7、单击 “完成”,开始创建虚机。
8、在“Hyper-V 管理器”中,选中新建的虚机,单击操作中的连接。
9、启动虚机,并安装系统。
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 是 设置自动应答文件的,如果不需要可以不指定)
当封装完毕后,虚机系统会自动关闭。
然后,我们可以在优化一下VHD文件的大小。
1、参考上一部分的内容,将VHD文件附加到计算机上。
2、然后 清理一下 VHD的虚拟磁盘上的东西,比如可以删除页面文件(pagefile.sys),还有者临时文件夹的内容。
3、清理完后,卸载VHD镜像。
4、在“Hyper-V 管理器”中,选中 对应的虚机,然后单击 右边的 “设置”。
5、选中 “硬盘驱动器”,确认磁盘文件所在位置。
5、在“Hyper-V 管理器”中选择,“编辑器磁盘”。
6、在“编辑虚拟磁盘向导“对话框中单击下一步继续。
7、选择刚才确定文件位置,然后单击下一步继续。
8、选择 “压缩”,然后单击下一步。
9、单击确定,开始压缩VHD。
好,这样就获得了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、进入安装界面后,选择好正确的语言,单击“下一步”。
3、选择“修复计算机”,稍等一会,之后出来系统恢复选项,单击下一步,然后选择“命令提示符”。
4、可以先输入“start”命令,打开一个新的命令行窗口, 然后在输入“startnet” 开启网络支持。
5、切换到另一个窗口,输入“Diskpart”,对系统进行分区。
6、(可选)清除硬盘上的分区,在命令提示窗口中输入:
List Disk 查看系统上磁盘
Select disk 1 选择一个系统硬盘,根据上面返回的索引信息。
Clean 清除磁盘上的所有内容。
7、创建系统分区(用于启动引导)。例如,这里建立一个100MB的系统分区。在命令提示窗口中输入:
create partition primary size = 100
format quick fs = ntfs
assign letter = s
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:如果使用FTP的话,建议使用第三方工具,系统内部的FTP因为一些问题无法正常工作。
10、下载完成后,就可以附加VHD文件到系统了,切换回原来的窗口。这里假设VHD文件名字是“Windows7.vhd”,在命令提示窗口中输入:
select vdisk file = c: \ windows7 . vhd
attach vdisk11、当附加完VHD文件之后,系统会自动分配一个盘符。可以通过卷列表查看盘符。在命令提示窗口中输入:
list volume12、使用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
Exit14、重启计算机。
2.2 在已有系统的机器上 部署原生VHD启动
其实,这个部分,可以换一个说法。就是将VHD文件添加到启动菜单中。
1、先将VHD文件复制到本地机器。
2、使用管理员模式打开命令行。
3、复制已有的启动引导,然后使用VHD信息来修改启动数据。
bcdedit / copy {current} / d " 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系统中需要在启动配置中设置一个选项,来探测硬件信息。
bcdedit / set {guid} detecthal on7、重启计算机
重启玩之后, Windows 启动管理器将会启动VHD文件中包含的系统。
之后就可以随意使用了,和正常的使用没有多少区别。
大家可能会有一些疑问,那么接下来,我来做一些回答。
1、从VHD启动之后的系统,到底是运行在虚拟机上?还是直接运行在物理硬件之上?
答:是运行在物理硬件上。 在Win7以及WIn2008 R2 中的引导程序和系统本身都包含了对VHD文件的读写(虚拟)驱动程序,以及虚拟的VHD磁盘控制器。不要被这个虚拟所误导,这里指的是模拟硬件,比如最常见的虚拟光驱。因此我们可以在启动计算机的时候,访问VHD并且从其上启动;也可以在Windows 7中直接创建、加载和卸载VHD文件。不过行为有些不同,这些驱动是在系统内核中的,系统本身也会知道自己运行在VHD文件上。因此,会把虚拟内存文件放到非VHD磁盘的 物理磁盘上,也不会写入到VHD内部。
2、从VHD启动,还需要哪些必备的条件?
答:对于VHD启动本身,对硬件并没有多少要求,只能能运行系统即可。不过对于软件方面来说,系统必须是以下版本,
XP和Vista是不行的,因为驱动问题。而WIn7 的版本必须是 企业版之上,这个策略限制,如果版本不对的话,会提示不支持,然后关机的。
3、是否会有性能的损失?
答:会有一些损失,但很小可以忽略。 主要原因是对文件系统读写访问的时候,需要经过额外的一层VHD读写驱动的解析,这里面有一些微量的I/O性能开销,但是跟虚拟化的情况相比,性能基本上接近了真机。下图是在网上找到的测试资料,有一组直接读取硬盘和读写VHD的比较,性能差别微乎其微。
4、VHD 文件格式 如何选择?
答:VHD 文件分为 固定,动态扩展 还有差异 三种格式(其实,还有一种 连接到物理磁盘的格式,不过这里用不上)
首先是固定,固定是固定大小,在建立完磁盘后,用空数据填充,使其达到设置的磁盘大小。
动态是根据写入信息的多少,动态的增加磁盘大小。(当然,这种情况下,容易产生磁盘碎片)
差异是一种父子关系,新建立的磁盘会保存和源盘不相同的内容。
这3种类型选择哪个都可以,不过对于性能来说,应该选择 固定的。但 固定的建立需要填充文件,所以非常占用时间。
不过,这里要说的是,经过我的测试发现,不管选择什么类型的VHD,在使用它启动系统后,都会变成固定的。
也就是说,如果你设置VHD文件有127G,那么通过它进入系统后,你会看到VHD文件变成127G。
因此,如果VHD文件所在的磁盘空间不够的话,将会无法启动系统。
(如果是动态磁盘的话,在关机之后,文件会变回实际大小)
但这个有个例外,就是差异文件。使用差异的话, 父盘的大小是不会变动的。
个人比较推荐 差异,可以使用这个来建立多个系统。
差异文件的建立方法是在Diskpart中,输入以下命令
下图就是一个事例,Win7Base.vhd 是父盘,Win7Disk.VHD是当前正在使用的系统文件。 可以看到 它的大小 已经变成了设置的最大大小(127G)
另外,也可以看到 页面文件 ,因为VHD文件本身会有一点性能损失,加上一些其他问题等,所以 页面文件不会放到VHD文件内部。
5、在裸机部署完之后,重启后,看到菜单是英文的?
答:是的。即使你用的是中文版的安装盘在第一次启动的时候,也是英文的,但不要紧,进入系统之后,下次重启时就会变成中文的了。主要原因是,在设置启动引导项目的时候,默认的语言是en-us,而不是zh-cn。
6、是否可以挂接X64和X86 系统?
答:可以。 在启动引导中添加相应的条目即可。如果使用的是PE环境部署的,建议使用PE里面的bcdboot 来设置启动项。
7、部署方法有何区别?
答:实际上,部署主要是将启动信息添加到系统的启动菜单中。
有2个方法,使用BCDEDIT或者使用BCDBOOT,不管使用哪种部署,都可以使用。只不过后者需要先挂上VHD磁盘。
(有待补充)
最后附上一个自动应答文件,也可以使用 “Windows 系统映像管理器”创建一个。
请自行替换XML中【】内容
参考:
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