Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

vagrant + VMware Fusion での box 作成方法と ssh のキーの設定

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 化する vmssh の 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 ssh

でユーザ名 vagrant,パスワード vagrantvm にログインした後,.ssh/authorized_keys に上記で作成した pub.key を追加するという作業が必要になります.

しかし,box 作成を行うための vm を作成する際に使用する Vagrantfile 中に

config.ssh.insert_key = false

を記載しておけば,元々の authorized_keys ファイルが box を作成するための正しい状態で保たれるので,上記のような面倒な key 追加作業を行う必要はなくなります.

少し調べてみると Vagrant 1.7 以降からこういった仕様になったみたいですね.

以上,参考まで.