カスタム Vagrant Box をゼロから作成する
VirtualBox と VMware Fusion 向けのカスタム Vagrant Box をゼロから作成する方法を解説します。VM の作成からパッケージングまでをステップバイステップで説明し、必要なとおりに動作する軽量で再利用可能な開発環境の構築をサポートします。

まずは「.box」ファイルとは何かを理解するところから始めましょう。Vagrant の「.box」は、少なくとも VM のメタファイル、ディスクイメージ、そして Box がどのプロバイダー向けに作成されたかを示す metadata.json を含む、tar で固めて gzip 圧縮しただけのパッケージです。必要に応じて、カスタムの Vagrantfile などの補助的なファイルを Box と一緒にパッケージすることもできます。
動作確認環境
簡単に動作確認環境について説明します。手順は汎用的に記述しているため、同様の構成であればほとんどのホストとゲストで動作するはずです。ただし、テスト済みなのは以下の環境のみです。そのため、明示・黙示を問わず動作を保証するものではありません。
ホスト
この記事では OS X の開発環境を前提としています。特に断りのない限り、ホスト上のソフトウェアはすべて OS X 版であるものとします。
- Apple OS X Mountain Lion (10.7.5)
- VirtualBox 4.2.12
- VMware Fusion 5.0.4
- Vagrant 1.2.2
- 有効なライセンスを持つ Vagrant の VMware Fusion プロバイダー 0.6.3
ゲスト候補
テスト済みのゲストはすべて 64 ビット版の Linux ディストリビューションです。
- CentOS 6.4
- Debian 7.0
- Scientific Linux 6.4
- Ubuntu 12.10 Desktop
- Ubuntu 12.10 Server
仮想マシンの作成
まず仮想化ソフトウェアを起動し、Vagrant Box のベースとなる VM を作成します。VM を定義する際は、以下の構成オプションをおすすめします。
VirtualBox
VirtualBox で新しい VM を作成します。
- 名前: vagrant-<distro><arch> 例: vagrant-centos64
- タイプ: Linux
- バージョン: <distro> (64-bit)
- メモリーサイズ: 1024MB*
- 新しい仮想ディスク:
- タイプ: VMDK(可変サイズ)
- 最大サイズ: 40GB
VM の設定を変更します。
- オーディオを無効にする
- USB を無効にする
- ネットワークアダプター 1 が NAT に設定されていることを確認する
- 次のようにポートフォワーディングルールを追加する:
- 名前: SSH
- プロトコル: TCP
- ホスト IP:
- ホストポート: 2222
- ゲスト IP:
- ゲストポート: 22
- Linux ディストリビューションの ISO をマウントする
VMware Fusion
アシスタントを使って新しい仮想マシンを作成します。
- 「ディスクなしで続ける」を選択する
- 「ディスクまたはディスクイメージを選択…」を選択する
- インストールしたいディストリビューションの ISO を探し、「開く」を選択する
- 「簡易インストールを使用」のチェックボックスをオフにする
- 「設定のカスタマイズ」を選択する
- VMware ファイルの名前を入力し、「保存」を選択する
VM の設定をカスタマイズします。
- 共有フォルダをオンにする
- ネットワークを「インターネット共有 > Mac と共有」(いわゆる NAT)に変更する
- ディスクサイズを 40 GB に変更し、「2 GB ファイルに分割」の選択を解除する
- サウンドカードをオフにする
- 「Bluetooth デバイスを Linux と共有」をオフにする
ゲスト OS のインストール
VM を起動してゲスト OS をインストールし、入力を求められたら以下のように設定します。
- ホスト名: vagrant-<distro><arch>
- root パスワード: vagrant
- フルネーム: vagrant
- ユーザー: vagrant
- パスワード: vagrant
ゲスト OS のセットアップ
ここでは、ゲスト OS を動かし始めるための最小限の手順を紹介します。個人的には、必要のない追加ソフトウェアで Box を汚さないことをおすすめします。追加のソフトウェアパッケージはプロビジョニングツールで追加できます。こうすることで、ベース Box をプロジェクトやチームをまたいで再利用できるようになります。
sudoers ファイルの更新
作業はすべて vagrant ユーザーが行います。vagrant ユーザーには、パスワードなしの sudo 権限と、tty(端末)なしで実行できることが必要です。
ほとんどの Linux ディストリビューションでは sudoers グループに root ユーザーしか割り当てられていないため、vagrant ユーザーを sudoers ファイルに追加する必要があります。この作業は root で行う必要があります。
$ su -
$ visudo
Ubuntu 系のディストリビューションでは、インストール時に作成したユーザーが sudoers リストに追加されます。ユーザーに sudo 権限はありますが、それでも設定を変更する必要があります。
必要に応じて、以下の行を追加または変更します。
Defaults:vagrant !requiretty
#Defaults !visiblepw
Defaults env_keep = "SSH_AUTH_SOCK"
vagrant ALL=NOPASSWD: ALL
変更を保存してエディターを終了します。必要であれば root シェルも終了してください。これで vagrant ユーザーはパスワードなしで sudo を使えるようになっているはずです。ターミナルで次のコマンドを実行して確認しましょう。
$ sudo pwd
パッケージの更新
この時点で、インストール済みのパッケージを更新しておくことをおすすめします。
RHEL6
$ sudo yum update -y
Debian
$ sudo apt-get upgrade -y
更新が完了したら、更新が正しく適用されるように VM を再起動します。ターミナルで次のコマンドを実行すると、VM がすぐに再起動します。
$ sudo shutdown -r now
Vagrant の insecure key のダウンロード
vagrant ユーザーは、SSH キーを使って Box への認可されたアクセスを得ます。
$ mkdir -p /home/vagrant/.ssh
$ chmod 0700 /home/vagrant/.ssh
$ 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 /home/vagrant/.ssh
OpenSSH Server のインストールと設定
vagrant ユーザーは SSH 経由で Box にアクセスし、設定を行います。
RHEL6
$ sudo yum install -y openssh-server
$ sudo chkconfig sshd on
Debian
$ sudo apt-get install -y openssh-server
OpenSSH Server の設定を編集・更新します。
$ sudo vi /etc/ssh/sshd_config
以下の行を追加または変更します。
Port 22
PubKeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
ファイルを保存して終了し、SSH サービスを再起動します。
RHEL6
$ sudo service sshd restart
Debian
$ sudo service ssh restart
ゲストツールのインストール
仮想マシンのゲストツールは、パフォーマンスの向上とゲスト OS の管理機能の改善をもたらします。また、Vagrant はホストとゲスト OS の間に共有フォルダを作成する際にもゲストツールを使用します。
Guest Additions や VMware Tools をインストールする前に、ツールを正しくコンパイルしてインストールするための追加の開発パッケージが必要です。
RHEL6
$ sudo yum install -y gcc make kernel-devel
Debian
# Server
$ sudo apt-get install -y gcc build-essential linux-headers-server
# Desktop
$ sudo apt-get install -y gcc build-essential linux-headers-$(uname -r)
次に、使用している VM パッケージ用のゲストツールをインストールします。
VirtualBox
まず Guest Additions をマウントします。メニューバーから「Devices > Install Guest Additions…」を選択します。
$ cd /media/VBOXADDITIONS_4.2.12_84980
$ sudo ./VBoxLinuxAdditions.run
$ sudo umount /media/VBOXADDITIONS_4.2.12_84980 | cd ~
VMware Fusion
まず、メニューバーから「仮想マシン > VMware Tools のインストール」を選択して VMware Tools をマウントします。
$ sudo mkdir -p /mnt/cdrom
$ sudo mount /dev/cdrom /mnt/cdrom
$ tar xzvf /mnt/cdrom/VMwareTools-9.2.2-893683.tar.gz -C /tmp
$ cd /tmp/vmware-tools-distrib/
$ sudo ./vmware-install.pl
クリーンアップ
Box をパッケージする前に、サイズを最小限に抑えるため Box をクリーンアップします。
RHEL6
$ sudo yum clean all
VM の状態に満足したら、パッケージングの準備としてシャットダウンします。
$ sudo shutdown -h now
Box のパッケージング
VM をパッケージすると、先ほど説明した .box ファイルが作成されます。
VirtualBox
Vagrant は、vagrant package コマンドを実行したディレクトリに .box ファイルを作成します。Box を作成したい特定の場所がある場合は、vagrant package コマンドを実行する前にそのディレクトリへ移動しておきましょう。以下の例では CentOS のゲストをパッケージしています。
$ mkdir -p ~/workspace/centos64/
$ cd ~/workspace/centos64/
$ vagrant package --base vagrant-centos64
VMware Fusion
VMware Fusion では、VM をパッケージするのにもう少し手作業が必要です。ターミナルで次の手順を行います。
vmwarevm の場所に移動します。デフォルトの場所は ~/Virtual Machines/ です。
.vmwarevm ファイルを右クリックし、「パッケージの内容を表示」を選択します。
metadata.json という名前のファイルを作成し、次の内容を入力します。
{"provider": "vmware_fusion"}
- Vagrantfile という名前のファイルを作成し、次の内容を入力します。
# -*- mode: ruby -*-
# vi: set ft=ruby
Vagrant.configure("2") do |config|
config.vm.provider :vmware_fusion do |v, override|
v.gui = true
end
end
- 次に、Box を最適化してサイズを縮小します。
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -d Virtual Disk.vmdk
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -k Virtual Disk.vmdk
- 最後に Box を圧縮します。
$ tar cvzf package.box ./*
Box の起動テスト
$ vagrant box add testbox package.box
$ vagrant init testbox
$ vagrant up
Box の作成に成功していれば、vagrant up は次のような出力を表示します。
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'testbox'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
ホストからゲストにログインするには、次のコマンドを実行します。
$ vagrant ssh