vagrant のドキュメントを読めばそのままだけど,まぁ備忘録もかねて書いてみます.
下記は Mac + VMware Fusion という環境前提で書いていますが,それ以外の方は適宜読み替えてください.
標準配布されている box を手元で色々とカスタマイズした物を再び box 化する方法ですが VirtualBox を使っていれば vagrant package コマンドで良いようですが,VMware を使ってると package コマンドなんて使えないよと怒られます.
ということで手作業が必要.
VMware の場合,.vagrant ディレクトリ以下に vm が作成されていますが,基本的には tar + gzip で固めるだけです.
けどその前にちょっとだけ作業が必要になります.
容量を少なくするためにあらかじめ vm の中で debian/ubunut なら apt-get clean, RHEL/CentOS なら yum clean を実行しておきましょう.
で,/Applications/VMware Fusion.app/Contents/Library 以下に vmware のコマンドがありますので下記を実行します.vmdk ファイルは .vagrant ディレクトリ以下にあります..vagrant/machines/default/vmware_fusion/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/ とかです.最後のディレクトリ名はランダムにつけられるようですね.で,下記を実行.
% vmware-vdiskmanager -d /path/to/main.vmdk
% vmware-vdiskmanager -k /path/to/main.vmdk
vmware-vdiskmanager のマニュアルを見ると判りますが,これらのコマンドで vm のディスクに対して defragment と shrink を行っています.まぁ,容量を減らすための作業ですね.必要なければスキップしても良いと思います.で,
% tar cvzf custom.box ./*
box ファイルを作成した後,
% vagrant box add --name custom custom.box
すれば
%vagrant box list
custom (vmware_desktop, 0)
と表示されるようになりますので通常の物と同様に
% vagrant init custom
% vagrant up
% vagrant ssh
などで使えるようになります.
box 作成手順を bash script で組むとこんな感じかな?
#!/bin/bash
VMWARE_TOOLDIR="/Applications/VMware Fusion.app/Contents/Library/"
VMX_FILE=`cat .vagrant/machines/default/vmware_fusion/id`
VMX_DIR=${VMX_FILE%/*}
VMX_DIRNAME=${VMX_DIR##*/}
BOX_NAME=`basename $VMX_FILE .vmx`
WD=`pwd`
"$VMWARE_TOOLDIR"/vmware-vdiskmanager -d $VMX_DIR/disk.vmdk
"$VMWARE_TOOLDIR"/vmware-vdiskmanager -k $VMX_DIR/disk.vmdk
pushd $VMX_DIR
tar cvzf $WD/${BOX_NAME}_custom.box ./*.vmdk ./*.json ./*.nvram ./*.vmsd ./*.vmx ./*.vmxf
popd
vmdk ファイル名や作成する box ファイル名などは適宜各自の環境に合わせて修正してください..vagrant ディレクトリ以下にある id ファイル中に vm のディレクトリ名称が記載されているので cat して利用しています.また,Mac の場合,VMWARE_TOOLDIR にスペースを含んでいるので若干小細工してます.
ただし,一点注意点.
最初に box 作成を行うための vm を作成する際に使用する Vagrantfile 中には
config.ssh.insert_key = false
を記載しておきましょう.これを記載しておかないと box 化する vm の ssh の authorized_key が置き換えられてしまい,パスワードなしでの ssh ログインが出来なくなってしまいます.そのため,作成した vm を box 化して add したものを使おうとすると vagrant up 時に
default: Warning: Connection refused. Retrying...
が延々と表示されて立ち上がらない状態になります.正確に言うと立ち上がってはいるんだけど,ssh でパスワードなしにログインできない状態ね.
こうなると Ctrl-C で止めた後,
% vagtant ssh-config
で IdentityFile の場所を確認した後,
% ssh-keygen -yf IdentityFile名 > pub.key
で pub.key ファイルを作成.
でユーザ名 vagrant,パスワード vagrant で vm にログインした後,.ssh/authorized_keys に上記で作成した pub.key を追加するという作業が必要になります.
しかし,box 作成を行うための vm を作成する際に使用する Vagrantfile 中に
config.ssh.insert_key = false
を記載しておけば,元々の authorized_keys ファイルが box を作成するための正しい状態で保たれるので,上記のような面倒な key 追加作業を行う必要はなくなります.
少し調べてみると Vagrant 1.7 以降からこういった仕様になったみたいですね.
以上,参考まで.