Winse Blog

走走停停, 熙熙攘攘, 忙忙碌碌, 不知何畏.

Vagrant创建自定义的BOX

在《奔跑吧Ansible》中接触了Vagrant+VirtualBox,但是感觉一般般,也没觉得很特别的:就自己安装虚拟机差不多嘛。

后面在网上了解了一些关于这两工具,很多人用来搭建开发环境,脑子瞬间被击中了—还可以这么玩。这样系统重装的时刻就不用那么纠结和犹豫了,很多软件都安装在VirtualBox里面,重装后,直接启动虚拟机,就一切的开发环境的软件就都回来了。还有集群的搭建也挺方便的:由于Vagrant是命令行的方式结合配置来启动了,非常方便。

官方网站 Vagrantbox.es Discover Vagrant Boxes 有提供一些镜像,如Centos6:

但是网络提供的不总能满足需要。所以有时还得亲自下手从零开始创建自己的Box。制作Vagrant的Box需要遵循一些要求/规范,官网有提供文档和说明:

为啥用vagrant:https://www.oschina.net/translate/get-vagrant-up-and-running-in-no-time

在本地开发爽。用Vagrant快,简单,并可帮助你同时管理多个开发环境。

想象一下,你正在和据说15人的团队开发一个应用程序。这个程序真是狂棒!它使用Laravel的PHP框架,Redis和Memcached,ImageMagick和GD的PHP模块,curl,MySQL和PostgreSQL, 甚至MongoDB。 另外,Laravel明确依赖PHP版本5.3.7或更高版本,以及mcrypt的PHP扩展。

理想情况下,你会希望团队所有的15人在开发这个应用程序时,都是相同的开发环境。 但是不是所有的开发团队,都有系统管理的专家或者培养一个系统管理。获得相同设置的开发环境可能是一个非常艰巨的任务。 最重要的是,有些人使用的是Mac,而其他人则使用Linux或Windows。在它之前,开发人员会纠结在无尽的配置中,用电脑扔墙而筋疲力尽。

其实,步骤不多也不是很复杂,但是总会遇到一些特定环境的问题。下来是我制作的过程(Vagrant1.9+VirutalBox5.1+Centos6.9_i686)。

还有其他的优点:

  • 还有配置化后,就可以可以进行版本管理。
  • 分享。

下载安装系统

不要安装LiveDVD的版本会把桌面也安装了,系统大几个G,其实用不到图形界面。用DVD的安装没有mininal的系统。

系统网络

安装VirutalBox5.1完后,Windows宿主机多了一个 VirtualBox Host-Only Ethernet Adapter 本地网卡,可以先在VirtualBox菜单 [管理-全局设定-网络] 里删除Host-Only Network网卡。

在安装之前需要先了解VirtualBox的网卡的配置,它的选项/含义和VmWare不太一致,需要单独学习了解下:

  • 未指定: 相当于虚拟机没有插上网线的情况,此时与宿主机也连不通。
  • 网络地址转换(NAT):通过NAT转换仅通过HOST主机访问网络,但是访问不到虚拟机(单向的)。需要通过端口转发功能HOST主机才能连接到虚拟机。单机上网最简单的方式。
  • NAT网络
  • 桥接网卡:虚拟机桥接到宿主机的一块网卡,直接与外部交换数据包,像是不经过宿主机一样。虚拟机能够设置一个独立的IP,所有网络功能完全和在网络中的真实机器一样(通过路由器来自动分配IP地址)。
  • 内部网络:只虚拟机互通的网络。可以相互访问,前提是在设置网络时,两台虚拟机设置同一网络名称。
  • 仅主机(Host-Only)网络:内部网络和桥接模式的混合,需要一个虚拟的网卡来配合。此时虚拟机可以和宿主机及宿主机所在的局域网通信,无法与外网通信。看F1帮助文档里面的,感觉和内部网络差不多,由于HOST主机 多了个网卡可以和HOST通信(通过Host Only网卡的IP),但虚拟机需要上网的话还需要再多配置一个桥接网络。
  • 通用驱动

网上的一些资料:

配置

安装系统后默认eth0的网卡是没有启用的。修改网络配置然后重启网络。

如果网卡启动失败,用 ifconfig -a 看看设备是不是eth0。

接下来就是连接系统,然后配置Vagrant了。

为了后面的配置更加顺利,需要先把网络调通。在虚拟机的黑窗口操作是非常不方便的,添加端口转发然后本地用Putty/git-ssh等工具登录系统操作 SSH to Vagrant box in Windows?

接下来按照官网的说明进行配置:

