今、VMware ESXi を使って仮想サーバをいくつか動作させています。
ghettoVCBと言うスクリプトを使ってVM稼動中のバックアップを行っているのですが、
先日新しく構築した VMwareESXiのホストで スクリプトが上手く動作しなかったので、
その経緯や、修正方法などを備忘。
この記事をもとにスクリプトの修正をされる方は自己責任でお願い致します。
前提条件
ghettoVCBのバージョン
ESXi5.0にも対応した最新版
Created Date: 11/17/2008のもの。
動作しなかったESXiのバージョン
4.1.0 721871
動作していたESXiのバージョン
4.1.0 260247 / 4.1.0 348481
現象内容
以前から使用していたスクリプトを、そのまま新しいVMwareESXiホストにコピーして使おうとする。
が、動作しない。
ghettoVCBが実行されると、対象仮想マシンのスナップショットが作成されます
そしてスナップショットが作成されてからの仮想ディスクへの変更は本来のファイルには書き込まれず、
スナップショットファイルに書き込まれていきます。
そのおかげで本体の仮想ディスクファイルをコピーすることが可能となります。
仮想ディスクファイルのコピーが始まり、完了するとスナップショットを削除する処理が実行されます。
今回動作しなかったのは このスナップショットを削除する処理でした。
結果として スナップショットを削除する処理が延々と実行されている状況のまま止まってしまい、
次の仮想マシンバックアップに移らず、全体のバックアップ処理も終わらないという状態に陥っていました。
修正内容
ghettoVCBの削除処理が終わらないといった話題が VMwareのコミュニティに投稿されていたため、
読んでみるとスナップショットを削除するコマンドが変わったので動作しないというような書き込みがされていました。
(英語なんで意味合いが合っているかどうか、自信は無いです)
ghettoVCB.sh hangs when trying to remove the sn... |VMware Communities
vmsvc/snapshot.remove で良かったものが、4.1.0 721871 では動作せず。
vmsvc/snapshot.removeall に修正したところ、動作するようになりました。
以前からスクリプトを使用していた 4.1.0 260247 / 4.1.0 348481 といったバージョンでは問題なく動作していたのですが、
コマンドの仕様変更があったと言う事なんでしょうかね。
修正前
if ${SNAP_SUCCESS} -eq 1 && [[ ! ${POWER_VM_DOWN_BEFORE_BACKUP}
${VMWARE_CMD} vmsvc/snapshot.remove ${VM_ID} > /dev/null 2>&1
#do not continue until all snapshots have been committed
logger "info" "Removing snapshot from ${VM_NAME} ..."
while ls "${VMX_DIR}" | grep -q "\-delta\.vmdk";
do
sleep 5
done
fi
修正後
if ${SNAP_SUCCESS} -eq 1 && [[ ! ${POWER_VM_DOWN_BEFORE_BACKUP}
${VMWARE_CMD} vmsvc/snapshot.removeall ${VM_ID} > /dev/null 2>&1
#do not continue until all snapshots have been committed
logger "info" "Removing snapshot from ${VM_NAME} ..."
while ls "${VMX_DIR}" | grep -q "\-delta\.vmdk";
do
sleep 5
done
fi