创建基本虚拟镜像
根据第2章给出的定义,虚拟机是指通过虚拟化软件套件模拟的、具有完整硬件功能的、运行在一个隔离环境中的逻辑计算机系统。虚拟机里的操作系统被称为客户操作系统(Guest Operating System,Guest OS),在客户操作系统上可以安装中间件和上层应用程序,从而构成一个完整的软件栈。虚拟镜像是虚拟机的存储实体,它通常是一个或者多个文件,其中包括了虚拟机的配置信息和磁盘数据,还可能包括内存数据。
虚拟镜像的主要使用场景是开发和测试环境:软件开发人员在虚拟机内部对应用进行开发测试,把虚拟镜像作为应用在初始状态或某一中间状态的备份来使用,这样能够在当前的环境发生不可恢复的变更时方便地用虚拟镜像恢复到所需要的状态。
虚拟镜像大致可以分为两类:一类是在虚拟机停机状态下创建的镜像,由于这时的虚拟机内存没有数据需要保存,因此这种镜像只有虚拟机的磁盘数据;另一类是在虚拟机运行过程中做快照所生成的镜像,在这种情况下,虚拟机内存中的数据会被导出到一个文件中,因此这种镜像能够保存虚拟机做快照时的内存状态,在用户重新使用虚拟机时可以立即恢复到进行快照时的状态,不需要进行启动客户操作系统和软件的工作。由于目前使用较广泛的是停机状态下创建的虚拟镜像,因此下文主要讨论这类虚拟镜像。对于快照技术及快照镜像会在3.2.2小节中做介绍。
创建一个最基本的虚拟镜像的流程包括以下三个步骤:创建虚拟机、安装操作系统和关停虚拟机,如图3.2所示。第一步,在虚拟化管理平台上选择虚拟机类型,并设定虚拟硬件参数。参数主要包括虚拟机的CPU数量、内存大小、虚拟磁盘大小、挂载的虚拟光驱及虚拟磁盘等,其中虚拟磁盘的设定要充分考虑到后续安装软件所需空间的实际情况。虚拟化管理平台将依据这些参数创建相应的虚拟机。第二步,选择客户机操作系统并安装,这个过程一般在虚拟化软件套件提供的虚拟机窗口界面上进行,类似于在一台普通的物理机器上安装操作系统。安装客户机操作系统时要遵循“够用即可”的原则,移除不必要的模块、组件和功能,这样既能提高虚拟机运行时的性能,又可以降低虚拟机受攻击的风险。最后一步是关停虚拟机,保存生成的虚拟镜像和配置文件。经过这三个步骤,一个最基本的虚拟镜像就创建完毕了,整个过程一般需要十几分钟左右。
目前主流的虚拟化软件套件都提供了非常方便的虚拟镜像创建功能,一般来说都是图形化、流程化的,用户只需要根据虚拟化软件提供的提示,填写必要的信息,就可以
web服务器又被称为很方便地完成虚拟镜像的创建。
创建虚拟器件镜像
在上一节中,我们介绍了如何创建一个最基本的虚拟镜像,但对于用户来说,这样的虚拟镜像并不足以直接使用,因为用户使用虚拟化的目的是希望能够将自己的应用、服务、解决方案运行在虚拟化平台上,
而基本虚拟镜像中只安装了操作系统,并没有安装客户需要使用的应用及运行应用所需的中间件等组件。当用户拿到虚拟镜像后,还要进行复杂的中间件安装,以及应用程序的部署和配置工作,加上还需要熟悉虚拟化环境等,反而有可能使用户感觉使用不便了。
虚拟器件(Virtual Appliance)技术能够很好地解决上述难题。虚拟器件技术是服务器虚拟化技术和计算机器件(Appliance)技术结合的产物,有效吸收了两种技术的优点。根据Wikipedia的定义,计算机器件是具有特定功能和有限的配置能力的计算设备,例如硬件防火墙、家用路由器等设备都可以看做是计算机器件。虚拟器件则是一个包括了预安装、预配置的操作系统、中间件和应用的最小化的虚拟机。如图3.3所示,和虚拟镜像相比,虚拟器件文件中既包含客户操作系统,也包含中间件及应用软件,用户拿到虚拟器件文件后经过简单的配置即可使用。与计算机器件相比,虚拟器件摆脱了硬件的束缚,可以更加容易地创建和发布。
虚拟器件的一个主要使用场景是软件发布。传统的软件发布方式是软件提供商将自己的软件安装文件刻成光盘或者放在网站上,用户通过购买光盘或者下载并购买软件许可证的方法得到安装文件,然后在自己的环境中安装。对于大型的应用软件和中间件,则还需要进行复杂的安装配置,整个过程可能耗时几个小时甚至几天。而采用虚拟器件技术,软件提供商可以将自己的软件及对应的操作系统打包成虚拟器件,供客户下载,客户下载到虚拟器件文件后,在自己的虚拟化环境中启动虚拟器件,再进行一些简单的配置就可以使用,这样的过程只耗时几分钟到几十分钟。可以看出,通过采用虚拟器件的方式,软件
发布的过程被大大简化了。认识到虚拟器件的好处之后,很多软件提供商都已经开始采用虚拟器件的方式来发布软件。例如,VMware的已经有“虚拟器件市场”;在AmazonEC2环境里,虚拟器件已经用于商业目的;IBM的内部网站上包含IBM主要软件产品的虚拟器件正在被大量下载和使用。可以预见,在不远的将来,虚拟器件将成为最为普及的软件和服务的发布方式,用户不再需要花费大量的人力、物力和时间去安装、配置软件,工作效率会得到很大提高。
上文谈到了虚拟器件的基本概念及使用场
景,而为了更方便、高效地使用虚拟器件,并让它支持复杂的企业级虚拟化解决方案,创建虚拟器件的过程需要一系列技术的支持,如图3.4所示。在制作虚拟器件之前,需要考虑两方面的关键技术:对多个虚拟器件组成的复杂虚拟化解决方案进行预先规划和通过配置元数据和脚本实现虚拟器件的高度灵活性和模板化。
虚拟器件在很多场景下都要支持复杂的企业级应用和服务,而应用和服务的特点是需要多个虚拟器件组合交付,在虚拟器件的创建阶段需要考虑各个虚拟器件的关联关系,因而前期调研显得尤为重要。在创建虚拟器件之前,我们首先要调研和分析如何把现有的服务迁移、封装成若干个虚拟器件,然后编写相应配置脚本、规范配置参数并进行多次测试和验证,最后才是真正创建虚拟器件。制作出来的虚拟器件是一个模板,部署者在后续的部署过程中可以将其复制并生成多个实例,将解决方案交付给最终用户。下面详细介绍以上三个阶段的工作。
在开始的调研工作中,需要分析解决方案都由哪些应用模块组成。从基于单机的小型LAMP(Linux-Apache-MySQL-PHP)解决方案(如图3.5所示),到基于集的企业级解决方案,设计人员需要针对不同的应用场景进行调研工作。例如,IBM公司的模拟股票交易软件Trade,用户虽然只是通过Web方式访问,但是,底层的支撑模块包括了Web服务器(IBM HTTPServer,IHS)、应用服务器集(IBM WebSphere Application Server,WAS)和后端的数据库(IBM DB2 Server),如图3.6所示,而且,这三者并不是单独运行的实体,它们之间需要相互关联才能支撑模拟股票交易的服务。因此,要将这种复杂的应用封装到多个虚拟器件上,需要对其进行大致的分层或者分类,将不同层次或类型的支撑模块分别安装在不同的虚拟器件中。在前面的例子中,针对于Web服务器、应用服务器和数据库服务器,至少需要三个虚拟器件。需要注意的是,中间件或者应用可能出现多种形态,比如刚才提到的IBM WAS服务器,它可以按需被配置成多种形态,如Deployment Manager、Standalone、Managed Node、Cell等。对于这种情况,虚拟解决方案中只需要一个WAS虚拟器件就可以了,因为通过在部署阶段读取传入的参数,配置脚本可以将其实例化成上面提到的各种形态。在分层或分类以后,需要考虑支撑模块和操作系统之间的兼容性和配置优化问题。在对支撑模块优化完成以后,还需要对整个解决方案进行联调,目的主要是对网络参数、安全参数等参数进行配置,对请求连接数、数据源缓存等进行优化,这部分工作对后面配置脚本的编写很重要。
调研工作完成以后,
设计人员就可以编写配置脚本并进行测试了。在前期工作中,我们知道了如何对虚拟器件操作系统和支撑模块调优,由于虚拟器件中的软件栈已经固定,因此这些调优基本上都是一次性的,只需要在创建虚拟器件时配置成最优的固定值即可。但是,对中间件或模块的多态处理、联调时的网络配置、应用参数的设定等操作才是虚拟器件能够适应各种部署环境的根本所在。这些内容的配置需要编制脚本,并根据部署时传入的参数完成。通过脚本实现配置的设定是一个相对简单的操作,只要支撑模块开放命令行接口,脚本就能通过执行一系列命令的方法来使得配置生效。在脚本编制完成以后,设计人员需要确定配置参数及调用脚本的逻辑顺序,并进行测试和验证,使得配置脚本能够满足不同实例化的要求。测试过程分为单元测试和集成测试,单元测试主要检测单个脚本的正确性,而集成测试模拟脚本执行的顺序来逐一测试脚本,以保证最终用户需要的解决方案能够被成功部署。
最后一个步骤是创建虚拟器件,这个过程包括三个子步骤:第一步,创建虚拟镜像;第二步,分别在虚拟镜像中安装和优化服务解决方案所需的中间件和支撑模块;第三步,安装上文所提到的配置脚本,并且配置相应的脚本执行逻辑和参数,从而使得脚本在虚拟器件的启动、配置过程中能够按照一定的顺行执行。
当与一个应用或服务相关的虚拟器件都创建完成以后,可以将它们保存起来,供发布和部署时使用。
3.1.3 发布虚拟器件镜像
随着服务器虚拟化技术的发展,各大厂商都推出了自己的虚拟器件,但是这些产品的接口规范、操作模式互不兼容,妨碍了用户将多个不同厂商的虚拟器件组装成自己所需的虚拟化解决方案,也阻碍了虚拟化技术的进一步发展和推广。在这种背景下,需要统一的标准来明确接口规范,提高互操作性,规范各大厂商的虚拟器件组装和发布过程。
在IBM、VMware、微软、思杰和英特尔等虚拟化厂商的倡导下,DMTF(Distributed Management Task Force)非赢利标准化组织制定了开放虚拟化格式(Open Virtualization Format,OVF)。
OVF标准为虚拟器件的包装和分发提供了开放、安全、可移植、高效和可扩展的描述格式。OVF标准定义了三类关键格式:虚拟器件模板和由虚拟器件组成的解决方案模板的OVF描述文件、虚拟器件的发布格式OVF包(OVF Package),以及虚拟器件的部署配置文件OVF Environment。下面分别介绍OVF描述文件和OVF包,而OVF Environment的内容将在3.2节中介绍。
每个虚拟化解决方案都能够通过一个OVF文件来描述。目前,最新的OVF 1.0规范中定义了
虚拟器件的数量,以及每个虚拟器件的硬件参数信息、软件配置参数信息和磁盘信息等各种信息。图3.7描述了一个OVF描述文件的实例结构。OVF描述文件通过对标准的XML格式进行扩展来描述一个虚拟器件(在OVF规范中称为Virtual System),或者若干个虚拟器件整合成的一个解决方案(在OVF规范中称为Virtual System Collection),这些虚拟器件可以来自不同厂商。由于OVF描述文件中包括了整合后
的各个虚拟器件之间的关联关系、配置属性和启动的先后顺序等关键信息,因此用户或者任何第三方厂商编写的部署工具都能够解析OVF文件,并快速地部署其中描述的各个虚拟器件。
OVF包是虚拟器件最终发布的打包格式,它是一个按照IEEE 1003.1USTAR POSIX标准归档的以.ova为后缀的文件。OVF包里面包含了以下几种文件:一个以.ovf为后缀结尾的OVF文件、一个以.mf为后缀结尾的摘要清单文件、一个以.cert为后缀结尾的证书文件、若干个其他资源文件和若干个虚拟器件的镜像文件,如图3.8所示。如前所述,OVF文件描述了整个解决方案的组成部分,以及每个组成部分的内在特性和组成部分之间的关联关系。镜像文件既可以是虚拟器件的二进制磁盘文件,也可以是一个磁盘配置文件,它记录了下载二进制磁盘文件的URI地址。摘要清单文件记录了OVF包里面每个文件的哈希摘要值、所采用的摘要算法(比如SHA-1、MD5)等信息。证书文件是对摘要清单文件的签名摘要,用户可以利用这个摘要文件来对整个包进行认证。资源文件是一些与发布的虚拟器件相关的文件,比如ISO文件等。这些文件中,摘要清单文件、证书文件和资源文件是可选的,而OVF文件和镜像文件是必需的。
以OVF包的方式发布虚拟器件,包含以下几个步骤。第一,创建需要发布的虚拟器件所对应的OVF文件。第二,准备好需要添加到OVF包里的虚拟器件镜像,为了减小OVF包的体积,二进制格式的虚拟磁盘可以采用GZIP格式进行压缩。第三,为了防止恶意用户对发布的OVF包进行篡改,应该对OVF包里面的文件做哈希摘要和签名,并将这些信息保存到摘要清单文件和证书文件,但是这个步骤目前并不是必须的。第四,如果有必要,准备好相关的资源文件。最后,用TAR方式对OVF文件、虚拟器件的镜像文
件、摘要清单文件、证书文件和相关资源文件进行打包,并放置在一个公共的可访问的空间,准备被用户下载或部署。
为了简化组装、发布虚拟器件的操作,IBM公司发布了OVF工具箱,它是一个Eclipse插件程序,功能包括可视化地创建、编辑OVF,对OVF所含信息进行完整性校验,以及将虚拟器件打包成OVF包格式。VMware公司也