步骤如下:

  1. 增加帐号密码均为 vagrant ,root密码也是 vagrant
  2. 配置sudo
  3. 配置无密钥登录使用密钥进行登录,同时把insecure的 vagrant的公钥 写入authorized_key
  4. 安装tools
  5. 清理yum缓冲,tmp目录下的内容,以及其他的一些临时文件
  6. 删掉、禁用虚拟机多余的设备
  7. 第一个网卡设置为NAT(用于vagrant的端口转发,并且这网卡要boot启动啊!) boxes.html#virtual-machine
  8. 打包,进入到虚拟机存储的目录(可以通过【设置-高级】的备份位置确定),然后执行 vagrant package --base centos6_i386
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# passwd

[root@localhost ~]# useradd vagrant
[root@localhost ~]# passwd vagrant

[root@localhost ~]# echo 'vagrant ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers

[root@localhost ~]# su - vagrant
[vagrant@localhost ~]$ mkdir .ssh && chmod 700 .ssh && cd .ssh
[vagrant@localhost .ssh]$ curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub -o authorized_keys 
[vagrant@localhost .ssh]$ chmod 600 authorized_keys 

这里单独把安装tools执行的命令抽取出来:

1
2
3
4
# wget http://download.virtualbox.org/virtualbox/5.1.26/VBoxGuestAdditions_5.1.26.iso
curl -o VBoxGuestAdditions_5.1.26.iso http://download.virtualbox.org/virtualbox/5.1.26/VBoxGuestAdditions_5.1.26.iso
mkdir /media/VBoxGuestAdditions
mount -o loop,ro VBoxGuestAdditions_5.1.26.iso /media/VBoxGuestAdditions

事情总归不会一帆风顺的,依赖需要进行处理,如下:

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
29
30
31
32
33
34
[root@localhost ~]# sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.26 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Starting the VirtualBox Guest Additions.
Failed to set up service vboxadd, please check the log file
/var/log/VBoxGuestAdditions.log for details.
[root@localhost ~]# cat /var/log/VBoxGuestAdditions.log

vboxadd.sh: failed: Look at /var/log/vboxadd-install.log to find out what went wrong.
vboxadd.sh: failed: Look at /var/log/vboxadd-install.log to find out what went wrong.
vboxadd.sh: failed: modprobe vboxguest failed.
[root@localhost ~]# cat /var/log/vboxadd-install.log
/tmp/vbox.0/Makefile.include.header:112: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=<directory> and run Make again.  Stop.
Creating user for the Guest Additions.
Creating udev rule for the Guest Additions kernel module.

# 处理
[root@localhost ~]# yum install gcc make patch glibc-headers glibc-devel kernel-headers -y 
[root@localhost ~]# yum install kernel-devel # / yum install kernel-devel-2.6.32-696.el6.i686  
[root@localhost ~]# export KERN_DIR=/usr/src/kernels/2.6.32-696.6.3.el6.i686  <- 根据情况改
[root@localhost ~]# sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.26 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Removing installed version 5.1.26 of VirtualBox Guest Additions...
vboxadd.sh: Stopping VirtualBox Additions.
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Starting the VirtualBox Guest Additions.

Could not find the X.Org or XFree86 Window System, skipping.

安装配置(jdk/tomcat/mysql/pgsql/redis/…)好后,打包前清理缓冲:

1
2
3
4
yum clean all
history -c
rm -rf ~/.bash_history
rm -rf /tmp/* /var/log/* /var/cache/*

然后打开windows的命令行,进入到虚拟机磁盘文件目录打包:

1
2
3
4
5
C:\Users\XXXX\VirtualBox VMs\centos6_i386>vagrant package --base centos6_i386
2017/08/24 07:18:04 launcher: detected 32bit Windows installation
==> centos6_i386: Clearing any previously set forwarded ports...
==> centos6_i386: Exporting VM...
==> centos6_i386: Compressing package to: C:/Users/XXXX/VirtualBox VMs/centos6_i386/package.box

搭建开发环境

实际操作命令

重装系统后再绑定

重新安装后,vagrant和virtualbox在C盘用户目录的文件没有保存。再次启动发现vagrant是去重新启动一个新的虚拟机。

虚拟机嘛,总还是台机器,不会和对待docker那样操作。很多的文件、配置等等还是存储在虚拟机里面的。现在vagrant和virtualbox脱钩了。我们要做的就是把他们再绑定起来:

  • 首先启动直接双击box,启动虚拟机。会在用户目录.VirtualBox下面产生/修改VirtualBox.xml,打开文件找到当前虚拟机MachineEntry对应的uuid。
  • 打开原vagrant的目录下 .vagrant\machines\default\virtualbox 的id文件。内容替换为virtualbox的最新的id。
  • 上面的步骤已经把两者关联起来了,但是无密钥登录不行了。需要重新把github上的内容写入到虚拟机用户vagrant的authorzied_key里面。

至此,就可以用 vagrant up 启动虚拟机了。还原绑定成功。

其他

vagrant + virtualbox + nginx cache

vagrant + java deveploe env

git

–END

Comments