2014年12月23日火曜日

VMware ESXi無償版でVMをコピーするシェルスクリプト

 VMwareの案件があって、自分のESXiサーバをちょこちょこいじっているんですが、仮想マシンの保存先データストア(要はハードディスク)を変更したくなりました。Storage vMotionを使いたいところですが、無償版では手作業でやるしかありません。

 そこで、ブログ記事「にほんごVMware  ESXi でのVMのクローンについて(vCenterがない場合)」を真似してシェルスクリプトを作ってみました。


 上記記事との差異としては、
  • RDMは除外してコピーしてくれる
  • vmxファイル内はいじらない
  • テスト動作(Dry run)ができる
といったところでしょうか。

 仮想マシンを別のデータストアに移すときや、RDM有りのVMをバックアップする際にお役に立てるかもしれません。

 使い方としては下記のスクリプトをコピー先に配置し、下記のように実行してください。
sh copy_vm.sh <コピー元データストア名> <仮想マシン名>

 この時、何でもいいので3つめの引数を指定するとDry runモードとなり、echo出力のみ行います(←手抜き)。
例: sh copy_vm.sh datastore1 vm1 test

SRC_VM=/vmfs/volumes/$1/$2
DST_VM=$2

[ -d $SRC_VM ] || { echo "src_vm does not exist."; exit 1; }
[ -d $DST_VM ] && { echo "dst_vm already exists."; exit 1; }

echo "Make directory..."
echo "mkdir $DST_VM"
[ $# -eq 2 ] && mkdir $DST_VM

echo "Copy vmdk..."
### List vmdk only
ls $SRC_VM/*.vmdk | egrep -v '\-flat\.|\-delta\.|\-rdmp?\.' | while read L
do
  ### Skip RDM
  RDM=`echo $L | sed -e s/\.vmdk/-rdm.vmdk/g`
  [ -e $RDM ] && continue
  RDMP=`echo $RDM | sed -e s/\-rdm\./-rdmp./g`
  [ -e $RDMP ] && continue

  L2=`echo $L | sed -e s@${SRC_VM}@${DST_VM}@g`
  echo "$L => $L2"
  [ $# -eq 2 ] && vmkfstools --diskformat thin --clonevirtualdisk $L $L2
done

echo "Copy another files..."
### List except vmdk,log
ls $SRC_VM/* | egrep -v '\.vmdk|\.log' | while read L
do
  L2=`echo $L | sed -e s@${SRC_VM}@${DST_VM}@g`
  echo "$L => $L2"
  [ $# -eq 2 ] && cp -p $L $L2
done
 コピーが終わった後は、必要に応じて下記のようにvmxファイル内に元のデータストアへの絶対パスが含まれていないか確認できます(grepにはデータストアのUUIDの一部を指定します)。
for FN in `find . -name *.vmx`; do cat $FN | grep 51fe1b01; done
 どうやら仮想スワップファイル(vswp)へのパスは絶対パスで含まれていることが多いようです。スナップショット込みのVMには付いてくることが多いようですのでお気をつけ下さい。

 以上、お役に立てば幸いです。