Vagrantで何かを試す前に仮想マシンのバックアップを取りたい時があります。ここでは、自分が使っている仮想マシンのバックアップ(Box)を取得し、そのBoxを複製(コピー)して新規に仮想マシンを作成するまでの説明をしています。仮想マシンをBox化する時には、vagrant packageコマンドを使います。
※ 本ページはプロモーションが含まれています。
Vagrantで仮想マシンを使っている時に、仮想マシンのバックアップをとっておきたいと思う事があると思います。例えば、何かを試したいけど仮想マシンの環境が壊れるかもしれないという心配がある時、また定期バックアップをとりたい時などです。
ここでは、Vagrantで自分が使っている仮想マシンのバックアップ(Box、テンプレート)を取得し、そのBoxから仮想マシンを新規に複製(コピー)して起動するまでをやっていきます。仮想マシンをBox化する時には、vagrant packageコマンドを使います。
◾️環境は以下の通りです。
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
これ以降は、VagrantとVirtualBoxをインストールしてある事が前提で説明していきます。
現在、私の環境のBoxの一覧は以下のようになっています。
$ vagrant box list
bento/centos-6.7 (virtualbox, 2.2.3)
bento/centos-6.8 (virtualbox, 2.3.4)
centos-7.1 (virtualbox, 0)
centos64 (virtualbox, 0)
debian-7.4_c64 (virtualbox, 0)
precise32 (virtualbox, 0)
Boxの一覧は下のディレクトリでも見れます。
$ ls ~/.vagrant.d/boxes
bento-VAGRANTSLASH-centos-6.7 centos-7.1 debian-7.4_c64
bento-VAGRANTSLASH-centos-6.8 centos64 precise32
バックアップを取りたい仮想マシンは停止しておきます。
$ vagrant status
Current machine states:
default poweroff (virtualbox)
The VM is powered off. To restart the VM, simply run `vagrant up`
そして、Vagrantfileがあるディレクトリ内で、vagrant packageコマンドを実行し、バックアップを取りたい仮想マシンのBoxを作ります
(tmp-centos7.1.boxは任意の名前です)。
$ vagrant package --output tmp-centos7.1.box
==> default: Exporting VM...
==> default: Compressing package to: /Users/◯◯/MyVagrant/tmp/tmp-centos7.1.box
$ ls
Vagrantfile tmp-centos7.1.box
tmp-centos7.1.boxというBoxファイルがエクスポートされました。
次に、今作ったBoxファイルをbox addコマンドでbox一覧に追加します(addのあとのtmp-centos7.1は任意の名前で、これがBox名になります)。
$ vagrant box add tmp-centos7.1 tmp-centos7.1.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'tmp-centos7.1' (v0) for provider:
box: Unpacking necessary files from: file:///Users/◯◯/MyVagrant/tmp/tmp-centos7.1.box
==> box: Successfully added box 'tmp-centos7.1' (v0) for 'virtualbox'!
できました。vagrant box listで、追加されたかを確認します。
$ vagrant box list
bento/centos-6.7 (virtualbox, 2.2.3)
bento/centos-6.8 (virtualbox, 2.3.4)
centos-7.1 (virtualbox, 0)
centos64 (virtualbox, 0)
debian-7.4_c64 (virtualbox, 0)
precise32 (virtualbox, 0)
tmp-centos7.1 (virtualbox, 0)
tmp-centos7.1が追加されていますね。
また、~/.vagrant.d/boxesディレクトリ内にもtmp-centos7.1が追加されています。
$ ls ~/.vagrant.d/boxes
bento-VAGRANTSLASH-centos-6.7 centos-7.1 debian-7.4_c64 tmp-centos7.1
bento-VAGRANTSLASH-centos-6.8 centos64 precise32
ここまでやれば、最初に作ったBoxファイルはもう必要ないので削除します。
$ rm tmp-centos7.1.box
あとはもうtmp-centos7.1を使えるはずです。このBoxから仮想マシンが作れるはずです。
試しに、適当なディレクトリを作成し、そこでtmp-centos7.1から仮想マシンを作り、起動までをやってみます。
$ mkdir ~/MyVagrant/tmp2
$ cd ~/MyVagrant/tmp2
$ vagrant init tmp-centos7.1
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'tmp-centos7.1'...
〜
起動までできました!このあと、vagrant sshで接続して仮想マシンの中を確認してみましたが、バックアップを取得した仮想マシンと同じ状態だったので問題ないと思います。
時々ですが、バックアップで追加したBoxから新たなVM(仮想マシン)を作ろうして、vagrant upコマンドを実行した時に、「Vagrant was unable to mount VirtualBox shared folders.〜」というエラーメッセージが出て、ホストマシンと仮想マシンの共有ディレクトリがマウントされずに機能しない問題が発生しました。(仮想マシン自体は起動してssh接続できる。)
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
〜
==> default: Mounting shared folders...
default: /vagrant => /Users/hogeuser/testBox
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available.
〜
このエラー解決方法については別ページで説明しているので、もし同じ問題が発生した場合は参考にしてください。
vagrant up実行時に共有フォルダを使えないエラー発生と、プラグインで解決したら起動が遅い問題
以上で仮想マシンのバックアップ(Box)取得と複製の説明は終わりです。
最後にBoxを削除したい場合、vagrant box removeでできます。
$ vagrant box remove tmp-centos7.1
Removing box 'tmp-centos7.1' (v0) with provider 'virtualbox'...
$ vagrant box list
bento/centos-6.7 (virtualbox, 2.2.3)
bento/centos-6.8 (virtualbox, 2.3.4)
centos-7.1 (virtualbox, 0)
centos64 (virtualbox, 0)
debian-7.4_c64 (virtualbox, 0)
precise32 (virtualbox, 0)
$ vagrant ~/.vagrant.d/boxes
bento-VAGRANTSLASH-centos-6.7 centos-7.1 debian-7.4_c64
bento-VAGRANTSLASH-centos-6.8 centos64 precise32
tmp-centos7.1がBoxの一覧から削除されています。
私のVagrant環境で仮想マシンのBoxを取得し、そのBoxから新たに仮想マシンを複製する事を何度か試しましたが、完全に複製するには少し注意点がありました。
まず、取得したBoxからvagrant initコマンドを実行した時に作成されるVagrantfileの内容まではコピーされませんでした。ですので、複製元のVagrantfile内のconfig.vm.networkやconfig.vm.synced_folderを編集していたなら、複製先のVagrantfileも編集し直す必要があります。
あと、Vagrantfileでconfig.vm.synced_folderを設定してホスト側(自分のPC)とゲスト側(仮想マシン)で共有ディレクトリを設定している場合、仮想マシンを複製してもゲスト側のディレクトリはコピーされないため、ホスト側(自分のPC)でディレクトリをコピーし直す必要がありました。
以上簡単でしたが、仮想マシンのバックアップ(Box)を取得して、そのBoxから仮想マシンを複製する方法について説明しました。これでバックアップを取っておけば、仮想マシン上で安心して何か作業を試す事ができます。
また別の方法で、Vagrantにはsaharaというプラグインがあります。saharaを使えば 仮想マシンをサンドボックス化できます。サンドボックス化すれば、仮想マシン上で何か作業をしていて環境が壊れてしまった時に、元の状態に戻す事が可能です。ですのでこの方法でも、仮想マシン上で気軽に何かを試す事ができるようになります。
saharaのインストールと使い方については別ページで説明していますので、そちらを参考にしてください。
Vagrantでsaharaで仮想マシンをサンドボックス化(sandbox)し、作業前に戻せるようにする