在 VMware Fusion 5 中创建 OS X Mountain Lion 基础 box
了解如何使用 VMware Fusion 5 为 OS X Mountain Lion 创建 Vagrant 基础 box。这份详尽的指南将带你走完从虚拟机配置到打包的全过程,为 Mac OS X 搭建一致的开发环境。非常适合需要在 Apple 操作系统上进行测试、同时又想享受 Vagrant 工作流便利的开发者。

开始之前
需要事先留意的几点:
- 装有 OS X 的虚拟机体积会很大。一个 OS X 基础 box 约为 5.65GB,超出了 Vagrant 为便于移植而建议的 box 大小。这一点无法避免。请记住这一点,确保有足够的磁盘空间,并在启动 box 时保持耐心。box 越大,下载和克隆所需的时间就越长。由于我这样做是出于开发和管理目的,为了能够进行可重复的测试,这样的启动时间是可以接受的。为了缩短拉取时间,你可以把 box 托管在内网的本地 HTTP 服务器上,而不是放在云端,不过这是可选的。
- 你的 Vagrant 版本必须为 1.3.0 或更高。在 1.3.0 之前,如果不借助变通方法和 hack 手段,Vagrant 并不支持 OS X。
环境检查
本文已在以下环境中测试通过:
- Apple OS X Mountain Lion(宿主机和客户机)
- VMware Fusion 5.0.3
- Vagrant 1.3.5
- Vagrant 插件 vagrant-vmware-fusion 2.0.8
注意:OS X Mavericks 宿主机和客户机的步骤与此相同,但至少需要 VMware Fusion 6.x。
在 VMware Fusion 中创建 OS X 虚拟机
在 VMware Fusion 中新建一个虚拟机。
如果你不熟悉如何在 VMware Fusion 中创建 OS X 虚拟机,可以留言让我写一篇教程。在此之前,我先假定你已经知道怎么做。在 VMware Fusion 中创建虚拟机时需要注意以下几点:
- 保存虚拟机时,将文件名改为 mountain64-1_vmware.vmwarevm。
- 修改虚拟机的硬盘设置,不要将硬盘拆分为多个 2GB 文件。
- 系统首次启动时,将初始用户的全名、用户名和密码字段都填写为
vagrant。
配置客户机操作系统
除非另有说明,以下所有步骤均在客户机操作系统中执行。
安装 VMware Tools
第一步,我们先安装 VMware Tools,以便在宿主机和客户机之间复制粘贴。
在宿主机上选中 VMware Fusion:
- 在 Apple 菜单栏中选择 Virtual Machine > Update VMware Tools…。该菜单项也可能显示为 Install VMware Tools、Reinstall VMware Tools 或 Update VMware Tools。
- 在弹出的对话框中点击 Install。
在客户机上:
- 磁盘映像挂载完成后,双击 Install Vmware Tools 安装包。
- 按默认提示操作,直到安装完成。注意,安装过程中会提示你输入管理员密码。
- 安装完成后重启。
- 出现提示时重新登录。
现在,在本文接下来的部分中,你可以根据需要在宿主机和客户机之间复制粘贴命令了。
更新操作系统
为了减少每次启动 box 时需要安装的更新数量,请先运行软件更新。
- 打开终端并运行:
$ sudo softwareupdate --install --all
- 等待更新完成后重启。根据需要重复此步骤,直到没有可用的更新为止。
在 OS X 中禁用防火墙
OS X 默认禁用防火墙。请检查“安全性与隐私”设置,确认确实如此。
- 打开 System Preferences > Security & Privacy。
- 选择 Firewall 选项卡。
- 确保防火墙处于关闭状态。
本文不涉及 box 的安全性,因此为简单起见应关闭防火墙。如果你有更严格的限制要求,可以自行研究 Firewall Options…。
启用远程登录
要让 Vagrant 通过 SSH 登录 OS X box,我们只需启用远程登录。
- 打开 System Preferences > Sharing。
- 勾选 Remote Login 将其开启
- 可选。根据需要修改访问权限。默认选中 All Users。如果将此选项改为 Only these users:,请添加你创建的 vagrant 用户。
下载 Vagrant 的不安全密钥
vagrant 用户将使用 SSH 密钥获得访问 box 的授权。
$ mkdir -p /Users/vagrant/.ssh
$ chmod 0700 /Users/vagrant/.ssh
$ curl -o /Users/vagrant/.ssh/authorized_keys --url https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 0600 /Users/vagrant/.ssh/authorized_keys
$ chown -R vagrant /Users/vagrant/.ssh
设置免密码 sudo
vagrant 用户需要免密码的 sudo 权限,请在终端中运行以下命令:
$ sudo visudo
根据需要添加或修改以下几行:
Defaults env_keep += 'SSH_AUTH_SOCK'
Defaults:vagrant !requiretty
# Add the vagrant user at the end of the file
vagrant ALL=NOPASSWD: ALL
保存并退出。
优化客户机
如果此时查看 VMware 文件的大小,会发现运行时约为 16.26GB,关机时约为 14.11GB。此时关闭虚拟机并进行压缩几乎不会减小虚拟机的体积,只能减少 0.02GB 左右。
但如果我们先将客户机磁盘上的空闲空间清零再进行压缩,就可以把虚拟机缩小到约 7.48GB。
- 打开终端并输入:
$ diskutil secureErase freespace 0 Macintosh HD
$ sudo halt
完成 box 的制作
从这里开始,所有操作都在宿主机上进行。
- 打开终端,切换到虚拟机的保存位置。通常为 ~/Documents/Virtual Machines/。
- 进入虚拟机对应的 .vmwarevm 文件目录。
创建 metadata.json
- 在终端中运行以下命令:
$ vi metadata.json
- 在编辑器中输入以下内容:
{ "provider": "vmware_fusion" }
- 保存文件。
- 退出编辑器。
压缩虚拟机磁盘
- 打开终端并输入:
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -k
- 输入一个空格,然后输入虚拟机虚拟磁盘文件的路径。
- 按回车键。
完成上述操作后,虚拟磁盘应该会缩小到约 7.48GB。
打包虚拟机
使用 tar 和 gzip 打包虚拟机可以减小 box 的体积。打包后的虚拟机约为 5.63GB。
- 在终端中运行以下命令:
$ tar -cvzf mountain64-1_vmware.box ./*
压缩完成后,将 .box 文件移动到更合适的项目工作目录或 Web 服务器上。本例中我们使用 ~/workspace/vagrant-example。你的系统上很可能还没有这个目录,所以移动之前当然要先创建它。
启动 Vagrant OS X 基础 box
在终端中切换到项目工作目录 ~/workspace/vagrant-example,然后运行:
$ vagrant box add mountain64 mountain64-1_vmware.box
$ vagrant init mountain64 mountain64-1_vmware.box
此时,如果想以无界面(headless)模式运行虚拟机,只需运行:
$ vagrant up --provider=vmware_fusion
如果想以 GUI 模式运行,请修改项目工作目录中生成的 Vagrantfile,添加以下几行:
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provider :vmware_fusion do |v|
v.gui = true
end
# Existing Vagrantfile generated template...
然后运行:
$ vagrant up --provider=vmware_fusion
如果一切顺利,你将在终端中看到以下输出:
Bringing machine 'default' up with 'vmware_fusion' provider...
[default] Cloning VMware VM: 'mountain64'. This can take some time...
[default] Verifying vmnet devices are healthy...
[default] Preparing network adapters...
[default] Fixed port collision for 22 => 2222. Now on port 2200.
[default] Starting the VMware VM...
[default] Waiting for the VM to finish booting...
[default] The machine is booted and ready!
[default] Forwarding ports...
[default] -- 22 => 2200
[default] Configuring network adapters within the VM...
[default] Enabling and configuring shared folders...
[default] -- /Users/username/workspace/vagrant-example: /vagrant