跳至內容

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 中是否已開啟虛擬化支持。

另見