在研发、调试以及多团队合作过程中,开发人员难免会用到虚拟化技术来帮其构建易于复制和重建的环境。需求的牵引使得 Vagrant 、 VirtualBox 以及 VMWare Workstation 等虚拟化相关的产品相继诞生。这些产品很好的满足了企业和个人的需求,实现了安全性、便捷性等方面的功能。而另外一方面,虚拟化技术发展的也带动了云计算的崛起。因其高效、便捷和经济的特性,很多公司纷纷开始使用云平台作为其主要的计算环境。 Docker 等应用容器引擎的出现,更是为开发者提供一个可移植的容器,方便了应用程序的开发和部署。事实上,云计算已经带来了企业在线业务模式的变革。
但是,在诸多好处的同时,目前的基础架构即服务 (IaaS) 云模型也存在问题。它要求软件开发者必须使用虚拟机管理应用程序。对虚拟机映像的要求限制了云使用者的选择,甚至对某些人而言,还成为了本地环境转移到云平台的一大障碍。为了试图解决该问题,嵌套虚拟化的概念被提出。
所谓嵌套虚拟化就是在虚拟机里再运行虚拟机。对云用户来说,嵌套虚拟化就意味着虚拟机的格式可以与云平台无关。如果能够支持嵌套虚拟化,云平台就可以演变成了高度灵活的虚拟化基础架构,为用户提供更多自由使用的空间。那么,究竟有没有可能在现有框架下,实现类似嵌套虚拟化的功能呢?
针对该问题,GigaSpaces 的 Michael Sverdlik 提供了一种解决方案。本文接下来以云应用的编排系统 Cloudify 和最流行的云平台 AWS 作为例子,详细介绍他如何一步一步的创建 v2v(虚拟到虚拟)机器,及如何创建可以上传到任何 AWS 环境的 VMDK 磁盘镜像。
首先,用户需要利用基于 Ruby 的 Vagrant 工具。该工具主要用于创建和部署虚拟化开发环境,其以 VirtualBox 、 VMware 或者 AWS 等虚拟机为底层,以上层 Chef 等工具来完成自动化安装和配置软件的工作。利用该工具,用户生成一个 Vagrantfile 和一个已经在 VirtualBox 镜像上预装 Cloudify Manager 的 Vagrant box。然后,利用 Vagrant 和 VirtualBox 就可以在本地对 Cloudify 进行测试和评估。其过程可以简单概括为:下载 Vagrantfile、把 vagrant 运行起来和利用 Packer 来创建 Vagrant Box 三个部分。作为与 Vagrant 出自相同作者的 Packer,创建镜像只需要根据教程输入命令即可。
接下来,再仔细审视一次有没有可能不使用嵌套虚拟化而解决相应的需求。可能的解决方案包括:直接利用本地物理机器、利用专门的方法来允许嵌套虚拟化但是,这两种方案显然需要额外的花费以及精力。还有一种方法就是,直接把虚拟机磁盘镜像转换为 VMDK 进行使用。关于如何实现物理到虚拟以及虚拟到物理的方法,之前都已经有人实现过。但是,虚拟到虚拟(V2V)究竟能不能实现呢?文章接下来就开始尝试。
所需要的工具和环境包括作为脚本语言的 Python、与 AWS 结合的 Boto API、作为任务执行器的 Fabric、Packer 以及 IaaS 提供商 AWS。具体的实现步骤为:
- 在利用 packer 预装的 cloudify 上创建一个源镜像(AMI)
- 在 AWS 中利用快照或者源镜像作为一个磁盘来启动一个工作实例
- 在工作镜像上,创建一个 raw 镜像卷作为一个文件,然后在其上创建一个 ext4 分区
- 把数据从源镜像磁盘中复制到之前创建的 ext4 分区中
- 在 ext4 分区上安装 bootloader
- 把 raw 镜像转变为 VMDK
- 把 VMDK 和一个 OVF 描述符和 vagrant 元数据一起创建一个.box 的压缩包
- 上传到 S3
- 清除
最后的结果如何,读者可以根据 Github 中提供的脚本进行亲自测试。
感谢徐川对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论