对于使用 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/
我觉得吧,这玩意虽然看起来挺好,但是实际上应该没什么大用途。
真正会使用linux做开发的,不在乎是用远程主机还是虚拟机做环境,只要能做到心里有数,环境什么都无所谓。
半吊子的话,你给他服务器他不一定装的上linux,你给他远程主机他也是当个ftp来回传。这种人你让他用virtualbox可能他都装不明白系统,更别说这Vagrant了。
其实可以用winscp来传,
如果是做开发嘛,直接在linux下就好了,像atom和vim之类工具的还是很赞的
网络够好的话开个VPS就可以了。Linux做开发有很大的优势,相对于Atom和Vim个人更喜欢Sublime Text。
在线还是很麻烦的,平时住校没有电脑时,在线IDE什么的都弄过~