Virtual Boxのスナップショット自動取得について

2021年1月1日

この記事を読むと得られる情報

  • VirtualBoxをコマンドで制御する方法
  • VirtualBoxのスナップショットの世代管理方法
  • VirtualBoxのスナップショットの自動取得方法

VirtualBoxのスナップショットの取得について

ブログの検証用環境など、ちょっとした試験を行う場合とても便利なVirtualBox(以下VB)。
試験を行う都合上、多少無茶したりしてVMが壊れたりすることもあるかと思います。
そこで登場するのがスナップショット機能!
ゲームで言うセーブ機能みたいなもので、いつでもスナップショットを取得したときの状況に戻ることができます。
便利ですね〜
こんな便利機能を使わない手はない!!!

…のですが
スナップショットの取得は意識してやらないとだめで、いざという時に困ることがあります。

自分「あ、やべっ!VM壊れた…でもスナップショットがあるから…」
VBコンソール様「最新のスナップショットは3ヶ月前やで」
自分「😇」


なんてこともあるかと思います。
(少なくとも私はありました…)

そこで今回はVBのスナップショット自動的に取得する方法をご紹介致します!

スナップショットの自動取得について

早速ですが、スナップショットを自動取得するシェルスクリプトを公開します。

#! /bin/bash
# Get timestamp
timeStamp=`date "+%Y%m%d-%H%M%S"`
# Define server list
serverList=("XXX" "YYY" "ZZZ")
# Defining the number of snapshots to keep
keepNum=5
# Get backup for each server
for ((i=0 ; i<`echo ${#serverList[*]}` ; i++))
do
	# Take snapshot
	VBoxManage snapshot "${serverList[i]}" take "${serverList[i]}-${timeStamp}"
	# Check the number of snapshots
	snapshotNum=`VBoxManage snapshot "${serverList[i]}" list | grep "${serverList[i]}" -c`
	# If the number of snapshots is more than the set number, delete the oldest one
	if [ ${snapshotNum} -gt ${keepNum} ]; then
		cycle=`echo $((${snapshotNum} - ${keepNum}))`
		for ((j=0 ; j<${cycle} ; j++))
		do
			deleteName=`VBoxManage snapshot "${serverList[i]}" list | grep ${serverList[i]} -m1 | awk '{print $2}'`
			VBoxManage snapshot "${serverList[i]}" delete "${deleteName}"
		done
	fi
done

※最新のコードはgithubにて公開していますので、良ければ使ってみてください!

今回はLinuxやMac上にあるVBを操作することを前提としていますが、WindowsでもVBoxManageのコマンドは同様に使用することができます。
(if文やfor文は少し変更が必要ですが、仕組みは全く同じでこのまま動くかと思います)

このコードをcronなどに任意のタイミング(1日1回や1週間に1回など)で仕込んで貰えれば、あなたに代わってスナップショットを自動取得します!!

スクリプトの仕組みについて

ここからは本スクリプト動作の仕組みを紹介します。

まず、スクリプトを実行した際の時刻を取得し
スナップショットの名前 = VMの名前 + 時刻
とするために使用します。

次に、スナップショットを取得したいVMのリストをserverList配列に入れていきます。
VMの名前はVBコンソール画面から確認できます。

VirtualBOXでのsnapshot取得
VBのスナップショット取得画面

この赤枠の名前を配列の中に書き込んでください。
複数ある場合はいくつでも大丈夫なのでスペース区切りで書き換えてください。

続いてkeepNumですが、ここは保存したいスナップショットの世代の設定になります。
大きい値を入れれば、必要な時にかなり昔の状態まで戻ることが可能となりますが、ホストマシンのストレージ容量を必要とします。
パソコンの空き容量と相談して設定しましょう。

あとは、もう設定することはありません!
実行されたスクリプトはserverListの中にある要素の数を自動で取得して、for文を回し始めます。
serverListに記載してある名前のVMスナップショットを順次取得し、各VMのスナップショットの数を一旦チェックします。
その時にkeepNumで決めた値を上回っていた場合のみ、古い方からkeepNumと同じ数になるまで削除します。

これで安心してVMを使うことができるようになりますので、みなさんも積極的にスナップショットの取得をおすすめします!