简介

Create and configure lightweight, reproducible, and portable development environments.

来自官网首页描述

Vagrant 是一个虚拟机管理工具。可以实现快速的虚拟机镜像分发和使用。适用于快速分发、同步开发环境。

图灵社区 : 阅读 : 使用Vagrant(零)——为什么要使用Vagrant

版本

使用的版本是日期 2017-01-01 各官方网站上的正式版本:

  • macOS 10.12.2
  • Vagrant 1.9.1
  • VirtualBox 5.1.12
  • CentOS 7.3 1611

安装

Vagrant

Vagrant 本体需要首先安装,访问 Download - Vagrant by HashiCorp 根据平台下载对应的安装包安装即可。

VirtualBox

VirtualBox 是免费、跨平台且 Vagrant 内置支持的虚拟机软件,所以建议使用。

访问 Downloads – Oracle VM VirtualBox 根据平台下载对应版本。

注意:因为 Vagrant 与 VirtualBox 可能会有兼容性问题,建议使用 Vagrant 推荐的可靠工作的版本 VirtualBox 5.0.10。

使用以下命令安装:

1
2
3
4
mkdir vagrant
cd vagrant
vagrant init
vagrant provider --install

VirtualBox 5.0.10 创建的 CentOS 7.3 虚拟机安装 VirtualBox Guest Additions 后无法使用 共享文件夹 功能,是因为内核升级导致。 如果使用 CentOS 7.3 等有新版本 Linux 内核的,则需要安装新版本的 VirtualBox,如 5.1.12 版本 Downloads – Oracle VM VirtualBox

创建镜像 Box

网上的很多教程都是介绍如何从官网下载镜像使用,但实际上存在一些问题:

  1. 下载速度太慢:由于官方镜像库网站在美国,连接下载速度较慢,而镜像文件又太大,即便是精简版本也是 300M+。
  2. 完整性问题:我们并不知道下载的镜像里有没有包含需要的包,如果没有下载后还需要再次安装。
  3. 安全性问题:因为无法验证发布者的身份,无法知道镜像中有没有“加料”。
  4. 没有需要的镜像:有可能我们使用的是特定版本的系统,有可能使用的系统太过小众,总之,镜像市场中没有。

所以大多数时候我们需要从零开始自定义镜像,因为可以自行选择原始镜像的版本,可以完全控制镜像内容。

下载操作系统镜像

在本文中演示使用的是 CentOS,你可以根据自己的需要选用其他系统。

CentOS 7.3 1611 Download CentOS

创建虚拟机

按照 VirtualBox 正常流程创建虚拟机即可,这里只说需要设置的关键参数:

  1. 虚拟硬盘容量设置为最大的 2TB、存储方式为动态分配,占用空间较小,且方便未来升级;虚拟硬盘文件类型为 VDI 以保证最佳的兼容性。
  2. 关闭用不到的设备,如声卡、USB。
  3. 开启网卡2,同时设置为桥接模式。这样网卡1用于本机 NAT 端口映射直接连接,网卡2用于获得局域网的 DHCP 地址,方便其他人访问。

其他参数如内存大小、CPU 数量可以在 Vagrant 中设置。

安装操作系统

挂载下载的操作系统镜像,开启虚拟机安装。

安装步骤:

  1. 启动后选择安装,语言默认。
  2. SYSTEM > INSTALLATION DESTINATION > DONE
  3. SYSTEM > NETWORK & HOST NAME > Ethernet > 启用 此处需要两个网卡都启用 > DONE
  4. Begin Installation
  5. Root Password > 密码:vagrant
  6. User Creation > 用户:vagrant 密码:vagrant

配置

登录到虚拟机上配置

  1. 选择虚拟机的网络配置,在默认的 NAT 网卡1上添加端口映射 2222 => 22
  2. 在宿主机中使用 SSH 登录到虚拟机里: ssh -p 2222 root@127.0.0.1 密码:vagrant

时间

设置时区:timedatectl set-timezone Asia/Shanghai

How To Change Timezone on a CentOS 6 and 7

sudo 时无需密码

命令行运行 visudo,往文件的最末尾加上

1
vagrant ALL=(ALL) NOPASSWD: ALL

或者也可以编辑 /etc/sudoers

1
echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

安装 VirtualBox Guest Additions

共享文件夹 功能依赖此软件。

在 VirtualBox 菜单中选择 Devices > Insert VirtualBox Guest Additions

然后在虚拟机中执行:

1
2
3
4
yum install -y gcc bzip2
yum install -y kernel-devel-3.10.0-514.el7.x86_64
mount /dev/cdrom /mnt
/mnt/VBoxLinuxAdditions.run

Install Virtual Box Guest Additions CentOS | Zwiegnet Blog

注意:如果使用 yum install kernel-devel 安装内核开发包的话,执行 /mnt/VBoxLinuxAdditions.run 会提示

1
2
3
4
5
Building the VirtualBox Guest Additions kernel modules
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-3.10.0-514.el7.x86_64

是因为安装的版本不同: - yum install kernel-devel 安装的是 3.10.0-514.2.2.el7 版本。 - yum install -y kernel-devel-3.10.0-514.el7.x86_64 安装的是 3.10.0-514.el7 版本。

提示:dotless-de/vagrant-vbguest: A Vagrant plugin to keep your VirtualBox Guest Additions up to date 这个 Vagrant 插件用于保证 VirtualBox Guest Additions 一直是最新的。该插件会在虚拟机内核升级之后重新安装 VirtualBox Guest Additions。

开启 SSH 服务

配置 Vagrant 默认 SSH 公钥

1
2
3
4
5
6
7
8
mkdir -p /home/vagrant/.ssh
chmod 0700 /home/vagrant/.ssh

yum install -y wget
wget --no-check-certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys

chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant:vagrant /home/vagrant/.ssh

注意:使用 curl -o 命令无法下载 Vagrant 公钥,无错误提示,但文件未下载成功,可能是 curl 对 HTTPS 支持不太好。

安装 SSH Server

CentOS 7.3 已自带此包,可以跳过安装:

1
yum install -y openssh-server

使用 vi /etc/ssh/sshd_config 修改配置文件:

  • #PubkeyAuthentication yes > PubkeyAuthentication yes
  • #UseDNS yes > UseDNS no

或者使用命令替换

1
2
sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config

重启 SSH 服务:

1
systemctl restart sshd

安装软件

普通的软件可以直接通过 yum 安装,如 vimtmux 等等:

1
yum install -y vim tmux

Git 编译安装可以参考:How To Install Git on CentOS 7 | DigitalOcean

打包 Box

到宿主机下使用以下命令打包:

1
vagrant package --base <VirtualMatchineName> --output </path/to/PackageName.box>

VirtualMatchineName 是创建虚拟机时指定的名字,PackageName.box 是最终打出的包的名字。

使用

添加虚拟机模板镜像

1
vagrant box add <boxname> /path/to/box

初始化

1
2
3
mkdir -p /path/to/your/vagrant
cd /path/to/your/vagrant
vagrant init <boxname>

配置

此时可以根据需要修改 Vagrantfile 文件来修改配置。可以修改的内容包括显示在 VirtualBox 中的名字、CPU 数量、内存大小等等。

Configuration - VirtualBox Provider - Vagrant by HashiCorp

Vagrantfile 示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Vagrant.configure(2) do |config|
  config.vm.box = "/path/to/package.box"
  config.vm.hostname = "centos73"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "public_network"
  config.vm.synced_folder "../share", "/home/vagrant/share"

  config.vm.provider "virtualbox" do |v|
    v.name = "centos73"
    v.memory = 2048
    v.cpus = 1
  end

  config.vm.provision "shell", inline: <<-SHELL
    yum install -y tmux
  SHELL
end

启动

使用以下命令启动并连接:

1
2
vagrant up
vagrant ssh

重新打包

可以在 Vagrant 启动的虚拟机中安装软件、更新软件版本等等。 如果要分发给其他人,可以再次打包,此时不需要镜像的原始版本,Vagrant 可以将当前使用的虚拟机再次打包。

1
vagrant package --output </path/to/package.box>