7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VirtualBoxのVMをライブ/オンライン/無停止バックアップするスクリプト

Last updated at Posted at 2019-05-10

VirtualBoxを止めずにバックアップをとりたい!

以前からしっくりくるツールが見つからなかったので作ってみました。

miyanaga@vbox-live-backup
https://github.com/miyanaga/vbox-live-backup

シンプルなスクリプトなのでご自由にアレンジしてお使いください! 活用例などコメントいただけると励みになります。

vbox-live-backup.gif

使い方

簡単なシェルスクリプトです。macOS/VirtualBox 6.0で動作確認してます。

VM1台の無停止バックアップ

$ ./vbox-backup-vm.sh "VMの名称" "バックアップ先フォルダ"

指定ディレクトリに、タイムスタンプ付きファイル名でOVFエクスポートされます。

VMすべての無停止バックアップ

$ ./vbox-backup-all.sh "バックアップ先フォルダ"

仕組み

VMが停止中の場合は直接エクスポートできるので、エクスポート(VBoxManage export)を実行して終了します。

稼働中のVMは直接エクスポートできないので、次の処理を行います。

  1. VMのスナップショットをとる VBoxManage snapshot take
  2. スナップショットからクローンVMを作る VBoxManage clone
  3. クローンVMの状態を破棄する VBoxManage discardstate
  4. クローンVMをエクスポートする VBoxManage export
  5. クローン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でも動く…かもです。
7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?