Total Pageviews

Showing posts with label vagrant. Show all posts
Showing posts with label vagrant. Show all posts

Saturday, 30 May 2026

在Windows下借助Vagrant安装Linux终端

 

由于国内网络问题和Windows下安装ruby和bundler的各种证书问题,安装jekyll折腾了好久。无奈,经朋友介绍,通过使用VirtualBox+Vagrant+PuTTY终于可以安装好jekyll并成功搭建示范站点了。本文作为安装记录方便以后有需要的时候再次安装,如能对其他读者有所帮助,不胜荣幸。

“食材”准备

“食材”选择

  1. VirtualBox选“VirtualBox 5.0.16 for Windows hosts”下载,我装的时候5.0.16是最新的,并且一定要下载“VirtualBox 5.0.16 Oracle VM VirtualBox Extension Pack”。都是双击安装,win下都是无脑双击了;
  2. Vagrant选择Windows通用版,下载安装就好了;
  3. PuTTY和PuTTYGen(后面生成私钥,避免每次登陆都要输密码用的,实际上我用的每次都不成功,所以觉得可以接收每次都手动输入密码的,可以忽略这个),我是直接下载的putty.zip,里面包含了PuTTY和PuTTYGen。

**注意:**考虑到国内网络情况,下载box的时候可能会有问题,建议使用迅雷之类的下载工具手动下载box压缩镜像。这里是参考问题box清单,我这里选择安装的是ubuntu/trusty64系统,版本号是清单中对应的v20160323.1.0,可用的下载链接地址就是:
https://atlas.hashicorp.com/ubuntu/boxes/trusty64/versions/20160323.1.0/providers/virtualbox.box

“烹调”方式

VirtualBox

  1. 必须先安装好了VirtualBox,才能保证成功装载vagrant虚拟系统;
  2. 无脑安装VirtualBox和扩展包。

Vagrant

  1. 安装;

  2. 开启cmd或者powershell,最好是以管理员权限打开,防止后面vagrant up的时候出状况;

  3. 由于不确定init过程中是否会有其他文件释放出来,最好先转到vagrant安装目录下执行(cd ./vagrant),输入以下命令:

    vagrant init ubuntu/trusty64
    vagrant box add --name BOX virtualbox.box # virtualbox.box是手动下载好的压缩镜像,我是放在vagrant目录下的,如果放在其他地方还要补充完整路径,网络好的情况下可以skip这条
    vagrant up # 需要等待挺久的,可以放着干别的事了
    
  4. vagrant添加box成功后,可以通过vagrant box list查看已经装载的虚拟系统;vagrant装载成功后,可以通过vagrant status查看状态,“running virtualbox”表示正在运行服务,“poweroff”表示已经终止;

  5. 使用vagrant ssh-config来查看已经开启的ssh的相关信息,注意一定要是使用vagrant up以后,才会开启服务。记录下相关信息,或者保持这个页面,后面的PuTTY设置需要用。

Vagrant常用命令

vagrant up #启动虚拟机
vagrant halt #关闭虚拟机
vagrant status #查看虚拟机运行状态

更多命令可查看Vagrant文档

PuTTY和PuTTYGen

PuTTY只是一个开启虚拟终端的平台,vagrant可能会推荐使用cygwin/mingw/git等工具,可自己选择,不过我不知道怎么设置主机名和端口。

  1. 打开PuTTY,Session->Host Name,输入127.0.0.1,Port输入2222。这两个都是vagrant自动分配的,信息来自vagrant ssh-config打印的结果;
  2. 在Session->Saved Sessions下输入一个自定义的名称如“VM-trusty64”,然后Save。这一步的作用是以后每次开启PuTTY时只需要选择“VM-trusty64”,然后Load,就可以直接Open了。其他都可以不设置;
  3. 如果你需要设置自动登录,也就是面输入密码,请到页面最下面查看第一条参考链接。因为我没有尝试成功,在这里就不描述了;
  4. Open以后,就是跳转出终端,首先就是输入用户名和密码,两者都是vagrant,密码不会显示出来,输入完后enter即可。

