Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

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でも動く…かもです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?