live with scope
序言
做为Linux
的爱好者, 表示对没有完整易用的命令行工具的Windows
平台无爱. 但是, 在Linux
长期使用中, 深感它的图形界面实在太糟糕了. 通常有三种方式来获得Linux
的体验, 一是Cygwin
平台, 它实现了将Linux
软件的底层API
调用转换为Windows
的API
. 二是安装双系统, 但Linux
图形界面的容错性很差, Ubuntu
经常会显示软件崩溃. 三是使用虚拟机, 在VMware
或VirtualBox
上.
Vagrant
是个虚拟机管理器, 它主要做这样几件事: 1, 将虚拟机打包成box
; 2, 将box
分发; 3, 第三者获取box
, 解压获得虚拟机. 它解决的主要痛点是, 如何为团队成员搭建相同的开发环境, 以解决软件运行依赖问题. 程序员的经典梗之一: 这代码在我机子上运行正常啊, 怎么上传到服务器上就挂了呢. 当然, 简单粗暴的方法是将虚拟机每人拷贝一份.
对我而言, 没有什么统一开发环境的需求, 我主要使用它来快速搭建特定环境. 如, 我制作一个基础box
, 在基础上搭建python
开发环境, 搭建rails
开发环境, 搭建R
开发环境等. 当需要的时候, 随时可以由box
来快速获取想要的环境.
初步
在官网https://www.vagrantup.com/
下载对应平台的软件包安装. Vagrant
不用来建立虚拟机, 因此确保你安装有VirtualBox
. 因为VMware
版本的好像收费. 虽然, 官方教程是让你从网上下载制作好的box
, 但考虑到网速, 以及信任问题, 这里会一步步教大家自己制作box
, 这样才有意思.
建虚拟机
这种事对任何一个开发人员都是小意思. 这里主要注意几点就OK了. 这里主要使用Ubuntu
发行版, 其他版本会有些许差异.
请将用户名和密码都设置为
vagrant
, 毕竟之后的box
会分发给第三者安装
ssh
, 命令:sudo apt-get install openssh-server
修改
root
密码为vagrant
,命令:sudo passwd root
设置
vagrant
用户sudo
免密码, 建议在/etc/sudoers.d/
目录新建文件并写入vagrant ALL=(ALL) NOPASSWD: ALL
添加公钥到
~/.ssh/authorized_keys
文件. 可以使用自己的公钥, 也可以使用Vagrant
公开的, 命令:wget https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub -O ~/.ssh/authorized_keys
. 确保.ssh
目录权限为0700
和authorized_keys
文件权限为0600
.推荐安装虚拟机增强包
guest additions package
来实现文件共享, 点击安装增强包后, 命令:sudo mount /dev/cdrom /media/cdrom; cd /media/cdrom; sudo ./VBoxLinuxAdditions.sh
, 视需要可能要安装依赖sudo apt-get install linux-headers-generic build-essential dkms
配置软件源, 安装需要的软件, 更新系统设定虚拟机的端口转发, 图形设置:
控制->设置->网络->端口转发
,关键的两点是主机端口任意和虚拟机端口22
基本上, 以上就是主要操作了, 除了第1个是在VirtualBox
建虚拟机时设定的, 第8条是在VirtualBox
上设定虚拟机的参数, 其余全是在虚拟机内进行的. 这些都是标准设定, 你可以改变用户名和密码, 根用户密码, 以及公钥, 只是需要在项目目录的Vagrantfile
文件进行相应的参数设定.
打包为Box
启动cmd
, 输入命令vagrant package --base vmname --output /path/to/boxname.box
生成Base Box
.
vmname
是virtualbox
虚拟机列表中的名字, 新建虚拟机时输入的名称, 省略--output
时默认在当前目录下生成.box
文件. 命令可在任意目录下执行.
执行命令前最好先关闭虚拟机,就目前的情况看,虽然vagrant
能自动ssh
到虚拟机并执行关机命令,但在windows
执行失败,不确定和平台有没有关系.
如果当前虚拟机本身是从Box
解压生成的, 你安装了些软件, 更新了下系统, 反正是做出些改变, 可以省略--base vmname
参数, 以将改动后的虚拟机重打包成box
以分发.
通过vagrant box add boxurl --name boxname
将box
添加到全局环境中. 此命令最好在box
的生成目录下进行, 否则需要其完整路径. boxurl
随意, 唯一的用处是全局定位指定的box
, 以方便解压生成虚拟机, 而不用指定box
文件的完整路径.
生成虚拟机
新建项目目录并切换, 执行vagrant init boxurl
命令. 生成.vagrant
目录, 包含ssh
到虚拟机的私钥, 以及Vagrantfile
文件, 用于虚拟机的参数设定.
好了, 你现在从指定的box
生成了一个新的虚拟机, 对这个虚拟机的所有操作都不会影响到box
, 在不需要时完全可以删除.
以下命令是经常使用的:
vagrant up # 开机
vagrant ssh # 连接
vagrant halt # 关机
vagrant suspend # 相当于休眼
vagrant resume # 恢复
vagrant destroy [-f] # 删除虚拟机
更多的命令
管理系统的box
vagrant box remove boxname移除box
vagrant box list查看全局box
vagrant box outdated检查当前项目使用的box是否有更新
vagrant box repackage NAME PROVIDER VERSION重打包box到当前目录,其中3个参数由vagrant box list获取.是add解压的反过程
vagrant box update [--box boxname]更新box,但并不反应在当前项目的虚拟机上,需要destroy后再up
额外的说明
在windows
平台,请确保ssh
程序在path
中,或者通过你喜欢的ssh client
,如putty
, xshell
. 默认up
时会建立主机2222
端口到虚拟机22
端口的映射, 并删除此前添加的公开公钥而使用随机生成的公钥, 而对应的私钥存储在当前项目目录的.vagrant\machines\default\virtualbox\private_key
, 用户名为vagrant
.
开启虚拟机后,并不显示虚拟机, 但其确实已运行, 打开virtualbox
后可看到项目运行的虚拟机名,点击显示则可显示虚拟机. 或者说, 虚拟机默认以headless
模式运行, 也就是不显示界面, 这是VirtualBox
提供的功能.
就我个人理解来看, 实际上, 上述的功能都可以通过VboxManage
命令来进行. Vagrant
对虚拟机的管理, 要么通过VirtualBox
提供的开发接口来实现, 要么能过ssh
到虚拟机中来实现.
最后, Vagrant
是用Ruby
开发的.