前言
笔者于Windows 7刚推出时接触到VHD启动技术。记得当时在关注webcast课程时,喻勇(FrankYu)老师简单在webcast中提到次VHD启动的简绍,并在他的blog里简绍了VHD启动技术及VHD的性能测试。那个VHD启动系统的性能给笔者留下了很深的映像,以至于笔者现在工作中用计算机、个人使用笔记本所安装的Windows7从没正式的安装到物理分区中。在这篇文章里,笔者将会结合这几年在公司内部署维护网络的经验,来与大家谈谈在企业内基于VHD方式来部署Windows8的一些思路及演示。
试笔者工作及时间状况,本文大概有3到4篇的篇幅。涵盖范围从简单的VHD系统安装、无引导下的VHD启动解决方法、普通IT员工通过U盘/网络快速部署给员工部署基于VHD的windows8,到这几天盘旋于笔者脑海中一个想法,即如何使普通非IT员工自行安装基于Windows8。
理解VHD格式 及使用VHD部署系统的优势
VHD(Microsoft Virtual Hard Disk format),即微软虚拟磁盘的缩写。绝大多数人最初接触VHD格式的文件,是在使用VirtualPC或者Virtual Server时,VHD是以文件形式存在的虚拟机的磁盘。微软在2005年公开了VHD格式文件的全部细节[ii],可以从微软的TechNet网站下载Virtual Hard Disk Image FormatSpecification[iii]。这说明了微软不仅仅要把VHD应用在虚拟机领域,更希望VHD能够成为一种新的磁盘格式和载体在业界得到更多的支持。
让我们抛开虚拟机,把目光集中在VHD文件本身。VHD是一块虚拟的硬盘,不同于传统硬盘的盘片、磁头和磁道,VHD硬盘的载体是文件系统上的一个VHD文件。如果大家仔细阅读VHD文件的技术标准,就会发现标准中定义了很多Cylinder、Heads和Sectors等硬盘特有的术语,来模拟针对硬盘的I/O操作。既然VHD是一块硬盘,那么就可以跟物理硬盘一样,进行分区、格式化、读写等操作。
我们这可以这样认为,VHD也是硬盘的一种,就像2.5寸、3.5寸、SCSI、SATA、IDE等不同规格的硬盘一样,VHD是在一个文件中的硬盘。
这样,我们就可以避免一些安装系统的麻烦。例如:
1. 需要占用分区来安装系统
2. 预计占用分区所带来的文件备份麻烦
3. 在没有合适的分区情况下使用第三方磁盘工具压榨硬盘挤出安装需要的分区的风险和意外开销
4. 数据丢失风险
5. 卸载系统的麻烦
Windows 8支持VHD的技术实现方式[iv]早在windows 7中,微软即实现了基于VHD的启动。
简单的说,要把VHD文件当作硬盘一样读写,必须有相应的驱动程序。在VirtualPC和Virtual Server中,微软就是通过在虚拟机种加入VHD的驱动程序,使得虚拟机可以从VHD启动并进行后续的操作。
在Windows7/Windows 8中,微软把VHD的驱动内置进了操作系统,也包括在了Windows7/windows 8的引导程序中。这也就是说,我们可在使用Windows 8的时候,直接访问VHD文件中的内容,也可以通过Windows 8的引导程序,启动位于VHD磁盘上的另一个操作系统。
企业内系统部署场景
企业内部署操作系统,常见的场景大体有下面4项:
1. 按照生产力要求,批量进行系统升级
2. 按照生产力要求,批量进行单、双系统部署
3. 应部分同事要求安装新系统,用于体验新系统的魅力(或跟风体验新事物)
4. 系统出问题在找技术员工维护时,直接升级新系统
按照部署数量来看,常见的部署方式不外乎就是下面这些:
1. 计算机数量较多,通过网络启动客户端批量安装
2. 计算机数量中等较少,通过网络或U盘的方式来进行部署
3. 外包与第三方公司来进行部署
在笔者接触过的大多数中小型企业,大多数内部IT管理,并不能和一些大型或专业的IT企业相提并论。及少涉及到“批量安装批量进行系统升级”或“批量进行单、双系统部署”。绝大多数情况为:“应部分同事需求使用U盘来安装新系统(保留原有系统)”,或“部分同事系统出错,直接更换新系统。”
在本文中,笔者试图使用基于VHD的方式,来满足上述场景。(为了节省时间,我们也可以在正式部署系统前,修改要部署的系统。创建自应答、集成公司内机器的驱动及软件后重新封装。来帮助减少工作量。这一点在本文中不做探讨。)
基础 - 基于VHD的系统制作(1)
本质来说,基于VHD的系统启动制作分为2个部分:
1. 制作安装并准备好Win8的VHD文件
2. 设置NT6的引导程序,添加BCD启动信息
首先来看1:“制作安装并准备好Win8的VHD文件”
这里,笔者需要创建VHD文件用来准备windows8.一般来说创建VHD文件方式有2种。一种为使用磁盘管理器(VISTA及以上系统支持),另一种为使用系统自带工具diskpart(CLI下工具)。这里笔者选择使用磁盘管理器来进行创建。步骤很简单:
1.首先打开磁盘管理器(计算机-管理)
2.在“磁盘管理”里选择“创建VHD”
3. 这里笔者设置的VHD文件大小为20G。出于节省空间、为接下来的网络部署做准备,VHD的格式选择为动态扩展。以求尽量缩小VHD文件的体积。有关VHD详细信息,可以参考备注2与3.
4. 创建并挂载于系统上的VHD文件(磁盘3)
5. 接着对磁盘进行初始化,这里笔者选择的分区形式为MBR
6. 对初始化后的磁盘进行创建分区与格式化。可以看到笔者设置的VHD分区就1个,盘符是V,文件系统是NTFS。到此,创建并准备VHD文件完成。
7. 接着,笔者挂载64位WIN8企业版镜像到虚拟光驱,虚拟光驱盘符为D
8. 打开CMD,进入有微软镜像工具imagex[v]的文件夹。使用imagex查看下windows 8镜像所包含的信息。
从<image index=”1”>和<editionid>的标签中,我们可以看到该镜像文件的镜像编号及系统版本。镜像编号为1的Windows
8,版本为企业版。镜像文件共包含1个windows 8的版本镜像。
9. 接着使用imagex命令,释放虚拟光驱中Win8的企业版本镜像(镜像编号1)到VHD分区
10. 经过一段时间的等待(笔者的笔记本硬盘速度较慢,并且在执行其他任务),镜像释放完成
11. 完成以上步骤后,我们需要卸载掉VHD文件
12. 注意路径,一会会用到这个VHD文件。至此,VHD文件已经完成准备
接下来我们看2:“设置NT6的引导程序,添加BCD启动信息”。
这里需要注意。默认情况下,企业内安装的操作系统不外乎是微软公司windows XP与Windows7的企业版本。至于安装GRUB等引导Linux、或Linux与windows双系统,在笔者工作期间除服务器外还没有见过。所以基于GRUB引导我们不去探讨。
这里笔者简单的简绍下Windows的启动过程(MBR),为接下来的部署做准备。
简单的说,大多数的PC(MBR)启动操作过程如下:
MBR示意图
1.系统BIOS检查系统并启动存放于主硬盘的MBR(主引导记录)
2.MBR把它自己载入内存,并启动其中的引导装载程序
3.引导程序开始启动windows操作系统
4.windows操作系统启动后启动各种服务与启动软件
对于windows操作系统来说,windows的启动程序根据内核不同,系统启动程序也不同(升级)。大体情况分为下列2类:
l 默认安装的操作系统为NT5(如XP,2003),启动文件使用的是NT5的启动文件(MBR会引导启动分区内的NTLDR等)。对于这样的引导要注意,NTLDR不支持VHD。换句话说,NT5引导不可以对VHD内的系统进行启动。
l 默认安装的操作系统是NT6(如windows VISTA,windows 7, windowsserver 2008, windows 8,windows server 2012),启动文件使用的是NT6的启动文件(MBR会引导启动分区内的Bootmgr等)。这也是启动VHD内操作系统的必要引导。
这里,笔者用已安装XP+WIN7的双系统虚拟机(方便用来截图)来接上文的配置。从简单(WIN7)开始,演示VHD启动的后续过程。为本文接下来NT5引导、无引导、扩展网络,U盘VHD等部署做准备。
首先打开虚拟机,进入WIN7。将VHD文件复制入虚拟机
1. 这里,笔者的VHD文件复制到虚拟机的分区E中。本虚拟机前年制作,用来临时测试,安装时没输入序列号。今天打开就让笔者体会到“D版的危害”
2. 重点来了,使用bcdedit工具给Windows启动文件BCD创建Windows
8的启动项。注意,Windows启动项通过识别{XOXOXOXOX}这一串标识符来区分不同的、要启动的操作系统。所以这生成的标识符需要注意,下列的命令会用到
3. 这2条新命令用来告诉系统启动项,VHD的启动文件在什么位置。注意标识符,可从上面直接复制。还有VHD路径的盘符需要使用[]括起来
4. 这3条新命令的前2条用于告诉启动项,引导系统文件路径及系统目录是什么。第三条指明本地语言为中文。到此,需要添加的启动项完毕
5. 这时,如用bcdedit查看当前系统启动项,会发现是没有刚添加的WIN8启动项。如想查看有没有添加成功,可以使用“bcdedit/enum all”(不包括引号)命令来查看。
如上图,可以看到已经添加的WIN8启动项
6. 最后,我们需要将已经添加好的WIN8启动项加入到显示列表去
7. 然后使用bcdedit命令检查,发现添加的WIN8启动项已经出现在BCD的显示列表内
8. 在Windows 7的高级系统设置——>高级——>“启动和故障恢复”---——>设置里,我们可以设置默认的启动系统,并可以设置显示操作系统列表的时间。到此,BCD相关的编辑工作结束。但是要注意,这时不可以重启计算机进入WIN8的安装。原因很简单,当前的启动项用WIN7的启动项,启动器Bootmgr的版本较老,不能识别Win8的启动(不识别Win8启动文件的数字证书)。所以我们需要使用Windows
8的Bootmgr来替换Windows 7的Bootmgr,让启动器可以正确识别Windows 8。(不需要担心替换后不识别Windows7,windows 8的bootmgr可以识别windows7的数字证书)
9. Windows 8的bootmgr文件存放于windows8的安装镜像根目录。已安装Windows的启动器bootmgr存放于系统硬盘的启动分区。
上图笔者的虚拟机安装了2个操作系统,分别是WindowsXP和Windows 7。其中XP先安装,然后安装Windows7。启动分区为XP所在的分区。打开XP所在的分区,可以看到启动器bootmgr。这时需使用windows 8光盘中的bootmgr替换掉启动分区中的bootmgr,整个VHD启动步骤就结束了。如果看不到bootmgr,需要在文件夹选项中打开显示隐藏和系统文件的选项。
10. 还有一个问题,如果没有关闭UAC,那么在替换文件的时候会失败。原因是系统管理员对bootmgr文件没有修改写入权限。这时笔者采取的措施为使用管理员夺权,然后就可以对bootmgr进行替换。(如关闭UAC替换失败,可先修改启动分区bootmgr文件名字,在复制Windows 8的bootmgr到该分区)
11. 重新启动,可以看到操作系统列表中已经出现笔者所添加的Windows
8启动项。
12. 选择后成功进入windows8的安装界面。
13. 最后附上进入Windows 8的截图
到此,基于VHD启动windows8设置完毕。如果说想要使用这种方法进行部署并且降低工作量,可以在安装完成Windows8后,安装相关驱动及企业员工需求工具,然后使用Sysprep进行封装。并且可以集成自应答文件(ADK内)实现无人值守。由于本文探讨的是基于VHD的几种可行的Windows 8部署方式,所以相关内容就此跳过。感兴趣的朋友可以参考微软帮助网站获取上述工具的使用信息。
通过以上演示,相信大家对VHD系统启动有所了解。接下来,笔者会简绍如何在非NT6启动计算机上配置VHD的启动项。由于时间关系,相关内容将会放到明天,然后发布到论坛。敬请期待浅谈基于VHD方式在中小型企业内部署Windows 8的一些思路与方法(2)
Lblneva
2013.03.14
参考喻勇(Frank Yu)老师的“深入研究Windows
7中的Virtual Hard Disk (VHD) 技术”“理解VHD格式” 地址:http://blogs.technet.com/b/fyu/archive/2009/01/21/windows-7-virtual-hard-disk-vhd.aspx
[ii] VHD格式文件的全部细节:http://technet.microsoft.com/en-us/virtualserver/bb676673.aspx
[iii] Virtual Hard Disk Image Format Specification:http://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc
[iv] 参考喻勇(Frank Yu)老师的“深入研究Windows 7中的Virtual Hard Disk
(VHD) 技术”“Windows 7支持VHD的技术实现方式”地址:http://blogs.technet.com/b/fyu/archive/2009/01/21/windows-7-virtual-hard-disk-vhd.aspx
[v] Imagex工具在微软网站可以下载,并且该工具集成于微软的AIK工具包中。论坛也有很多人提供该工具的下载