トップページ»3.4.製品»ESXiゲストの自動バックアップ処理の覚書
3.4.製品
ESXiゲストの自動バックアップ処理の覚書
ESXiゲストの自動バックアップですが、簡単なものではありますができるようになりました。 予定していたとおりcronで、毎週日曜日に1回のスケジュール、今のディスク使用量で行くと6回取ると自動的にローテートするようになる感じです。 まぁ1ヶ月以上取れれば十分かな。
バックアップスクリプトは自分の環境に依存した部分が多いので公開する気になれませんが、作っている最中にいくつか悩んだ点があったので、その部分をメモしておこうかと。
バックアップ(とリストア)の基本的な方法はこっちに書いたのがベースです。
非同期のタスク対策
バックアップを取る直前にスナップショットをとる方法でやるわけですが、vim-cmdを発行した直後に処理がスクリプトに戻ってしまう、つまりvim-cmdをはじめ、多くのタスクは非同期でできている訳で、これはもちろん良いことなんですが、スクリプトで使うとなるとスナップショットがとれる前にバックアップ処理に遷移しエラーとなってしまう。
単純に考えてsleepさせれば良いんですけど、何秒待てば良いのかがわからない。 短すぎるとエラーになるし、これが自動処理になったらバックアップがとれずにいて気がつかない可能性も出てくる。 かといってあまり長くするのも気持ち悪い。
なので下のような方法でタスクを監視することにしました。
check_running_task (){
for i in `vim-cmd vimsvc/task_list|grep vim.Task:haTask-$1|grep $2|sed -e 's/.*vim.Task://' -e "s/[', ]//g"`; do
if [ "`vim-cmd vimsvc/task_info $i|grep running`" != "" ] ; then
return 0
fi
done
return 1
}
vim-cmd vmsvc/snapshot.create $TARGET_VMID forBackup > /dev/null 2>&1
if [ $? -ne 0 ]; then echo Snapshot create error.; exit; fi
while check_running_task $TARGET_VMID createSnapshot; do sleep 1; done
やってることはタスクリストを引っ張り出して、先に実行したタスクの状態が実行中かどうか真偽を返す関数を作って、実行中の場合はループしているだけです。 これをスナップショット作成とか削除のときに使いました。
2009-04-20追記
書き忘れてましたが、snapshot.removeallの時の上記関数の第2引数はremoveAllSnapshotsになります。 私はこの二つしか使ってません。
複数の仮想ディスク対策
バックアップ対象のゲストが持つ仮想ディスクが1つの場合は単純にゲスト名.vmdkをクローニングすれば良いんですけど、複数ある場合はそれじゃ済まない。 かといってスタティックにファイル名を記述するのもアレですし。
なので次のようにして使っている仮想ディスク一覧を引っ張り出しました。
TARGET_VMDKFILES=`vim-cmd vmsvc/get.filelayout $TARGET_VMID|grep vmdk|sed -e 's/.*\///' -e 's/[" ]//'`
for i in $TARGET_VMDKFILES; do
vmkfstools -i $TARGET_BASEDIR$i -d monosparse $BACKUP_BASEDIR$i
done
でもこの方法だけだと、複数の物理ディスクに仮想ディスクが散在している場合の対応が取れてません。 ウチの場合はこれで十分なのでこうしてますが。(この辺手抜きです)
タイムゾーンの問題
ESXiはタイムゾーンがUTC固定らしく、今のところ変える方法が見つけられてません。 今回バックアップ開始時と終了時に日時をechoさせたり、バックアップ先のフォルダ名に日付をつけたりさせたのですが、このままだと時間を脳内変換しなければならないので、せめてこのスクリプト中だけはと以下のようにしました。 (あ、crontabは素直に脳内変換してます。汗)
BACKUP_BASEDIR=$BACKUP_DIR`TZ=JST-9 date '+%Y%m%d'`/$1/
echo Beginning at `TZ=JST-9 date '+%Y/%m/%d %H:%M:%S'` JST
これでとりあえずは日本時間の表示になります。
バックアップ先の空きディスク容量監視
今回バックアップ専用の物理ディスクを用意したのですが、やっぱりディスク容量がギリギリになるまで複数世代バックアップしていきたい。 なので、監視用のデーモンチックなスクリプトを別に作りました。 下のがそれ。
#!/bin/ash
STORAGE_ID='49b9f416-7fad7cd8-0000-0000000000'
TARGET_FOLDER='/vmfs/volumes/datastore2/backup/'
trap 'exit 1' 1 2 3 15
while [ -1 ]; do
if [ `df|awk '/'$STORAGE_ID'/ { print $5 }'|sed s/%//` -ge 99 ]; then
echo [warn]Disk space exceeded the threshold.
rm -rf $TARGET_FOLDER`ls -C $TARGET_FOLDER|awk '{print $1}'`
fi
sleep 60
done
やってることは単純で、dfでバックアップ先の空き容量を引っ張り出して、閾値を超えたら古い日付のフォルダをばっさり削除しているだけです。 ディスクのIDは面倒なので今回はスタティックにしちゃいました。(汗)
2009-04-20追記:
数字の99がdfが出してくるディスク容量のパーセンテージを見る閾値です。 かなりギリギリな設定にしてますが、vmkfstoolsがディスク出力する速度を考えると十分間に合うと見ています。
これを本体のバックアップスクリプトの最初のほうで&をつけて実行して、バックアップが終わったらtermを送って終了させてます。
watch_diskspace_daemon &
WDDPID=$!
kill -term $WDDPID
crontabの制限対策
スクリプト作り終わってから気がついたんですが、スクリプトの置き場所として/vmfs/volumes/datastore2以下にしてそれをcronから呼ぼうとしたら実行されませんでした。 色々試行錯誤してどうやら/sbin以下であれば動くということに気がつき、例によってrc.localにシンボリックリンクを張るようにして逃げました。
ひとまずこんな感じ。 時間が無い中、あまり考えず作ったので問題があるかもしれませんが、随時変更していくということで。
でもESXiの中、色々コマンドあって助かります。 busybox様様ですね。
投稿日 : 2009年4月19日
この記事に関する言及
このエントリーのトラックバックURL:
http://akionweb.com/mt-tb.cgi/464
コメント
このページに対する感想、意見をお寄せ下さい。
おことわり
当サイトに掲載している全ての情報は、全て当サイト管理者が個人的、実験的に試した事、又は独自に調査したものです。 従ってその情報に誤りがある可能性も多分にあります。 当サイトの情報をそのまま鵜呑みにされませんようお願い申し上げます。 また当サイトの情報を元に作業されたりする場合はそれをご理解頂いた上で、あくまで自己責任の元で行ってください。
トップページ»3.4.製品»ESXiゲストの自動バックアップ処理の覚書


