(Vagrant)saharaで仮想マシンをサンドボックス化(sandbox)し、サーバを元の状態に戻せるようにする

Vagrantのsaharaのインストールから仮想マシンのサンドボックス化を説明をしています。仮想マシンサーバをサンドボックス化すれば、仮想マシン上で何か作業をしたり何かを試して環境が壊れてしまった時に、元の状態に戻す事が可能です。

目的と環境

最終更新日:2021/4/20

Vagrantの仮想マシン上で作業をしている時に、何かを試したいけど試した結果、仮想マシンの環境が壊れるかもしれないという心配を感じる事があると思います。例えば、新しい何かをインストールしたら他が動かなくなったり、yum updateしたら既存のサービスが動作しなくなったりとかです。

そんな時に便利なのがsaharaというプラグインです。saharaを使えば 仮想マシンをサンドボックス化できます。サンドボックス化すれば、仮想マシン上で何か作業をしていて環境が壊れたり、自分が期待したいた結果にならなかった時に、元の状態に戻す事が可能です。ですので、仮想マシン上で気軽に何かを試す事ができるようになります。

ここでは、saharaのインストール、saharaを使った仮想マシンのサンドボックス化、そして、ロールバック(もとに戻す)やコミットのやり方について、実際に試しながら説明していきます。

◾️動作環境とバージョン情報です。
OS:macOS Big Sur(バージョン11.1)
Vagrant 2.2.7
VirtualBox 6.1.16

$ vagrant -v
Vagrant 2.2.7

$ VirtualBox -h
Oracle VM VirtualBox VM Selector v6.1.16

サンドボックスとは?

サンドボックス(sandbox)は、砂場という意味があります。ITの開発でサンドボックスと言うと、砂場遊び、砂箱実験という意味で、何かセキュリティ的に少し危険を感じる時に、他の環境に影響を及ぼさない隔離された領域(サンドボックス・砂場)の事を言います。開発者の砂場遊びという感じですね。
サンドボックス 【 sandbox 】

そして、Vagrantでは仮想マシンをサンドボックス化(自由に砂場遊びができる状態) する事ができます。別にセキュリティ的な不安とか関係なく、最初にも書きましたが、仮想マシン上で何かを試したい時に、たとえ環境が壊れても元に戻せば良いという状態にすれば、安心して手軽に仮想マシン上で色々試す事(自由に砂場遊び)ができるようになります。

saharaプラグインをインストールする

これ以降は、VagrantとVirtualBoxをインストールしてある事が前提で説明していきます。

Vagrantでサンドボックスを使うために、saharaというプラグインをインストールしていきます。

最初に自分のPC環境のVagrantのプラグインの一覧を確認してみます。

$ vagrant plugin list
No plugins installed.
私のVagrant環境では、まだ1つもプラグインは入っていません。

それではsaharaプラグインをインストールします。プラグインをインストールするには、vagrant plugin installコマンドを使います。

$ vagrant plugin install sahara
Installing the 'sahara' plugin. This can take a few minutes...
Fetching: open4-1.3.4.gem (100%)
Fetching: Platform-0.4.2.gem (100%)
Fetching: popen4-0.1.2.gem (100%)
Fetching: sahara-0.0.17.gem (100%)
Installed the plugin 'sahara (0.0.17)'!

$ vagrant plugin list
sahara (0.0.17, global)
インストールできました!プラグインの一覧を確認すると、saharaというのが追加されているのがわかります。

ちなみにvagrant pluginとだけ入力してコマンド実行すると、vagrant pluginのサブコマンド一覧についてのヘルプが見れます。

$ vagrant plugin
Usage: vagrant plugin  []

Available subcommands:
     expunge
     install
     license
     list
     repair
     uninstall
     update

For help on any individual command run `vagrant plugin COMMAND -h`

saharaでサンドボックス(sandbox)を試す。コミットとロールバック

saharaをインストールしたので、サンドボックスを試してみます。

現在、何かしらの仮想マシンを起動している状況だとします。

$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

vagrant sandboxとだけ入力して実行すると、sandboxのサブコマンド一覧が見れます(一覧と言っても5つだけですね)。

$ vagrant sandbox
Usage: vagrant sandbox <command> [<args>]

Available subcommands:
     commit
     off
     on
     rollback
     status

For help on any individual command run `vagrant sandbox <command> -h`
サブコマンドstatusで、sandboxの状態がわかります。
$ vagrant sandbox status
[default] Sandbox mode is off
初期状態ではサンドボックスモードはoffです。
サブコマンドonで、サンドボックスモードを開始します。
$ vagrant sandbox on
[default] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
サブコマンドstatusで状態を確認すると、サンドボックスモードがonに変わっていて、サンドボックスモードになっている事がわかります。
$ vagrant sandbox status
[default] Sandbox mode is on

仮想マシンがサンドボックスモードになったので、試しに仮想マシンにログインして少し変更を加えてみます。
仮想マシンにssh接続し、適当なファイルを作成してみます。

$ vagrant ssh
Last login: Wed Jan 13 14:17:09 2021 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.

[vagrant@localhost ~]$ ls
[vagrant@localhost ~]$ echo 'sahara sandbox test' >> hoge.txt 
[vagrant@localhost ~]$ ls
hoge.txt
[vagrant@localhost ~]$ cat hoge.txt 
sahara sandbox test
[vagrant@localhost ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
$ 
仮想マシンにログインしてhoge.txtというファイルを作成し、そのファイルに"sahara sandbox test"と書いておきました。

ここで、ロールバック(rollback)してみます。

$ vagrant sandbox rollback
[default] Rolling back the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

ロールバックしたら仮想マシンに再度ログインし、先程作ったhoge.txtファイルを確認してみます。

$ vagrant ssh
Last login: Wed Jan 13 14:17:09 2021 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.

[vagrant@localhost ~]$ ls
[vagrant@localhost ~]$ cat hoge.txt 
cat: hoge.txt: そのようなファイルやディレクトリはありません
[vagrant@localhost ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
$ 
hoge.txtファイルがなくなっていました。ロールバックした事で、仮想マシンがサンドボックスモードの開始時点の状態に戻ったためです。

今度は、コミット(commit)を試してみます。

$ vagrant ssh
Last login: Wed Jan 13 15:07:20 2021 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.

[vagrant@localhost ~]$ ls
[vagrant@localhost ~]$ echo 'sahara sandbox test' >> hoge.txt 
[vagrant@localhost ~]$ ls
hoge.txt
[vagrant@localhost ~]$ cat hoge.txt 
sahara sandbox test
[vagrant@localhost ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
$ 
ロールバックの時と同じように、仮想マシン上にhoge.txtというファイルを作成し、そのファイルに"sahara sandbox test"と書いておきました。

それでは、コミットします。

$ vagrant sandbox commit
[default] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
コミットしたので、仮想マシンに再度ログインし、先程作ったhoge.txtファイルを確認してみます。
$ vagrant ssh
Last login: Wed Jan 13 15:41:36 2021 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.

[vagrant@localhost ~]$ ls
hoge.txt
[vagrant@localhost ~]$ cat hoge.txt 
sahara sandbox test
[vagrant@localhost ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
$ 
hoge.txtファイルはちゃんと残ったままでした。そして、一度コミットしたのでこの後にロールバックしても、もうこのhoge.txtファイルは残ったままになります。

最後にサンドボックスモードをサブコマンドoffで終了しておきます。

$ vagrant sandbox off
[default] Stopping sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
$ vagrant sandbox status
[default] Sandbox mode is off
サンドボックスモードがoffに戻った事を確認できました。

以上、saharaを使って仮想マシンをサンドボックス化し、ロールバックとコミットの動作確認をしました。操作方法も簡単なので、手軽に試すことができて便利です。

上でコミット(vagrant sandbox commit)やサンドボックスをオフ(vagrant sandbox off)にした時は、仮想マシンが起動状態(runnning)でしました。

上で試した例はhoge.txtというファイルを作成しただけでしたが、重い作業、例えば、Apacheなどのサービスをインストールする時や、yum updateなどでパッケージをアップデートする時に仮想マシンを起動したままコミットやサンドボックスをオフにするのは時間がかかります。ですのでそういう時は、仮想マシンを一時停止状態(saved)や停止状態(poweroff)にしてからコミットやサンドボックスをオフにした方が、早く終わるので良いと思います。

仮想マシンを一時停止状態にするコマンドはvagrant suspend、停止状態にするコマンドはvagrant haltです。

また、ロールバック(vagrant sandbox rollback)は、仮想マシンが起動状態でやっても早く終わります。
というより一時停止状態や停止状態でロールバックを実行すると、下のように、"VBoxManage: error"というメッセージが出ますので、起動状態でロールバックした方が良さそうです。

$ vagrant suspend
==> default: Saving VM state and suspending execution...
$ vagrant status
Current machine states:

default                   saved (virtualbox)

To resume this VM, simply run `vagrant up`.

$ vagrant sandbox rollback
[default] Rolling back the virtual machine...
VBoxManage: error: Machine '8d5d5817-e503-445e-b382-4e183a99150c' is not currently running
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
一時停止状態(saved)でロールバックを実行すると、なんか仮想マシンが起動状態に変わっていますね。
あと、"VBoxManage: error"というメッセージが出ていましたが、ロールバックの実行後に仮想マシンにsshログインして仮想マシン内を確認した感じでは、実際にロールバックはされているようでした。ただ、さっきも言いましたが、ロールバックは仮想マシンが起動状態でやれば良いでしょう。

仮想マシン自体のバックアップを取得する。vagrant packageコマンド

saharaプラグインを使ったサンドボックスモードは、何か仮想マシン上で試す時に失敗してもロールバックで元に戻せるので、気軽に使う事ができて便利です。

またVagrantでは、仮想マシン自体のバックアップも簡単に取る事ができます。仮想マシンのバックアップを取っておけば、これも何か試して失敗してもバックアップがあるので安心です。それに、仮想マシンのバックアップから、新たに仮想マシンを何個でも複製する事ができます。仮想マシンのバックアップ時には、vagrant packageコマンドを使います。

仮想マシンのバックアップ取得と複製方法については別ページで説明していますので、そちらを参考にしてください。
Vagrantで仮想マシンのバックアップ(Box)を取得し、そのBoxから新規に仮想マシンを作る