跳转到内容

Vagrant

来自 Arch Linux 中文维基

Vagrant 是一款用于管理和配置虚拟化开发环境的工具。

Vagrant 包含“服务商” (providers) 概念。此概念直接映射到虚拟化引擎及其 API。在所有服务商中,VirtualBox 的普及率最高且支持最为完善。如需使用libvirtlxcvmware 等其他引擎,需安装相应的插件

Vagrant 主要通过声明式的 Vagrantfile 来定义虚拟机。只需编写单个 Vagrantfile,即可定义多台虚拟机

安装

安装 vagrantAUR 软件包。

配置

可以通过环境变量来管理 Vagrant。如需查看完整的选项列表,参见官方文档

例如,若要更改 Vagrant 存储大文件的路径,需将 VAGRAN_HOME 设置为合适的目录(默认路径为 ~/.vagrant.d)。

插件

Vagrant 采用中间件架构,以提供强大的插件支持。

使用 Vagrant 内置的插件管理器安装插件。如需同时安装多个插件,需在命令后依次指定:

$ vagrant plugin install vagrant-vbguest vagrant-share

vagrant-libvirt

注意:因 Arch 仓库中最新版 vagrantAUR 包附带的 ruby gem 存在兼容性问题,当前可能导致 libvirt 插件报错,例如:Vagrant failed to properly resolve required dependencies

为避免此兼容性问题,可根据官方文档的说明,通过 Podman 或 Docker 使用容器镜像作为替代方案。

注意:此问题现已修复(至少自 vagrant 2.4.5-1 版本起已恢复正常)

此插件为 Vagrant 增加了 libvirt 服务商支持。使用此服务商前,必须先安装并配置好 libvirt 及其相关软件包(如 QEMU)。

安装此插件前,务必确认已安装 base-devel 并已启动 libvirtd.service。随后执行:

$ vagrant plugin install vagrant-libvirt

插件安装完成后,即可使用 libvirt 服务商:

$ vagrant up --provider=libvirt

若遇到依赖版本不匹配的问题,可设置以下环境变量以忽略 gem 版本限制:

export VAGRANT_DISABLE_STRICT_DEPENDENCY_ENFORCEMENT=1

若遇到 ruby-libvirt 构建失败的问题,可尝试执行以下命令(根据需要将命令中的 lib 替换为 lib64):

$ CONFIGURE_ARGS='with-ldflags=-L/opt/vagrant/embedded/lib with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/usr/lib' \
   GEM_HOME=~/.vagrant.d/gems \
   GEM_PATH=$GEM_HOME:/opt/vagrant/embedded/gems \
   PATH=/opt/vagrant/embedded/bin:$PATH \
       vagrant plugin install vagrant-libvirt

若需查看更多故障排除指南,请参考[1]

vagrant-lxc

先从官方仓库安装 lxc,随后执行:

$ vagrant plugin install vagrant-lxc

接下来,按照官方仓库的指引配置 lxc。配置完成后,可通过如下 Vagrantfile 使用此插件:

这篇文章的某些内容需要扩充。

原因:此处使用的是任意镜像。后续应补充透明仓库的链接,或添加如何构建自定义镜像的说明。 (在 Talk:Vagrant 中讨论)
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure("2") do |config|

    config.vm.define "main" do |config|
        config.vm.box = 'http://bit.ly/vagrant-lxc-wheezy64-2013-10-23'

        config.vm.provider :lxc do |lxc|
            lxc.customize 'cgroup.memory.limit_in_bytes', '512M'
        end

        config.vm.provision :shell do |shell|
            shell.path = 'provision.sh'
        end
    end
end

provision.sh 文件应为放置在 Vagrantfile 同级目录下的 Shell 脚本。在此脚本中编写所需的初始化配置。例如,若要卸载上述 box 中自带的 puppet,可编写如下内容:

rm /etc/apt/sources.list.d/puppetlabs.list
apt-get purge -y puppet facter hiera puppet-common puppetlabs-release ruby-rgen

配置自动化

通过使用“配置器” (Provisioners),可在执行 vagrant up 的过程中自动安装软件、修改并自动化配置。最常见的配置器为 puppet

Vagrant 基础镜像

以下是获取各种用途(开发、测试或生产环境) Vagrant 基础镜像 (vagrant base boxes) 的站点列表:

  • Vagrant Cloud - HashiCorp 的官方 Vagrant 镜像站点。在此可浏览用户提交的镜像或上传自制镜像。单个 Vagrant Cloud 镜像可通过版本控制支持多个服务商。
  • Bento - 一个封装了用于构建 Vagrant 基础镜像的 Packer 模板的项目。部分模板已构建并发布至 Vagrant Cloud 上的 bento 组织
  • Vagrant Ubuntu Cloud Images - 自 2013 年 1 月起上线。Canonical 尚未正式推广(现已停止生命周期 (EOL) 或标准支持 (EOSS))

故障排除

主机与 Vagrant 虚拟机之间无法 Ping 通(仅主机网络模式)

有时会出现仅主机网络 (host-only networking) 无法正常工作的问题。表现为主机在 vboxnet 接口上没有 IP 地址,主机无法 Ping 通 Vagrant 虚拟机,虚拟机也无法 Ping 通主机。根据 kevin1024 在此讨论串中的提示,安装 net-tools 软件包即可解决。

无法从 Arch 主机系统通过网络访问虚拟机

自 1.8.4 版本起,Vagrant 似乎仍在通过已弃用的 route 命令来配置连接至虚拟机的桥接路由。若未安装 route,将因缺少相应路由而导致无法从主机系统访问虚拟机。解决方法如前文所述,安装包含 route 命令的 net-tools 软件包即可。

执行 "vagrant up" 停滞在 NFS 挂载阶段 (Mounting NFS shared folders...)

安装 nfs-utils 软件包可能会解决此问题。

同时务必确认连接未被 iptablesnftables 拦截。若同时使用 libvirtfirewalld,须为 libvirt 区域(zone)放行 nfsnfs3)、rpc-bindmountd 服务。

挂载 NFS 共享文件夹报错:mount.nfs: requested NFS version or transport protocol is not supported

安装 nfs-utils 软件包。编辑 /etc/nfs.conf 并取消以下几行的注释,以启用(v3 和)UDP 支持:

[nfsd]
vers3=y
udp=y

随后Restart nfs-server.service 以立即应用更改。

启动网络"default"报错:internal error: Failed to initialize a valid firewall backend

通常原因为未安装防火墙依赖。安装 iptablesdnsmasq 软件包,随后重启 libvirtd.service 单元。

无法通过 SSH 连接至 Vagrant 客户机

检查 BIOS 中是否已经开启虚拟化支持。虽然 Vagrant 提示虚拟机已启动,但这并不意味着虚拟化一切正常。部分 Vagrant 镜像(例如 tantegerda1/archlinux)在未开启 CPU 虚拟化时,仍能运行到 SSH 阶段才报错

报错:Could not get preferred machine for domain

Error while creating domain: Error saving the server: Call to virDomainDefineXML failed: could not get preferred machine for domain

检查 BIOS 中是否已开启虚拟化支持。

另见