打开终端后,即可使用ubuntu下的linux命令了。如果要使用其他虚拟系统,可以对应box清单,下载对应版本虚拟系统的压缩镜像。

最后,感谢@X!aoTian给与的耐心帮助。

后记

  1. 因为虚拟机会占用较大空间建议修改安装路径以及配置BOX的存放路径,详情可参考我的另一篇文章

  2. 其实VirtualBox是可以单独载入安装镜像,安装完整的系统

    新建虚拟电脑(Ctrl+N),一直下一步;选择新建的虚拟电脑,设置(Ctrl+S),存储->存储树->控制器->添加虚拟光驱(那个有个+号的光碟样图标),从你的电脑里选择一个系统安装盘镜像(ISO)文件添加。最后,最好配置一下,存储空间、内存、显存等等,否则可能会很卡的。

    要使用时,只需要打开VirtualBox,选择一个虚拟机打开就可以了。

参考链接

from  https://github.com/uolcano/blog/issues/2

Sunday, 17 December 2023

扩展vagrant磁盘映像

 

事情的起因是安装llvm+clang的时候一直不成功。提示说没有磁盘空间了。因为制作vagrant的box的时候,我选择的是自动扩展虚拟磁盘,所以也没有往磁盘真的没有了这个问题上想。还以为编译的时候有些operation没有选对,捣鼓了一阵子。后来执行了一下df才发现vagrant中的虚拟磁盘竟然真的不够用了。这至少告诉我们2个问题:
1. vagrant不能自动扩展磁盘;
2. 使用vagrant制作的vbox的映像不能继承原来vbox中的设置;
那怎么样才能让vagrant中的磁盘映像扩大呢?

我的vagrant是架在mac上的,因为穷,所以虚拟机选择了vbox。根据vagrant和vbox的关系,vagrant实际上是接管了在vbox中启动的虚拟机。所以重点还是要扩展在vbox中这个虚拟机映像的磁盘大小。

起先,还是想到了老办法:原来在用虚拟机的时候记得可以直接在虚拟机中就可以调整磁盘大小的,但是这招在这里不可行,没有找到任何可以设置或者扩展磁盘大小的设置。然后找了一下vbox的文档,发现VBoxManage命令可以更改磁盘印象的大小。

  1. 先要找到vagrant接管的磁盘映像放在了哪里?执行命令:VBoxManage list hdds,如下:
    box-list-hd

  2. 找到了磁盘映像后就可以更改其大小了。这里有两种方法,一种使用磁盘路径作为参数,另外一种是使用如图所示的第一行UUID作为参数。我们使用UUID(因为短),执行命令:
    VBoxManage modifyhd "5f25beda-db03-4801-9522-a56403878304" --resize 15360
    将磁盘映像调整到15G,结果报错,如下图:
    box-modify-error

  3. 报错提示“格式不支持执行的操作”。但是找了半天,都说vmdk格式也可以动态扩展大小,但是不知道为什么VBoxManage不支持(HEI:难道是因为vmdk是vmware标准格式?)。但是VBoxManage命令支持vdi格式(HEI:vdi是vbox私有的格式。)。那就把vmdk格式转换成vdi吧!还是使用VBoxManage命令:
    VBoxManage clonehd /Users/xuhaifeng/VirtualBox\ VMs/vagrant_default_1493825204615_42659/box-disk1.vmdk /Users/xuhaifeng/VirtualBox\ VMs/vagrant_default_1493825204615_42659/box-disk1.vdi --format VDI
    转换成功,结果如图所示:
    box-disk-cast

  4. 再扩展vdi的大小,还是使用VBoxManage命令,但因为vdi没有被挂载在系统中,所以参数使用路径,如下:
    vbox-modify-disk.png
    扩展成功。

  5. 将原来vagrant接管的虚拟机的vmdk磁盘映像换成刚刚生成的这个vdi的磁盘映像。打开vbox,点击SATA端口的右边将其换掉,如图所示:
    box-change-disk

  6. 启动vagrant,发现报了很多“磁盘空间不够”的错误。如下图:
    vagrant-up-error-disksize

