跳转到内容

Vagrant

来自 Arch Linux 中文维基

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

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

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包 软件包可能会解决此问题。

同时务必确认连接未被 iptables包 或 nftables包 拦截。若同时使用 libvirt 和 firewalld,须为 libvirt 区域(zone)放行 nfs(nfs3)、rpc-bind 和 mountd 服务。

挂载 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

通常原因为未安装防火墙依赖。安装 iptables包 和 dnsmasq包 软件包,随后重启 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 中是否已开启虚拟化支持。

另见