Vagrant 管理虚拟机

万万没想到,有一天也会沦落到在一台4G内存的Win7笔记本上搞linux编程,还我的16核Z600……好吧,抱怨也是没有用的,和销售人员一样型号的13寸笔记本,标志着我的coding生涯从此全面进入虚拟机和SSH时代。

先不说外接键盘、鼠标、显示器的酸爽,作为开发编译环境的虚拟机就是个问题。放在某个server上,锁在大楼的某处,感觉蛮牢。直到一次急等着release一个feature时怎么也连不上,跑去一看,那台server已经被人大卸八块了……幸好最后装上还能用,着实惊出一身冷汗。这件事提醒我真的需要好好考虑怎么将开发环境管理好,减少重新配置环境的开销和风险,甚至为整个团队构建更高效的开发和测试环境,提高团队效率……

vagrant

解放生产力的共产主义理想先不说,说起虚拟机的设置、部署和迁移,vagrant是鼎鼎大名了。按照官网的描述,vagrant是用于创建和配置轻量级、可复用、跨平台的开发环境的工具。

vagrant的主要特点

  1. 支持多个虚拟化工具,良好的跨平台性能。vagrant支持VirtualBox, Hyper-V, VMware和Docker等虚拟化工具,用户也可以定制provider。
  2. 提供可配置的虚拟机管理方法。Vagrant的配置文件,使用Ruby的语法描述。通过定义Vagrantfile,可以对虚拟机的网络设置、共享文件、端口转发、内存、CPU等进行定制,通过vagrantfile就可以方便进行部署和迁移。
  3. 提供了基于标准box定制的privisioning机制。
  4. 便利的打包和分发过程。vagrant 提供了高效的打包(box)和分享帮助,提供了注册官方的box repository,用户也可以架设自己的分享服务。

安装使用

vagrant安装过程相当的简便,windows, linux和mac os上都有一键式安装包。主要操作也非常简单,可以参考官方教程

1
2
3
4
5
6
7
8
agrant box add # 添加box的操作
vagrant init # 初始化
vagrant up # 启动虚拟机
vagrant halt # 关闭虚拟机
vagrant reload # 重启虚拟机
vagrant ssh # SSH 至虚拟机
vagrant status # 查看虚拟机运行状态
vagrant destroy # 销毁当前虚拟机

共享文件的链接问题

如果单机使用,vagrant可以很方便的映射好共享文件夹。但是由于不同文件系统的原理和功能有差异,这个共享文件有时还是会遇到一些麻烦的。比如在windows上安装vagrant管理多个linux的Vitrualbox虚拟机,如果在linux虚拟机中操作共享文件夹,因为windows操作系统不支持linux一样的软连接,就可能遇到文件链接的错误。下面就是npm在安装node.js包时遇到的错误:

1
2
3
npm ERR! Error: UNKNOWN, symlink '../which/bin/which'
npm ERR! If you need help, you may report this log at:
npm ERR! <http://github.com/isaacs/npm/issues>

解决这个问题可以给npm加上参数npm install --no-bin-links,也可以在vagrant配置中修改provider参数,然后重启vagrant。这里注意需要在windows用管理员权限启动vagrant。

1
2
3
config.vm.provider "virtualbox" do |v|
v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant", "1"]
end

Vagrantfile文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "ubuntu/trusty64"
# config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 4000, host: 40000
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
#vb.gui = true
vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant-root", "1"]
vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant", "1"]
# Customize the amount of memory on the VM:
vb.memory = "1024"
end
end