登陆系统,发现扩展的空间确实没有被加上去,如下图:
login-vagrant-df

但是使用fdisk查看一下,发现磁盘的大小确实已经加上了,但是没法使用。如图所示:
fdisk-list-dev

  1. 把新扩展的磁盘大小给加上去。还是使用fdisk命令:

    fdisk /dev/sda
    沿着命令,一路根据提示,输入:
    n
    p {primary partition}
    3 {partition number}
    [提示修改大小,默认直接回车]
    t
    3 {partition number}
    8e {Linux LVM partition}
    w

    如图所示:
    fdisk-operator

  2. 再重启vagrant,发现启动的时候还是很多“磁盘空间不足”的报错信息,先忽略它。登入系统后,执行命令:
    fdisk -l /dev/sda
    发现我们加上去的那块磁盘已经又块设备的标识了。如下图:
    fdisk-dev

  3. 调整卷的大小,使用命令:vgdisplay先看一下卷的信息,记住 VG Name这个选项的值,然后我们依次使用命令

    1. pvcreate /dev/sda3
    2. vgextend vg_xvhfeng /dev/sda3
    3. lvextend /dev/vg_xvhfeng/lv_root /dev/sda3
    4. resize2fs /dev/vg_xvhfeng/lv_root
      将其合并到原来的挂载点中。如下图所示:
      mount-disk

10.最后,再重启机器,登录后执行df命令,发现磁盘的大小终于被扩展大了。如下图:
last-df

大功告成。

from http://web.archive.org/web/20231217151054/http://www.94geek.com/posts/2018/vagrant-export-disksize/vagrant-export-disksize-20180310.html

Saturday, 20 May 2023

管理本地服务的利器Vagrant Manager



Vagrant Manager是一款方便管理本地服务的开源工具,特色是可以自动检测虚拟机服务,并把各种虚拟机服务以简单明了的菜单方式展示出来,用户可以方便的选择启动,停止,挂起等操作。Vagrant Manager有Windows和Mac OS的不同平台版本。

    Mac 版本下载: https://github.com/lanayotech/vagrant-manager
    Win 版本下载: https://github.com/lanayotech/vagrant-manager-windows


Friday, 28 January 2022

在 Mac下,安装/使用 Vagrant

 Vagrant是一款用来构建虚拟开发环境的工具,它其实算是一个跨平台的虚拟机管理工具。

安装

安装Vagrant

Vagrant的旧版本是可以通过gem来安装的,但是由于依赖实在太多,官方放弃了这种安装方式,建议下载官方安装包来安装。

下载地址在http://www.vagrantup.com/downloads。下载好pkg包后,点击安装即可。

安装Virtualbox

Vagrant依赖现有的虚拟机软件来管理虚拟机,如Virtualbox, Vmware Fusion, Parallel Desktop等,其中最方便的是VirtualBox,所以我选择了Virtualbox。

下载地址在https://www.virtualbox.org/wiki/Downloads。同样下载好后直接安装。

使用

下载启动Box

在Vagrant中,box是一种打包好的镜像,通过这个镜像,可以生成相应的虚拟机。box可以通过官方网站下载,也可以自己制作,在团队内分享。

官方的Box可以在创建时自动下载。例如以下步骤

cd ~/Documents/Vagrant/Ubuntu  # 进入一个vagrant虚拟机目录,一个目录管理一个虚拟机
vagrant init hashicorp/precise32 # 创建一个ubuntu的虚拟机
vagrant up # 启动这个虚拟机

通过这个步骤,vagrant会去box列表中找hashicorp/precise32这个镜像,如果没有就去官方下载。Box被保存在~/.vagrant下。通过命令

vagrant box list 

