跳到正文

Development

在 VMware Fusion 5 中创建 OS X Mountain Lion 基础 box

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

阅读约需 5 分钟

开始之前

需要事先留意的几点:

  • 装有 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:

  1. 在 Apple 菜单栏中选择 Virtual Machine > Update VMware Tools…。该菜单项也可能显示为 Install VMware Tools、Reinstall VMware Tools 或 Update VMware Tools。
  2. 在弹出的对话框中点击 Install。

在客户机上:

  1. 磁盘映像挂载完成后,双击 Install Vmware Tools 安装包。
  2. 按默认提示操作,直到安装完成。注意,安装过程中会提示你输入管理员密码。
  3. 安装完成后重启。
  4. 出现提示时重新登录。

现在,在本文接下来的部分中,你可以根据需要在宿主机和客户机之间复制粘贴命令了。

更新操作系统

为了减少每次启动 box 时需要安装的更新数量,请先运行软件更新。

  1. 打开终端并运行:
$ sudo softwareupdate --install --all
  1. 等待更新完成后重启。根据需要重复此步骤,直到没有可用的更新为止。

在 OS X 中禁用防火墙

OS X 默认禁用防火墙。请检查“安全性与隐私”设置,确认确实如此。

  1. 打开 System Preferences > Security & Privacy。
  2. 选择 Firewall 选项卡。
  3. 确保防火墙处于关闭状态。

本文不涉及 box 的安全性,因此为简单起见应关闭防火墙。如果你有更严格的限制要求,可以自行研究 Firewall Options…。

启用远程登录

要让 Vagrant 通过 SSH 登录 OS X box,我们只需启用远程登录。

  1. 打开 System Preferences > Sharing。
  2. 勾选 Remote Login 将其开启
  3. 可选。根据需要修改访问权限。默认选中 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。

  1. 打开终端并输入:
$ diskutil secureErase freespace 0 Macintosh HD
$ sudo halt

完成 box 的制作

从这里开始,所有操作都在宿主机上进行。

  1. 打开终端,切换到虚拟机的保存位置。通常为 ~/Documents/Virtual Machines/。
  2. 进入虚拟机对应的 .vmwarevm 文件目录。

创建 metadata.json

  • 在终端中运行以下命令:
$ vi metadata.json
  • 在编辑器中输入以下内容:
{ "provider": "vmware_fusion" }
  • 保存文件。
  • 退出编辑器。

压缩虚拟机磁盘

  1. 打开终端并输入:
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -k
  1. 输入一个空格,然后输入虚拟机虚拟磁盘文件的路径。
  2. 按回车键。

完成上述操作后,虚拟磁盘应该会缩小到约 7.48GB。

打包虚拟机

使用 tar 和 gzip 打包虚拟机可以减小 box 的体积。打包后的虚拟机约为 5.63GB。

  1. 在终端中运行以下命令:
$ 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
分享