Box 是一個 bundle 或者 package,它將一臺虛擬機所須要的一切設施捆綁到一個單一的、可交換的文件之中,從而提供了分享的便利。html
從這一點上說,Box 和 OVF 是同樣的東西。不過 OVF 是具備公信力的標準格式,而 Box 則是 Vagrant 的私有格式。因此人們難免疑問既然如此、豈非我仍是去 VMWare/VirtualBox 中導出 ovf 格式的比較好吧?事實上又並不是這麼簡單,就好像 Microsoft Office 也是私有格式同樣,它仍是通行於全球。因此,通常地看,爲着分享一個極爲有效的基礎設施的目的,你可能仍是須要經過 Vagrant Box 特性創建你的基礎設施的 VirtualBox/VMWare/KVM/Hyper-V 分發包,才能真的讓世界上的其它人或許感謝你的友好;而若是你只是臨時給LAN中某我的傳遞一個snapshot的話,就ovf好了;若是你的 team 統一使用 vagrant 爲開發容器環境的話,那固然仍是 box 了;若是你的 team 主力使用 docker,那就已經不在這個問題討論範圍內了。docker
通常的用法是:windows
vagrant package --base dos7bc31 --output dos7bc31.box
在這裏,你首先在VirtualBox中製做了一個名爲 dos7bc31 的虛擬機,而且在虛擬機中搭建了 DOS 7.1的環境和安裝了 Borland C++ 3.1,而後發佈此命令就能獲得一個 box 文件了:ruby
$ vagrant package --base dos71bc31 --output dos71bc31.box ==> dos7bc31: Exporting VM... ==> dos7bc31: Compressing package to: /Users/hz/vmt/dos7/dos71bc31.box $ ll total 113784 -rw-r--r-- 1 hz staff 3.0K Feb 21 10:05 Vagrantfile -rw-r--r--@ 1 hz staff 55M Feb 21 10:08 dos71bc31.box
固然,你須要爲那個虛擬機準備一份 Vagrantfile,這能夠用 vagrant init
在當前的空文件夾中建議一份。bash
LAN中,直接傳輸 box 給他人便可。less
你也能夠考慮發佈 box 到公共目錄中。ide
對於一個本地的 box 文件,能夠這樣添加它:fetch
vagrant box add --name hedzr/dos71bc31 ./dos71bc31.box
而後就能夠初始化相應的實例了:ui
mkdir test && cd test1 vagrant init hedzr/doc71bc31 vagrant up
當發佈了你的box的新版本以後,接收人須要更新它。對於本地的 box 文件,更新的方法是:this
vagrant box add -f --name hedzr/dos72bc31 './dos71bc31 (1).box'
若是發佈者在構建 box 時正確地進行了 config.vm.box_version
的管理的話,則 -f
標誌沒必要使用。
相關的 vagrant 命令參考以下:
package
命令用於從虛擬機提供商(例如 virtualbox)環境中已經建立了虛擬機實例中打包一個 .box 可交換文件出來。
Usage: vagrant package [options] [name|id] Options: --base NAME Name of a VM in VirtualBox to package as a base box (VirtualBox Only) --output NAME Name of the file to output --include FILE,FILE.. Comma separated additional files to package with the box --vagrantfile FILE Vagrantfile to package with the box -h, --help Print this help
box 包含一組子命令:add,list,outdated,prune,remove,repackage,update。
命令 | 描述 |
---|---|
add | 添加 box(從文件、url、短名字)到 vagrant boxes管理區,必要時自動下載它 |
list | 列出 vagrant boxes 管理區中已有的本地 boxes |
outdated | 檢查本地 boxes 的時效性,有否新版本存在 |
prune | 刪除本地 boxes 的舊版本,僅保留最新的一個版本 |
remove | 刪除一個本地 box |
repackage | 從新打包一個本地 box,這多用於本地建立新box的過程當中 |
update | 更新一個本地 box,從遠程來源 |
你能夠經過 vagrant box add --help
來獲取相應的命令行參數參考。或者檢查官網:Box。
爲免填充字數只說,這裏再也不羅列了。
cd dos71bc31 vagrant package --base dos71bc31 --output dos71bc31.box --vagrantfile vagrant box add -f --name hedzr/dos71bc31 dos71bc31.box mkdir test1 && cd test1 vagrant init hedzr/dos71bc31 vagrant up # shutdown VM from virtualbox ... vagrant destroy -f cd - vagrant box remove hedzr/dos71bc31 -f
按照官方的說法,Vagrantfile可以被合併。
這就是說,當你經過 vagrant init
創建了一個新的虛擬機環境時,vagrant將會一次檢查一系列的可用的 Vagrantfile 並將它們合併到最終爲你生成的 Vagrantfile
中。而當 vagrant up
當前虛擬機時,vagrant一樣會檢查這一系列可用的 Vagrantfile,並依據有否變動或虛擬機有否不符等實際狀況對真實的虛擬機進行配置修訂。
這些可用的 Vagrantfile 包括:
vagrant init
時,此文件還沒有存在故略過,當 vagrant up
時它會被檢視,並根據實際狀況去修訂虛擬機有多種方法啓用或禁用 虛擬機的 GUI 界面。
直接經過命令行:
vagrant up --gui vagrant up --headless
修改 Vagrantfile
配置文件:
config.vm.provider "virtualbox" do |v| v.gui = true end
對於大多數基於 Linux Server 的虛擬機來講,乃至於 vagrant 默認狀況下,一個虛擬機老是被啓動於 headless 無界面模式的。
不過即便這樣,你仍是能夠在 VirtualBox應用程序界面中雙擊虛擬機縮略圖或者經過虛擬機子菜單顯示其 gui 界面。
有人曾鑽研過這個問題,列出了一個更奇技的方法來方便你指定GUI模式與否。其方法是修改Vagrantfile加入以下片斷:
# Returns true if `GUI` environment variable is set to a non-empty value. # Defaults to false def gui_enabled? !ENV.fetch('GUI', '').empty? end Vagrant.configure('2') do |config| config.vm.provider 'virtualbox' do |v| v.gui = gui_enabled? end end
而後你就能夠這樣來執行命令:
# for *nix system GUI=1 vagrant up # gui mode vagrant up # -headless mode # for windows SET GUI=1 vagrant up
See also: https://stackoverflow.com/a/2...
不過我以爲多餘。至於我列舉的緣由呢,只是展現一種使用環境變量的方法,它能夠被用於自行裝配和分發 box。