可以查看已经下载的box。如果想以这个box再建立一个虚拟机,只要再创建一个目录,例如~/Documents/Vagrant/Ubuntu32,然后执行

vagrant init hashicorp/precise32

即可。

操作虚拟机

操作虚拟机时,必须进入刚刚建立的目录中去,这个目录中必须含有init命令建立的Vagrantfile文件。常用命令有

$ vagrant init  # 初始化
$ vagrant up  # 启动虚拟机
$ vagrant halt  # 关闭虚拟机
$ vagrant reload  # 重启虚拟机
$ vagrant ssh  # SSH 至虚拟机
$ vagrant status  # 查看虚拟机运行状态
$ vagrant destroy  # 销毁当前虚拟机

共享文件夹

通过Vagrant建立的虚拟机和Mac共享文件非常容易,虚拟机中/vagrant目录会映射到我们本地虚拟机目录中。例如

cd ~/Documents/Vagrant/Ubuntu
vagrant up
vagrant ssh
cd /vagrant
ls

这个时候,我们会看到,这里显示的文件和~/Documents/Vagrant/Ubuntu下是一样的。

共享Box

如果只有上述功能的话,那么Vagrant的作用就不是那么杀手级了。通过命令

vagrant package

可以将一个虚拟机打包成Box,供别人使用。别人只要用打包的box来创建一个虚拟机即可,例如

vagrant box add myubuntu ~/Documents/Vagrant/Ubunutu/ubunut.box

参考

  1. Vagrant Docs
  2. 使用 Vagrant 打造跨平台开发环境

Saturday, 2 May 2020

Transparent proxy in Vagrant

Setup a transparent proxy with squid3 and vagrant.

When you play with Vagrant boxes or Dockers, a lot of files will be downloaded from internet again and again. For example, every time you run apt-get update, it will download a set of files. The setup process will be much faster if these files can be cached in local network. In this case, a transparent proxy can be very helpful.

How it works

Two Vagrant boxes will be created. Squid 3 is install in one box called squid, and another box called client, is an example to demonstrate how to use the proxy.
The "squid" box has two NICs. The default NIC is used to access internet, while a private_network with IP address 172.28.128.200 will be the gateway of clients.
After these boxes are up, you need to login the client box, change the default gateway with command change-gateway, then most HTTP request will be cached.
Route table can be verified with this command, netstat -r:
root@client:~# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         localhost       0.0.0.0         UG        0 0          0 eth1
10.0.2.0        *               255.255.255.0   U         0 0          0 eth0
172.28.128.0    *               255.255.255.0   U         0 0          0 eth1
To check if the proxy is working, initiate some HTTP requests from "client" box:
curl -v http://bing.com
curl -v http://bing.com
There will be following content in /var/log/squid3/access.log on "squid" box:
vagrant@squid:~$ sudo tail -f /var/log/squid3/access.log
1446885198.469    784 172.28.128.202 TCP_MISS/301 395 GET http://bing.com/ - HIER_DIRECT/204.79.197.200 -
1446885203.531      1 172.28.128.202 TCP_MEM_HIT/301 401 GET http://bing.com/ - HIER_NONE/- -
Enjoy it!


Monday, 5 November 2018

在Mac上,使用Vagrant打造本地开发环境

1. vagrant介绍

1.1 vagrant能做什么

做Web开发(java/php/python/ruby…)少不了要在本地搭建好开发环境,虽然说目前各种脚本/语言都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的兼容性(如配置文件、编译的模块)并不是那么好,麻烦的问题是实际部署的环境通常是Linux,常常还要面临着开发和部署环境不一致,上线前还要大量的调试。而如果让每个开发人员都自己去搭建本地环境,安装虚拟机、下载ISO镜像、选择规格安装创建vm、安装OS、配置,会耗费非常多的时间,如果是团队开发应该要尽量保持每个人的运行环境一致。此时vagrant正式你所需要的。不适用正式环境部署。
vagrant实际上一套虚拟机管理工具,基于Ruby开发,底层支持VirtualBox、VMware甚至AWS、docker等作为虚拟化系统。我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,“代码在我机子上运行没有问题”这种说辞将成为历史。
通过上面的介绍如果你还在困惑有virtualbox或vmware为什么还要加入vagrant,纠结于要不要使用,可以参考这个问答 使用vagrant的意义在哪,另外docker作为后起之秀也可以做vagrant能完成的事情,stackoverflow有关于两位作者讨论各自应用场景的精彩”互掐”,传送门→ (中文)。

