搭建Linux工作环境之Vagrant

560 查看

live with scope

序言

做为Linux的爱好者, 表示对没有完整易用的命令行工具的Windows平台无爱. 但是, 在Linux长期使用中, 深感它的图形界面实在太糟糕了. 通常有三种方式来获得Linux的体验, 一是Cygwin平台, 它实现了将Linux软件的底层API调用转换为WindowsAPI. 二是安装双系统, 但Linux图形界面的容错性很差, Ubuntu经常会显示软件崩溃. 三是使用虚拟机, 在VMwareVirtualBox上.

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目录权限为0700authorized_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.

vmnamevirtualbox虚拟机列表中的名字, 新建虚拟机时输入的名称, 省略--output时默认在当前目录下生成.box文件. 命令可在任意目录下执行.

执行命令前最好先关闭虚拟机,就目前的情况看,虽然vagrant能自动ssh到虚拟机并执行关机命令,但在windows执行失败,不确定和平台有没有关系.

如果当前虚拟机本身是从Box解压生成的, 你安装了些软件, 更新了下系统, 反正是做出些改变, 可以省略--base vmname参数, 以将改动后的虚拟机重打包成box以分发.

通过vagrant box add boxurl --name boxnamebox添加到全局环境中. 此命令最好在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开发的.