Vagrant
Vagrant 是一款用于管理和配置虚拟化开发环境的工具。
Vagrant 包含“服务商” (providers) 概念。此概念直接映射到虚拟化引擎及其 API。在所有服务商中,VirtualBox 的普及率最高且支持最为完善。如需使用libvirt、lxc 或 vmware 等其他引擎,需安装相应的插件。
Vagrant 主要通过声明式的 Vagrantfile 来定义虚拟机。只需编写单个 Vagrantfile,即可定义多台虚拟机
安装
配置
可以通过环境变量来管理 Vagrant。如需查看完整的选项列表,参见官方文档。
例如,若要更改 Vagrant 存储大文件的路径,需将 VAGRAN_HOME 设置为合适的目录(默认路径为 ~/.vagrant.d)。
插件
Vagrant 采用中间件架构,以提供强大的插件支持。
使用 Vagrant 内置的插件管理器安装插件。如需同时安装多个插件,需在命令后依次指定:
$ vagrant plugin install vagrant-vbguest vagrant-share
vagrant-libvirt
Vagrant failed to properly resolve required dependencies
为避免此兼容性问题,可根据官方文档的说明,通过 Podman 或 Docker 使用容器镜像作为替代方案。
此插件为 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 使用此插件:
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) 的站点列表:
- 维护良好且持续更新的 Arch Linux x86_64 Vagrant 基础镜像。
- Vagrant Cloud - HashiCorp 的官方 Vagrant 镜像站点。在此可浏览用户提交的镜像或上传自制镜像。单个 Vagrant Cloud 镜像可通过版本控制支持多个服务商。
- vagrantbox.es - Vagrant 基础镜像列表。此项目由 Gareth Rushgrove (@garethr) 发起,托管于 Heroku 并使用 Nginx 服务。其背后故事参见:Vagrantbox.es 的故事。
- Puppet Labs Vagrant Boxes - 由 Puppet Labs 团队制作、开箱即用的预制 Vagrant 镜像。
- Vagrant Ubuntu Cloud Images - 自 2013 年 1 月起上线。Canonical 尚未正式推广(现已停止生命周期 (EOL) 或标准支持 (EOSS))
- Github 上的 packer-arch 项目 - 提供配置文件,以便使用 packer包 基于官方 ISO 镜像构建轻量级 Arch Linux Vagrant 镜像。
故障排除
主机与 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 中是否已开启虚拟化支持。