1.2 几个概念

  • Provider:供应商,在这里指Vagrant调用的虚拟化工具。Vagrant本身并没有能力创建虚拟机,它是调用一些虚拟化工具来创建,如VirtualBox、VMWare、Xen、Docker,甚至AWS,这些虚拟化工具只要安装好了,vagrant会自动封装在底层通过统一的命令调用。也就是说使用vagrant时你电脑上还需要安装对应的Provider,默认是免费开源的virtualbox。
  • Box:可被Vagrant直接使用的虚拟机镜像文件,大小根据内容的不同从200M-2G不等。针对不同的Provider,Box文件的格式是不一样的,从 vagrantcloud.com 你可以找到社区维护的box。
  • Vagrantfile:Vagrant根据Vagrantfile中的配置来创建虚拟机,是Vagrant的核心。在Vagrantfile文件中你需要指明使用哪个Box(可以下载好的或自己制作,或指定在线的URL地址),虚拟机使用的内存大小和CPU,需要预安装哪些软件,虚拟机的网络配置,与host的共享目录等。
  • Provisioner:是Vagrant的插件的一种。大部分现成的box并不是你正好想要的,通过使用你熟悉的provisioner,比如Puppet,可以在你使用vagrant up启动虚拟机时自动的安装软件、修改配置等初始化操作。当然你也可以在最先启动虚拟机后,使用vagrant ssh进去然后手动安装软件,但毕竟不是所有人都是系统管理员,写好Vagrantfile后无需人工干预马上就可以使用vm。目前支持并实现的provisioning有Puppet、Salt、Ansible、Chef这些知名的自动化运维工具,当然需要一定的使用经验;也可以使用shell provisioner,故名思议这个插件就是通过执行shell命令完成统一的作用。
  • Guest Additions:这个是常在下载 base box 介绍里有的,一般用来实现host到vm的端口转发、目录共享,在开发环境上都建议装上以便测试。

2. 安装vagrant

选择适合你的平台(Windows、Mac、Linux),下载对应格式的安装包。如Mac下 vagrant_1.7.1.dmg、VirtualBox-4.3.20-96997-OSX.dmg 。

3. 使用vagrant打造一个本地开发环境

本文将会演示从 nrel CentOS6.5 开始,安装必要的开发包、python、插件、Puppet,然后打包成一个box分发给团队的全过程。你也可以在别人box的基础上进一步通过Vagrantfile定制自己的环境。

3.1 初始化

3.1.1 vagrant box add {box-name} {box-url}

1
2
3
4
5
6
7
8
9
10
11
$ vagrant box add ct65_00 Downloads/centos65.box 
==> box: Adding box 'ct65_00' (v0) for provider: 
    box: Downloading: file:///Users/sean/Downloads/centos65.box
==> box: Successfully added box 'ct65_00' (v0) for 'virtualbox'!

$ ll ~/.vagrant.d/boxes/ct65_00
$ vagrant box list

