Category: OpenSource 开源

Vagrant初窥(二)

Box
box是Vagrant用以创建、分发虚拟机镜像的压缩文件。例如,对于本文例子中的lucid32.box,其内部结构如下:

基本上,Vagrant的box文件是一个OVF压缩包(为什么说基本上呢?大家可以移步我的这篇博文,这里不深入探究)。OVF(Open Virtualization Format,开放虚拟化格式)是由HP、VMWare、XenSource等公司或团体组成的DMTF(Distributed Management Task Force)组织提出的虚拟化格式标准,于2008年9月发布v1.0,截至本文为止的最新版本是v1.1.0。OVF描述了虚拟机打包与分发的各种配置和扩展点,其目的在于提供一种开放、安全、可移植和可扩展的格式,而不需要依赖于特定的超管理程序(hypervisor)或者处理器架构。目前,OVF已经被业界广泛接受,主要的虚拟化厂商与组织,如VMWare、IBM或者VirtualBox都已经提供了支持。OVF的详细格式可参阅OVF规范,这里不多做分析。

OVF压缩包(OVF Archive,OVA)是OVF打包与分发的基本单元,由一个或者多个虚拟机镜像以及其他的一些元数据文件组成。一个OVA压缩包通常会包括一个OVF描述文件、一个或者多个虚拟机镜像文件、一组本地化文件、一个manifest文件和一个证书文件,其中只有OVF描述文件和虚拟机镜像文件是必须的,其他都是可选的。

对于本文例子中的lucid32.box,里面除了box.ovf文件,还包括了一个box-disk1.vmdk、一个box.mf文件以及一个Vagrantfile文件。box-disk1.vmdk是基于VMWare提出的vmdk虚拟镜像文件格式,它为VMWare和VirtualBox等工具支持。其中的box.ovf是对该虚拟机镜像文件的OVF描述。box.mf里面放的是box-disk1.vmdk和box.ovf的SHA1值。有时候,你可能需要修改虚拟机镜像的配置,你可以手工修改box.ovf的内容,再重新生成它们的SHA1值(如,最后用新的SHA1值替换box.mf里面的内容即可。

由于Vagrant box就是OVF压缩包,同时,vmdk也是一种较为通用的虚拟镜像文件格式。所以在原理上,所有兼容OVF格式的超管理程序(hypervisor)和虚拟工具(VirtualBox、Oracle VM或者VMWare等)都能很好的解析和支持Vagrant box。

Vagrant的子命令vagrant box提供了管理box的所有功能,如add、list、remove、repackage等。这些子命令都非常自解释,如list是列出本地的Vagrant box,remove是删除指定的Vagrant box,repackage是重新打包本地的Vagrant box等。Vagrant box add会将指定的box文件(同时支持http、file协议)添加到本地——即把该box文件下载到本地,并解压缩为~/.vagrant.d/boxes下的同名文件夹。比如,你可以在~/.vagrant.d/boxes/lucid32文件夹下面找到上面所有的文件。这样,Vagrant就将box添加到本地,接下来就可以基于Vagrant box创建、启动、配置虚拟机实例了。

接下来,让我们看第二条命令:
$ vagrant init lucid32
执行完这条命令之后,Vagrant会在当前目录创建一个Vagrantfile文件。这是我们要接触的第二个概念——Vagrantfile。

Vagrant初窥(一)

虚拟化技术已经飞入日常工作。很多人为了开发、测试,会在本地创建一个VirtualBox或者VMWare虚拟机,以模拟某个特定的目标环境(如Windows XP、IE7等)。为了实现这个目标,人们往往需要手工去安装所需的操作系统或者软件,手工配置一些环境变量,再手工将打好的部署包拷贝过去,并且手工部署应用程序。整个过程基本上都是手工操作,而且需要确保每个步骤都配置正确——耗时,且容易出错。有没有什么工具可以帮助我们将这些工作自动化,省去繁琐的手工操作,确保可靠地、可重复地执行这个过程?

Vagrant就是这样一款非常优秀的工具,它很好地封装了虚拟文件镜像、VirtualBox API以及配置工具(如puppet、chef等)等成熟工具的使用,从而能够帮助开发人员很方便地、可复用地创建、配置和分发虚拟机的工具。借助于Vagrant,开发团队可以自动化应用环境的创建、配置以及应用程序的部署,甚至进一步将环境的集成纳入到构建流水线、持续集成。本文将介绍Vagrant的基本用法、概念模型、内部机制以及veewee插件,带着大家一窥Vagrant的神秘之处。

引子

在开始之前,首先请确保本地已经安装了VirtualBox,可以正常地创建、管理虚拟机,而且本地已经安装了Vagrant。您可以通过在命令行执行vagrant -v来查看当前安装的vagrant版本。

如果这两者都已准备妥当,下面就让我们看一个简单的例子:
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
$ vagrant init lucid32
$ vagrant up


在经过一系列的步骤之后,vagrant提示虚拟机已经完成了创建。让我们来试试这台刚创建的虚拟机,ssh登陆到虚拟机上面去:
$ vagrant ssh

可以看到,经过这样简单的几步,我们就拥有了一台完全可用的Linux机器。接下来,我们可以在虚拟机上面安装软件、配置环境——就象操作本地机器一样。这一切是怎么做到的呢?我们一步步来分析上面的步骤,看看Vagrant在其中做了些什么。
首先,我们是执行了box add命令:
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
这里,我们先执行vagrant box list,命令行控制台会输出如下的box列表:

centos-6.2-64bit_4.1.8
centos6-32
debian64_chef
lucid32

我们可以发现在执行完vagrant box add之后,本地的Vagrant box会增加一个名为lucid32的新box。这是我们接触的第一个概念——box。