VagrantのSnapshot機能で仮想マシンの状態を保存/復元しよう

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 Vagrant のバージョン 1.8 から、新しく Snapshot という機能が追加されました。 Snapshot 機能とは、ある時点の仮想マシンの状態を保存/復元できるようにする機能です。 例えば「これからWEBサーバーをインストールするんだけど、操作が不安!」などという時に、今の仮想マシンの状態を保存しておくことで、それ以降の手順で間違えがあっても状態を元に戻せる機能です。 今まで Vagrant では、sahara プラグインで実現できていましたが、プラグインが不要となり Vagrant 本体だけでスナップショットの機能が利用できるようになりました。 本稿では、Snapshot機能の使い方を解説したいと思います。

事前準備

 当たり前ではありますが Snapshot 機能は Vagrant 1.8 からの新機能ですので、古い Vagrant を利用している場合は最新の Vagrant をインストールしてください。

マシンの状態を保存してみよう

 まずは仮想マシンの状態を保存する方法について解説します。 まずは仮想マシンを vagrant up コマンドで起動して仮想マシンにログインします。 (次の例では vagrant ssh コマンドでログインしていますが、Windows の場合は SSH クライアントで仮想マシンにログインします)

$ vagrant up
$ vagrant ssh

 Snapshot機能の学習をしたいだけなので、とりあえずホームディレクトリに TEST1.txt というファイルを作成します。

$ touch ~/TEST1.txt

 いったんこの状態で仮想マシンの状態を保存したいと思います。 仮想マシンから exit して、vagrant halt コマンドで仮想マシンをシャットダウンします。 シャットダウンが完了したらマシンの状態を保存します。 次の例のように vagrant snapshot save コマンドでスナップショットの名前を付けて状態を保存します。 次の例では「savepoint1」という名前で状態を保存しました。

$ vagrant halt
$ vagrant snapshot save savepoint1
==> default: Snapshotting the machine as 'savepoint1'...
==> default: Snapshot saved! You can restore the snapshot at any time by
==> default: using `vagrant snapshot restore`. You can delete it using
==> default: `vagrant snapshot delete`.

 作成したスナップショットは vagrant snapshot list コマンドで確認することができます。

$ vagrant snapshot list
savepoint1

スナップショットを復元してみよう

 さて、それではもう少し仮想マシンに変更を加えてみましょう。 仮想マシンを起動して、今度は TEST2.txt というファイルを作成します。 ファイルを作成したら、仮想マシンから exit して仮想マシンをシャットダウンします。

$ vagrant up
$ vagrant ssh
$ touch ~/TEST2.txt
$ ls ~
TEST1.txt TEST2.txt
$ exit
$ vagrant halt

 現状では TEST2.txt というファイルが作成しているはずですが、この TEST2.txt を作っていない状態に復元したいと思います。 次のように vagrant snapshot restore コマンドで状態を復元します。

$ vagrant snapshot restore savepoint1

 コマンドを実行すると、仮想マシンの状態を復元したのち、そのまま仮想マシンが起動されます。 仮想マシンの起動が終わったら、仮想マシンにログインしてホームディレクトリの状態を確認しましょう。 TEST2.txt が無くなり TEST1.txt だけがあることが確認できると思います。
 このようにスナップショットを作成しておけば、操作を間違えても元の状態に戻すことができるのでとても便利です。

スナップショットの削除

 作成したスナップショットが不要になった場合は vagrant snapshot delete コマンドで削除できます。

$ vagrant snapshot delete savepoint1
==> default: Deleting the snapshot 'savepoint1'...
==> default: Snapshot deleted!

スナップショットを1つしか作らないで良い場合

 さて、ここまで vagrant snapshot save コマンドと vagrant snapshot restore コマンドで保存と復元を行いました。 vagrant snapshot save では、スナップショットに名前を付けていくつも状態を保存することができます。 savepoint1, savepoint2 などとスナップショットを複数作成できます。 しかしスナップショットを1つしか作らないで良い場合は、別途 vagrant snapshot push で保存、vagrant snapshot pop で復元をすることができます。 push と pop を利用する場合は、スナップショット名の指定は不要です。(内部的には次の例のように適当な名前が付けられている) そのかわり1つしかスナップショットを保存できないので注意が必要です。 筆者としては、 save と restore で保存/復元する癖を付けて置くのが良いと思っています。

$ vagrant snapshot push
==> default: Snapshotting the machine as 'push_1464270469_7534'...
==> default: Snapshot saved! You can restore the snapshot at any time by
==> default: using `vagrant snapshot restore`. You can delete it using
==> default: `vagrant snapshot delete`.

$ vagrant snapshot pop
==> default: Restoring the snapshot 'push_1464270469_7534'...
==> default: Deleting the snapshot 'push_1464270469_7534'...

おわりに

 これで Vagrant 1.8 の新機能 Snapshot の説明はおしまいです。 仮想マシンで手順を確認したり実験をする際に、是非活用したい機能ですね。

Vagrant入門へ戻る

Vagrantのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca