开发的时候我需要一个刚装完系统的纯净 CentOS7 虚拟机环境,网上别人打包好提供的 vagrant box 基本上装 VBoxGuestAdditions 时安装的内核和 gcc 都是通过 yum 来安装,因为经过了 yum update,系统中升级过的 RPM 包版本过高,与我开发依赖的有冲突,我只能利用安装光盘自己打包一个。

1. Virtualbox 安装好虚拟机

Virtualbox 中新建一个虚拟机,安装好系统,安装时软件包选择 minimalroot 账户密码设为 vagrant

完成后重启,下面的步骤在虚拟机中进行

2. 添加 vagrant 用户

并设置密码为 vagrant

user add vagrant
echo 'vagrant' | passwd vagrant --stdin

3. 下载 vagrant 的 SSH 公钥

mkdir -p /home/vagrant/.ssh
curl -k https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub >> /home/vagrant/.ssh/authorized_keys
chmod 0700 /home/vagrant/.ssh
chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant /home/vagrant/.ssh

4. 安装内核 headers 和 gcc

在虚拟机光驱加载 CentOS7 的 安装光盘

加载光盘映像

# 挂载 ISO 到 /media/cdrom
mkdir /media/cdrom
mount /dev/cdrom/ /media/cdrom
# 用 yum 把安装光盘作为源安装
yum install --disablerepo=* --enablerepo=c7-media kernel-headers kernel-devel bzip2 gcc
# 清除 yum 缓存
yum clean all
# 卸载 ISO
umount /dev/cdrom

5. 安装 dkms

安装 dkms 后以后安装/升级内核时会自动重新编译 VBoxGuestAdditions 模块

http://rpmfind.net/linux/rpm2html/search.php?query=dkms 寻找合适的 dkms 的 RPM 包并下载安装

curl -O ftp://rpmfind.net/linux/epel/7/x86_64/d/dkms-2.2.0.3-34.git.9e0394d.el7.noarch.rpm
rpm -ivh dkms-2.2.0.3-34.git.9e0394d.el7.noarch.rpm

6. 安装 VBoxGuestAdditions

在虚拟机光驱加载 VBoxGuestAdditions.iso

此 ISO 一般在 Virtualbox 的安装目录下,比如 Windows 位于 C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso

mount /dev/cdrom /media/cdrom
cd /media/cdrom
./VBoxLinuxAdditions.run

7. 让 vagrant 用户免密码 sudo

visudo
# 添加一行:
vagrant ALL=(ALL) NOPASSWD:ALL
# 注释掉 requiretty 那一行:
# Defaults    requiretty

完成此步后关掉虚拟机

8. 打包成 vagrant box

# 必须关掉要打包的虚拟机,在终端执行
vagrant package --base 虚拟机名

完成后会在当前目录下生成最终的 package.box 文件