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
仮想マシンを別のデータストアに移すときや、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には付いてくることが多いようですのでお気をつけ下さい。
以上、お役に立てば幸いです。