Vagrant 初探

对于使用 Windows 系统,同时又需要在 Linux 下调试各种程序、脚本的人来说,虚拟机固然是一个好办法,但是虚拟机的安装有的时候并不那么简单,而且如果把开发环境放到 Linux 虚拟机中,执行效率成问题;如果在宿主机上开发,在部署的时候虚拟机和宿主机之间文件交换也十分的不方便,特别是 Linux 虚拟机。所以 Vagrant 正是为了解决这样一个问题而诞生的解决方案。使用 Vagrant 可以做到在宿主机上开发,又能在 Linux 环境下执行。

Vagrant 是基于Virtual Box 等虚拟化软件的,但是其比真正在虚拟机中安装 Linux 更为轻量级。首先,需要安装一个虚拟化软件,这里选择 Virtual Box(https://www.virtualbox.org/wiki/Downloads)。下载并安装。

接着安装 Vagrant, 其官方网站是 https://www.vagrantup.com/ 。从其下载页面https://www.vagrantup.com/downloads.html 选择对应操作系统的版本。下载并安装。

这里以Windows 为例,安装完成之后,就像官网首页上面说的那样,只要在一个目录下面,打开“命令提示符”执行:

vagrant init hashicorp/precise32
vagrant up

就可以开启一个虚拟机。当然,与传统意义上的虚拟机有所区别,Vagrant 称其为盒子。

我们从分析这两行命令开始,首先可以看到 vagrant init hashicorp/precise32 这条命令是用一个镜像初始化一个虚拟机,其结果就是在当前工作目录下创建一个 Vagrantfile 文件。这个 Vagrant 文件的作用就是描述一些盒子中系统的配置、启动时执行的命令。

看到这里,想必你已经想到了一样东西,没错,就是 Docker。可以说 Docker 和 Vagrant 非常地相似,包括其命令也有相似之处。但是 Docker 和 Vagrant 的运行机制完全不同。Docker 基于当前的操作系统,从当前系统中划分出来一块虚拟的运行空间,本质上还是执行了一个应用,只不过应用与应用、应用于系统之间都有着隔离。而 Vagrant 则是直接启动了一个最小化的虚拟机。从执行效率上来讲, Docker 相当于直接在宿主系统中执行,而 Vagrant 仍然要虚拟一个完整的系统,所以 Docker 理论上效率更高。而且 Docker 的镜像体积更小。但是 Vagrant 并不是没有任何优势,首先,Vagrant 的虚拟机可以很方便地模拟真实环境,便于开发。这一环境还能很方便地通过配置文件进行大量部署,甚至可以打包分发。相比之下 Docker 要想运行自己写的程序就没那么容易了。

说到这里,第二条命令的作用也就显而易见了,就是启动这个虚拟机。执行完成之后,会有这样的提示:

default: /vagrant => <WorkDIR>

意为虚拟机中的 /vagrant 目录已经被映射到宿主机执行命令的工作目录下面。

接着执行 $ vagrant ssh 即可启动虚拟机的 ssh 服务器。并且给出了登录信息:

Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: <WorkDIR>/.vagrant/machines/default/virtualbox/private_key

在 SSH 客户端中输入这样的信息即可登录。

接下来就可以在虚拟机中进行环境的配置。hashicorp/precise32 这个镜像的系统是Ubuntu。

其他系统的镜像可以从 https://atlas.hashicorp.com/boxes/search 寻找。这里有很多社区提供的镜像可供选择。

Windows 自带的“命令提示符”应该来说只能算够用,真正要用好 Vagrant 还是建议安装 Cygwin 环境(https://cygwin.com/)。推荐下载 setup_x86.exe。Cygwin 推荐安装常见的 Linux 工具。但是 rsync 和 ssh 是必装的。如果没有 rsync 在启动一些镜像时(如下面提到的 CentOS 7,就会出现问题)。

以 CentOS 7 为例,下面全程在 Cygwin 环境下执行。在刚才的搜索页面可以找到 CentOS 7的镜像名称。所以首先执行

vagrant init centos/7

初始化工作目录。

接着,再执行

vagrant up

就能启动。

最后再执行

vagrant ssh

你会发现这时候 Cygwin 的好处就显现出来了。直接就在当前的终端进入了虚拟机的终端。

那么最后,如果不想一直让虚拟机开着,需要关闭虚拟机,可以执行下面的命令

vagrant halt

在我自己进行测试的时候,执行 vagrant up 后报错,信息如下:

==> default: Rsyncing folder: <WorkDIR> => /home/vagrant/sync
There was an error when attempting to rsync a synced folder.
Please inspect the error message below for more info.
Host path: <WorkDIR>
Guest path: /home/vagrant/sync
Command: rsync --verbose --archive --delete -z --copy-links --chmod=ugo=rwX --no-perms --no-owner --no-group --rsync-path sudo rsync -e ssh -p 2222 -o StrictHostKeyChecking=no -o IdentitiesOnly=true -o UserKnownHostsFile=/dev/null -i '<WorkDIR>/.vagrant/machines/default/virtualbox/private_key' --exclude .vagrant/ <WorkDIR> [email protected]:/home/vagrant/sync
Error: 0 [main] rsync 7476 <Cygwin_DIR>\bin\rsync.EXE: *** fatal error in forked process - fork: can't reserve memory for parent stack 0x600000 - 0x800000, (child has 0x400000 - 0x600000), Win32 error 487
594 [main] rsync 7476 cygwin_exception::open_stackdumpfile: Dumping stack trace to rsync.EXE.stackdump
1 [main] rsync 43404 fork: child -1 - forked process 7476 died unexpectedly, retry 0, exit code 0x100, errno 11
rsync: fork: Resource temporarily unavailable (11)
rsync error: error in IPC code (code 14) at pipe.c(65) [sender=3.1.1]

原因经过一番查找,发现 GitHub 上有相关的 issue。导致这个问题的原因是我用的是 64 位的 Cygwin,从错误信息来看,似乎是内存方面的原因。解决方案自然是换成 32 位的Cygwin。这也是为什么之前推荐下载 32 位的 Cygwin 的原因。

参考资料:

https://github.com/mitchellh/vagrant/issues/4073

https://docs.vagrantup.com/v2/

《Vagrant 初探》上有4条评论

  1. 我觉得吧,这玩意虽然看起来挺好,但是实际上应该没什么大用途。
    真正会使用linux做开发的,不在乎是用远程主机还是虚拟机做环境,只要能做到心里有数,环境什么都无所谓。
    半吊子的话,你给他服务器他不一定装的上linux,你给他远程主机他也是当个ftp来回传。这种人你让他用virtualbox可能他都装不明白系统,更别说这Vagrant了。

    1. 网络够好的话开个VPS就可以了。Linux做开发有很大的优势,相对于Atom和Vim个人更喜欢Sublime Text。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注