Vagrant 给用明白了,除了怎么配置外,还需要了解其数据状态。首先介绍一些重要的环境变量,因为它们是 Vagrant 状态的概览:

VAGRANT_HOME              USERPROFILE/.vagrant.d
VAGRANT_CWD               项目目录
VAGRANT_EXECUTABLE        Vagrant/embedded/gems/gems/vagrant-1.6.3/bin/vagrant
VAGRANT_SERVER_URL        https://vagrantcloud.com
VAGRANT_VAGRANTFILE       Vagrantfile
VAGRANT_DOTFILE_PATH      VAGRANT_CWD/.vagrant
VAGRANT_LOG               info
VAGRANT_DEFAULT_PROVIDER  ""  即 virtualbox

Vagrant 的状态分为两种,一种是全局的,比如 box 文件、第三方插件、虚拟机信息索引等,还有一些外部状态如 VirtualBox 虚拟机池和 box 资源服务器;另一种是项目的,如实验环境虚拟机的端口映射、共享目录等定义。

Vagrant 全局状态目录会在第一次执行 vagrant 命令时产生

D:\kc\.vagrant.d            // VAGRANT_HOME
  setup_version             // 目录结构版本 environment.rb:setup_home_path
  insecure_private_key      // 官方镜像密钥对私钥
  insecure_private_key.ppk  // 手工转换的 PuTTY 格式私钥
  plugins.json              // vagrant plugin 注册表
  boxes                     // Vagrant 本地镜像目录
    hashicorp-VAGRANTSLASH-precise32  // box name
      metadata_url          // https://vagrantcloud.com/hashicorp/precise32
      1.0.0                 // box version
        virtualbox          // provider
          box.ovf
          box-disk1.vmdk
          metadata.json     // {"provider":"virtualbox"}
          Vagrantfile       // config.vm.base_mac = "080027129698"
  data
    machine-index
      index                 // machines json: share folder, machine name, provider,
                            //   power state, vagrantfile directory, box name
      index.lock 

  gems                      // plugins build and code
  tmp

因为 Vagrant 只是包装了 VirtualBox ,实际上虚拟机还是归 VirtualBox 负责的。Vagrant 充分利用虚拟机快照功能,在创建虚拟机的时候,是基于镜像磁盘快照,而不是复制磁盘,这样一方面可以节省硬盘空间,另一方面创建速度也会快一些。

D:\kc\VirtualBox_VMs
  precise32
    box-disk1.vmdk           // 986MB box disk
  vagrant_example_default_1404007888602_57131
    vagrant_example_default_1404007888602_57131.box  // precise32 的磁盘快照
    Logs
      Vbox.log

vagrant init 后,项目目录中产生 Vagrantfile 文件,这也是一个空项目的初始状态

D:\kc\vagrant_example       // VAGRNAT_CWD 或称 root
  Vagrantfile               // VAGRANT_VAGRANTFILE 配置文件

vagrant up 后,产生该项目实验环境的虚拟机状态

D:\kc\vagrant_example
  Vagrantfile                // 本项目的实验环境定义
  .vagrant                   // 本项目的虚拟机状态
    machines                 // environment.rb:active_machines
      default                // machine
        virtualbox           // provider
          action_provision
          action_set_name
          id                 // VirtualBox uuid
          index_uuid
          synced_folders     // 虚拟机-宿主机 目录映射关系