VirtualBoxを止めずにバックアップをとりたい!
以前からしっくりくるツールが見つからなかったので作ってみました。
miyanaga@vbox-live-backup
https://github.com/miyanaga/vbox-live-backup
シンプルなスクリプトなのでご自由にアレンジしてお使いください! 活用例などコメントいただけると励みになります。
使い方
簡単なシェルスクリプトです。macOS/VirtualBox 6.0で動作確認してます。
VM1台の無停止バックアップ
$ ./vbox-backup-vm.sh "VMの名称" "バックアップ先フォルダ"
指定ディレクトリに、タイムスタンプ付きファイル名でOVFエクスポートされます。
VMすべての無停止バックアップ
$ ./vbox-backup-all.sh "バックアップ先フォルダ"
仕組み
VMが停止中の場合は直接エクスポートできるので、エクスポート(VBoxManage export
)を実行して終了します。
稼働中のVMは直接エクスポートできないので、次の処理を行います。
- VMのスナップショットをとる
VBoxManage snapshot take
- スナップショットからクローンVMを作る
VBoxManage clone
- クローンVMの状態を破棄する
VBoxManage discardstate
- クローンVMをエクスポートする
VBoxManage export
- クローンVMとスナップショットを破棄する
VBoxManage snapshot delete
VBoxManage unregistervm
ソースコードはこんな感じです。
#!/bin/sh
VM=${1%\n}
BACKUPDIR=${2%/}
SERIAL=`date "+%Y%m%d%H%M%S"`
SNAPSHOT="$VM-backup-$SERIAL"
BACKUPFILE="$BACKUPDIR/$SNAPSHOT.ova"
alias vbox="VBoxManage"
RUNNING=`vbox showvminfo "$VM" --machinereadable | grep -c 'VMState="running"'`
if [ $RUNNING -ne 1 ]; then
echo "Try to export VM $VM to $BACKUPFILE"
vbox export "$VM" -o "$BACKUPFILE" \
--ovf10 --manifest
exit
fi
echo "Take snapshot of $VM as $SNAPSHOT"
vbox snapshot "$VM" take "$SNAPSHOT" --live && \
\
echo "Clone snapshot of $VM to temporary VM $SNAPSHOT on $CLONEDIR" && \
vbox clonevm "$VM" --snapshot "$SNAPSHOT" \
--mode machine --options keepallmacs \
--name "$SNAPSHOT" --basefolder "$CLONEDIR" --register && \
\
echo "Discard state of temporary VM $SNAPSHOT" && \
vbox discardstate "$SNAPSHOT" && \
\
echo "Export temporary VM $SNAPSHOT to $BACKUPFILE" && \
vbox export "$SNAPSHOT" -o "$BACKUPFILE" \
--ovf10 --manifest && \
echo "Delete temporary VM $SNAPSHOT"
vbox unregistervm "$SNAPSHOT" --delete
echo "Delete snapshot $SNAPSHOT"
vbox snapshot "$VM" delete "$SNAPSHOT"
echo "Delete clone directory $CLONEDIR"
rm -rf "$CLONEDIR"
注意点など
- 冒頭の動画はTiny Core Linuxのとても小さいディスクイメージでの動作なのであっという間に終わってますが、通常はそれなりに時間がかかります。
- バックアップ用の一時VMは、バックアップ先に指定したディレクトリに作りますが、一時的に元のVMと同じ容量を食います。
- VM本体をSSD、バックアップをHDDというような運用がいいと思います。
- バックアップファイルはタイムスタンプで別名になるのでどんどん増えていきます。ファイル名を固定にアレンジしたり、世代管理は別途ご用意ください。
- OVFのバージョンなど細かなオプションについても外部からは指定できないのでソースコードを変更ください。
- 以前のバージョンのVirtualBoxでも動く…かもです。