VMWare Server 2.0 での VM バックアップ

(

)

by

in

VMWare Server 2.0 でのバックアップ
前提
・Host OS は、Linux
・バックアップ頻度は1日1回程度(最悪その間に更新されたデータがロストする事を許容)
・簡単/無料である事
いろいろ調べてみると、大きく分けて以下の2つの方法がある。
A.VM (Guest OS)を停止もしくは Suspend させて、その間にVMを構成するファイルをバックアップ。その後VMを起動もしくはレジュームさせる。

メリット
・VMWare のスナップショット機能は、開発用途などで使用可能
デメリット
・VMが停止している時間が B. と比べて長くなる可能性が高い
・どのVMは起動していたかを記憶しておく必要がある

B.VM(Guest OS)のスナップショットを取り、VMは停止させずにファイルをバックアップ。必要であれば、その後スナップショットを削除。

メリット
・VMが(事実上フリーズして)使えない時間が短い(が、多少はある)
・VMが起動していようが、落ちていようが気にする必要が無い
デメリット
・VMWare のスナップショット機能は使えない(バックアップに使うので)
・障害時にファイルをリストアした時に、ゴミファイルが残っているので snapshot まで revert してやる必要がある

A.の場合、ファイルをバックアップする間は、VMを停止させる必要があるので、その時間を最短化するために、LVM のスナップショット機能を用いるバリエーションがある。
(LVMボリューム上に VM ファイルを置き、LVMのスナップショットを取得したら、VMを起動出来る。その後、スナップショットのファイル群をバックアップ)
例えば、http://www.multi.ne.jp/staff_note/2008/09/000481.html など。
今回は、B. パターンを採用する事にして、以下のスクリプトを作成してみた。
注意
・事前に、WebAccess でスクリプト実行ユーザに権限を与えておく事。
・vmware-vim-cmd でライブラリエラーが出る場合は、ダイナミックライブラリの登録をする事
・セキュリティーキーファイルへのアクセス権限が無い場合は、適当な方法で権限を確保する事。

#!/bin/bash

#

# Backup VM on VMWare Server 2.0

# ** cation : DO NOT USE snapshot function by manually.

#

# please grant “Administrator” permission to OS user who runs this script.

# (see VMWare Infrastructure WebAccess / {Physical Server} / Permissions tab

# Commands “New Permission”.)

# please check file permission to read /etc/vmware/ssl/rui.key for the OS user

# please set vmware dynamic library path /usr/lib/vmware-vix/lib at /etc/ld.so.conf

#

VM_DIR=/u01/VM
BACKUP_DIR=/u01/backup
VIM_CMD=/usr/bin/vmware-vim-cmd
echo “Start Backup VMs”
## take vm list ##
echo
echo “List of VMs”
$VIM_CMD vmsvc/getallvms
vmids=`$VIM_CMD vmsvc/getallvms | sed ‘s/s.*//’ | egrep “[0-9]+”`
## take snapshot ##
echo
echo “Start Snapshot : `date`”
for id in $vmids;
do
echo “Try to create snapshot for Vmid[$id]”
$VIM_CMD vmsvc/snapshot.create $id
sleep 10
done
## take backup ##
echo
echo “Start Backup VM files : `date`”
rsync -av $VM_DIR/* $BACKUP_DIR/
sync
## delete snapshot ##
echo
echo “Start Delete All Snapshots : `date`”
for id in $vmids;
do
echo “Try to remove all snapshot for Vmid[$id]”
$VIM_CMD vmsvc/snapshot.removeall $id
sleep 10
done
echo
echo “Finish Backup : `date`”
exit

* 稼働していない VM がそれなりにあったり、リカバリータイムの最小化に拘り、バックアップ用ストレージが潤沢なら、上記の通り rsync でバックアップを取る。
* 全ての VM が稼働していて、バックアップ用ストレージがあまり無いなら、圧縮してバックアップを取る方が良い。(tar zxvf $BACKUP_DIR/vmbackup.tar.gz $VM_DIR/* など)