# vagrant box list
ct65_00   (virtualbox, 0)
centos64-i386  (virtualbox, 0)
这一条命令就是根据给出的box(镜像)文件地址,解压一份到用户目录~/.vagrant.d/boxes/{box-name}/0/virtualbox/下,所以你尽量应该以同一用户来管理进行vagrant所有操作。
F**K GFW
在GFW保护之下,这简单获取box文件反而一开始就难到我们了。官方提供的在线安装在墙外是极为方便的,vagrant box add minimal/centos6便自动从vagrantcloud.com(现更名为https://atlas.hashicorp.com/search/boxes)下载,直接进入第二步。
还有一种方法是,先vagrant init minimal/centos6,然后直接启动vagrant up --provider virtualbox。当然这些都与下载boxes到本地效果是一样的,下载方法就是在vagrantcloud.com上点开你所需要的box版本,然后再URL里加入/providers/virtualbox.box便得到文件地址,如 https://atlas.hashicorp.com/hashicorp/boxes/precise64 对应的文件为 https://atlas.hashicorp.com/hashicorp/boxes/precise64/providers/virtualbox.box 。
在墙内直接在线安装启动box,会报错:
1
2
3
4
5
6
7
8
The box 'ubuntu/trusty64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/ubuntu/trusty64"]
Error:
一个办法是ubuntu来 http://uec-images.ubuntu.com/vagrant/ 下载,centos来 http://nrel.github.io/vagrant-boxes/ 下载。我也从墙外下了几个典型的box放到了自己的百度云上共享了:http://pan.baidu.com/s/1sjHQBa1 。
2015-04-01更新:无意间发现现在不用梯子也可以访问了,Happy April Fool’s Day!

3.1.2 vagrant init {box-name}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ mkdir ~/vagrant && cd ~/vagrant  //这个目录的目的就是统一管理你的Vagrantfile
$ vagrant init ct65_00
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vi Vagrantfile
...
Vagrant.configure(2) do |config|
  config.vm.box = "ct65_00"
  onfig.vm.network "forwarded_port", guest: 80, host: 8080
#  config.vm.synced_folder "../data", "/vagrant_data"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "384"
    vb.cpus = 1
  end
  config.vm.hostname = "vg-ct65_00.tp-link.net"
...
init只是在当前目录生成一个Vagrantfile文件和.vagrant/目录,可以对它进行修改,比如定义 vm guest machine 的hostname、memory、cpu等,具体有关语法介绍见后文。
用户后面up虚拟机,这个 box-name 与上面add的相同,如果是 base 则可以省略。

3.2 启动虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ct65_00'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: v-box_default_1427284884787_97348
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    ...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /root/vagrant/v-box/ct65_00
up过程是默认会根据当前目录下的Vagrantfile来启动vm,如果当前目录没有Vagrantfile,则去上层目录寻找,依次类推。第一次vagrant up ct65_00时会从~/.vagrant.d/boxes中导入相应的box文件到~/VirtualBox VMs/,可以通过vboxmanage showvminfo {VM-ID}看到该虚拟机的配置(Mac上为VBoxManage)。如果你想让虚拟机存储在指定位置,如我的Mac SSD硬盘空间贵,可以运行VirtualBox,手动设置存储/storage的路径。
默认 localhost:2222 转发到 guest:22 以供ssh连接;用户名/密码:vagrant/vagrant;默认共享目录就是host上Vagrantfile所在目录;如果电脑配置比较低导致启动时间比较长,或者VirtualBox启动出错,可能会提示上面的 Connection timeout 。
另外提示一下,某次我在Linux上测试,由于Linux host本身也是vSphere虚拟机,通过vagrant启动virtualbox另一个虚拟机(即嵌套),一直Retrying,后来根据上面 stackoverflow 打开了VBox GUI,发现是CPU架构的问题,一直堵塞,所以就不建议虚拟机上再装虚拟机了:
1
VT-x/AMD-V hardware acceleration is not available on your system. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.

3.2 连接虚拟机,初始化环境

vagrant ssh

1
2
3
$ vagrant ssh
Last login: Tue Mar 31 02:15:38 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
一般建立box时约定的用户名/密码:vagrant/vagrant,root密码也是 vagrant,默认的网络连接方式是Host-Only。

定制你的环境

如安装jdk,创建用户,解压tomcat,修改server.xml,添加yum源等。这里一步到位,唯一要说明的是tomcat conf/server.xml 的
<Context path="" docBase="/vagrant_data" reloadable="true" >...应用目录设置为共享目录。

3.3 打包成box

3.3.1 安装必要软件

打包是为了分发出去,做扩展用
1
# yum install -y lrzsz telnet vim puppet puppetmaster
如果你是从0开始建立一个box,当然还需要创建vagrant用户以及public key,具体可以参考如何制作一个vagrant的base box

3.3.2 安装Virtualbox Guest Additions

每个人电脑上安装的Virtualbox版本很可能不一样,vagrant up可能会有提示版本不兼容(同一大版本号还好,可省略这一步),导致host到guest共享目录模块失败,最终无法启动虚拟机。
安装方法可以有 vagrant-vbguest(注意这是vagrant插件,不是virtualbox插件),使用超级详细,只需执行vagrant plugin install vagrant-vbguest,默认从本地找 VBoxGuestAdditions.iso (各平台路径一般都可以找到),如果没找到则去http://download.virtualbox.org/virtualbox/%{version}/VBoxGuestAdditions_%{version}.iso 下载,直接启动vm便可安装或更新virtualbox guest additions ,甚至可以通过vagrant vbguest命令给正在运行的vm安装,缺点是 plugin install 得连网。下面是手动在vm内部安装:
一般最小化的box不带有CDROM,需要通过VirtualBox图形化界面添加一个DVD/CD存储设备,然后在启动VM后 Devices -> Insert Guest Additions CD 。(相信你可以可以找到办法直接挂载 .iso 文件到vm里面,免去添加多余设备)
for linux : /usr/share/virtualbox/VBoxGuestAdditions.iso
for Mac : /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
for Windows : %PROGRAMFILES%/Oracle/VirtualBox/VBoxGuestAdditions.iso
1
2
3
$ sudo yum install linux-headers-$(uname -r) build-essential dkms 
$ sudo mount /dev/cdrom /media/cdrom
$ sudo sh /media/cdrom/VBoxLinuxAdditions.run --nox11

3.3.3 vagrant package

打包导出:
1
2
3
4
5
 vagrant package --output sean-vg-ct65_ts.box
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /Users/sean/vagrant/sean-vg-ct65_ts.box
当前目录下若存在同名package.box则会export失败。打包的来源并不是.vagrant.d而是VirtualBox虚拟机本身,可以通过--base vm-name来指定所导出的虚拟机名称,--vagrantfile file-pathname可以将Vagrantfile直接封进box中。以后就可以把这个 .box 文件分发给开发人员使用了。

4. 其他

4.1 命令

vagrant suspend将虚拟机置于休眠状态。这时候主机会保存虚拟机的当前状态。再用vagrant up启动虚拟机时能够返回之前工作的状态。这种方式优点是休眠和启动速度都很快,只有几秒钟。缺点是需要额外的磁盘空间来存储当前状态。
vagrant halt则是关机。如果想再次启动还是使用vagrant up命令,不过需要多花些时间。
vagrant destroy则会将虚拟机从磁盘中删除。如果想重新创建还是使用vagrant up命令。
vagrant reload从Vagrantfile重新启动虚拟机。
vagrant global-status输出所有虚拟机当前运行状态,关机、已启动等。
另外1.2以上版本的Vagrant还引用了插件机制。可以通过vagrant plugin来添加各种各样的plugin,这给Vagrant的应用带来了更大的灵活性和针对性。比如可以添加vagrant-windows的插件来增加对windows系统的支持,通过添加vagrant-aws插件来实现给AWS创建虚拟机的功能。你也可以编写自己的插件。由于Vagrant是ruby写的一个gem,其插件的编写也是使用的Ruby语言。
关于 Vagrantfile说明以及网络、多机器管理的配置,见 Varantfile说明

4.2 问题集

  • 选用配置略高一点的电脑做host,否则启动会相当慢而且会提示Warning: Connection timeout. Retrying...,如果在300s内没有boot up,你可能需要启用GUI界面可以帮我们诊断一些启动失败的问题,vb.gui = true。坚决不要在虚拟机里玩vagrant!
  • 不要轻易在VirtualBox图形界面下强行关闭虚拟机,可能会出现意想不到的错误,如 The guest machine entered an invalid state while waiting for it
    to boot. Valid states are ‘starting, running’. The machine is in the
    ‘poweroff’ state … 针对这个问题的解决办法,issue 2175 没能搞定,直接destroy重来。
  • 我在ubuntu trustry 64-bit 安装virtualbox时,提示依赖没装(libgl1-mesa-glx libqt4-network libqt4-opengl libqtcore4 libqtgui4 libxcursor1 libxinerama1 libxmu6 libxt6),
    使用apt-get install libqt4-opengl来安装上面的依赖,如果报错The following packages have unmet dependencies...,执行apt-get -f install 解决。
  • 安装 virtualbox guest additions 失败
    在 3.3.2节安装Virtualbox Guest Additions时,运行./media/cdrom/VBoxLinuxAdditions.run后提示:
1
2
3
4
5
6
The headers for the current running kernel were not found. If the following module 
compilation fails then this could be the reason. The missing package can be probably
 installed with yum install kernel-devel-2.6.32-431.el6.x86_64

Building the main Guest Additions module                   [FAILED]
...
关机后启动虚拟机,相应的会提示:
1
2
3
4
5
6
7
8
9
10
11
Failed to mount folders in Linux guest. This is usually because the "vboxsf" file 
system is not available. Please verify that the guest additions are properly 
installed in the guest and can work properly. The command attempted was:


mount -t vboxsf -o uid=id -u vagrant,gid=getent group vagrant | cut -d: -f3 vagrant /vagrant
mount -t vboxsf -o uid=id -u vagrant,gid=id -g vagrant vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
原因就是旧版本卸载成功但新版本guest additions却因为yum install kernel-devel找不到软件包(No package available)失败。这种情况很少见,kernel-devel 一般都可以装上去解决。如果像我这样提示死活没这个软件包的,换个box吧!
  • 硬盘扩容
    进入到虚拟机后,通过df -h你可能看到磁盘空间不足,需要扩容(不允许缩小空间),就可以通过以下方法完成。
    1. 手动方式,与是否使用vagrant无关
      halt关闭虚拟机虚拟机后,使用 VBoxManage modifyhd box-disk1.vdi --resize 10240 即完成修改。但是如果虚拟机磁盘格式创建时使用的是vmdk,则不支持直接vmdk格式修改,需要通过VBoxManage clonehd box_disk1.vmdk box_disk2.vdi --format VDI转换成vdi格式,然后在图形化VirtualBox中选择这个新的磁盘。另外提醒一句,这里的扩容是修改动态分配的磁盘的虚拟大小而不是实际大小,所以假如resize后的值比预分配的磁盘要小的话,会提示 Progress state: VBOX_E_NOT_SUPPORTED ..VBoxManage: error: Resize hard disk operation for this format is not implemented yet!
      相关参考:Resizing disk space on vagrant box
      VirtualBox VBOX_E_NOT_SUPPORTED Drive Resize ErrorResize a Hard Disk for a Virtual Machine 。
    2. 通过Vagrantfile指令修改
      1
      2
      3
      config.vm.provider "virtualbox" do |vb|
        vb.customize 'pre-boot', ['modifyhd', 'e91678c3-b49b-489b-b280-4e138533252d', '--resize', '10240']
      end
上面那串数字字母,是虚拟磁盘的UUID,可以先通过ps -ef|grep Virtual(Mac, virtualbox in Linux )查到虚拟机UUID,再通过VBoxManage showvminfo {VM UUID}|grep vdi看到这个 disk UUID。参考 Add some way to increase disk space from Vagrantfile
扩容完成后把Vagrantfile中对应的部分去掉,以免每次启动都进行这步操作。