Vagrant (四) Advanced of Box

还是看掘金吧:[HERE](https://juejin.im/post/5c75f73d6fb9a049fe35cffa)

Box 是一个 bundle 或者 package,它将一台虚拟机所需要的一切设施捆绑到一个单一的、可交换的文件之中,从而提供了分享的便利。

从这一点上说,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,那就已经不在这个问题讨论范围内了。

## 自己的box

### 打包 VM 为 box

一般的用法是:

```bash

vagrant package --base dos7bc31 --output dos7bc31.box

```

在这里,你首先在VirtualBox中制作了一个名为 dos7bc31 的虚拟机,并且在虚拟机中搭建了 DOS 7.1的环境和安装了 Borland C++ 3.1,然后发布此命令就能得到一个 box 文件了:

```bash

$ 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` 在当前的空文件夹中建议一份。

### 分发 box

LAN中,直接传输 box 给他人即可。

你也可以考虑发布 box 到公共目录中。

### 使用 box

对于一个本地的 box 文件,可以这样添加它:

```bash

vagrant box add --name hedzr/dos71bc31 ./dos71bc31.box

```

然后就可以初始化相应的实例了:

```bash

mkdir test && cd test1

vagrant init hedzr/doc71bc31

vagrant up

```

### 迭代

当发布了你的box的新版本之后,接收人需要更新它。对于本地的 box 文件,更新的方法是:

```bash

vagrant box add -f --name hedzr/dos72bc31 './dos71bc31 (1).box'

```

如果发布者在构建 box 时正确地进行了 `config.vm.box_version` 的管理的话,则 `-f` 标志不必使用。

## 命令和概念参考

相关的 vagrant 命令参考如下:

### package

`package` 命令用于从虚拟机提供商(例如 virtualbox)环境中已经创建了虚拟机实例中打包一个 .box 可交换文件出来。

```bash

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

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](https://www.vagrantup.com/docs/cli/box.html)。

为免填充字数只说,这里不再罗列了。

```bash

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 loader

按照官方的说法,Vagrantfile能够被合并。

这就是说,当你通过 `vagrant init` 建立了一个新的虚拟机环境时,vagrant将会一次检查一系列的可用的 Vagrantfile 并将它们合并到最终为你生成的 `Vagrantfile` 中。而当 `vagrant up` 当前虚拟机时,vagrant同样会检查这一系列可用的 Vagrantfile,并依据有否变更或虚拟机有否不符等实际情况对真实的虚拟机进行配置修订。

这些可用的 Vagrantfile 包括:

1. box 中自带的

2. 你在 ~/.vagrant.d/ 中自定义的一个 Vagrantfile

3. 你的当前虚拟机的 Vagrantfile。当 `vagrant init` 时,此文件尚未存在故略过,当 `vagrant up` 时它会被检视,并根据实际情况去修订虚拟机

4. 如果存在 [Multi-machine overrides](https://www.vagrantup.com/docs/multi-machine/)

5. 如果存在 [Provider-specific overrides](https://www.vagrantup.com/docs/providers/configuration.html)

可以参考:[Load Order and Merging](https://www.vagrantup.com/docs/vagrantfile/#load-order)

### GUI模式

有多种方法启用或禁用 虚拟机的 GUI 界面。

直接通过命令行:

```

vagrant up --gui

vagrant up --headless

```

修改 `Vagrantfile` 配置文件:

```ruby

config.vm.provider "virtualbox" do |v|

  v.gui = true

end

```

对于大多数基于 Linux Server 的虚拟机来说,乃至于 vagrant 默认情况下,一个虚拟机总是被启动于 headless 无界面模式的。

不过即使这样,你还是可以在 VirtualBox应用程序界面中双击虚拟机缩略图或者通过虚拟机子菜单显示其 gui 界面。

有人曾钻研过这个问题,列出了一个更奇技的方法来方便你指定GUI模式与否。其方法是修改Vagrantfile加入如下片段:

```ruby

# 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

```

然后你就可以这样来执行命令:

```bash

# 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/23929641/6375060

不过我觉得多余。至于我列举的原因呢,只是展示一种使用环境变量的方法,它可以被用于自行装配和分发 box。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容