はじめに
Vgrantを使うと簡単にVirtualBoxの仮想環境を作成することができます。サーバー上のLAMP環境をローカルに作成すると簡単にデバッグできるのでとても重宝しています。しかし、簡単なコマンドで環境を構築できるため、VirtualBoxに使っていない環境が残っていて気がついたらハードディスクの大半がVirtualBoxで占められてしまっているということになってしまいます。また大切な仮想環境を誤って削除したりしないように、定期的に外部ドライブにバックアップ取ることも必要です。
Vagrantを使ってローカルに仮想環境をどんどん増やしていった結果、ハードディスクの容量が残りわずかになってしまったので、不要な環境は削除することにしました。今回はその手順を残しておきます。
バックアップする
パッケージ(BOXファイル)を作成する
Vagrant環境のディレクトリ(Vagrantfileが存在するディレクトリ)に移動します。
仮想マシンが起動中であれば、vagrant haltコマンドで停止します。
現在の環境をコピーして新しくBoxを作るには、次のコマンドを利用します。
vagrant package
すると、「package.box」というBOXファイルが作成されます。
または
Vagrant package [VM名] --output パッケージ名
※vm名は「$ vagrant status」で確認できます。このVM名は特に指定していなければ、デフォルト値「default」です。
実際にはこのようにコマンドを打ちます
$ vagrant package default --output centos7dev.box
VM名の取得のコマンドは以下のとおりです。
$Vagrant status
Current machine states:
default poweroff (virtualbox)
The VM is powered off. To restart the VM, simply run `vagrant up`
このように、任意のパッケージ名のBOXファイルを作成することもできます
BOXファイルを保存する
BOXファイルを保存する場合または別のマシンに移動する場合は、先ほど作成したBOXファイルとVagrantfileをセットで移動します。
また、別のマシンで同じ環境を構築する場合は、MACアドレスが固定化されないような対応が必要です。
具体的には、VM 内で下記を実行し、/etc/udev を無効化します。
これを行わないとMACアドレスが固定化されてしまい、別のPCでvagrant upできなくなります。
$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
バックアップとして残しておくのであれば問題ないですが、別のマシンで同じ環境を作成する場合に、これをしておかないとネットワークで問題が生じます。
参考
Vagrantのネットワークが起動しないときは
https://blog.monochromegane.com/blog/2013/04/06/vagrant-network-error/
リストアまたは移動先でVM環境の再構築する
BOXファイルを追加する
vagrantのboxコマンドboxに追加します。
先ほど作成したboxファイルを以下のコマンドで登録します。
vagrant box add [BOX名] ./package.box
boxが追加されたことを確認します。
vagrant box list
Vagrant環境を用意する
新しいフォルダを用意して以下のコマンドにより仮想マシンを作成します。
vagrant init [先ほど登録したBOX名]
このコマンドが正常に終了するとVagrantfileが生成されます
生成されたVagrantfileは以下のように参照するBOX名が設定されます。
config.vm.box = ”[先ほど登録したBOX名]”
※移行元のvagrantfileを編集している場合は、バックアップファイルをもとに修正します。
仮想環境を再構築する
vagrant upコマンドで仮想環境を再構築します。
vagrant up
なお、vagrantfileで設定した共有フォルダ(/vagrant)に入っていたファイルはbox作成時にパッケージングされませんので、先にgithubなどにアップロードして、上記がひと通り終わったとに、インストールするのがよいと思います。
Vagrantで生成された不要な仮想マシンを特定して削除する
VirtuaBoxの仮想マシンを一覧する
まず vagrant global-status で Vagrant で管理されている仮想マシンの一覧を表示します。
vagrant status と異なり、vagrant global-status はどのディレクトリからでも実行でき、ホスト上のすべての Vagrant 環境に関する情報を表示してくれます。
vagrant global-status
id name provider state directory
--------------------------------------------------------------------------
963e6d9 vagrant1 virtualbox running D:/z/vagrant
dd68a71 vagrant2 virtualbox poweroff D:/z/vagrant
The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to
that directory and run Vagrant, or you can use the ID directly
with Vagrant commands from any directory. For example:
VirtuaBoxの不要な仮想マシンを削除する
上記の情報を頼りにして、不要な仮想マシンを削除してしまえば OK です。
vagrant destroy dd68a71
vagrant2: Are you sure you want to destroy the 'vagrant2' VM? [y/N] y
==> vagrant2: Destroying VM and associated drives...
仮想マシン名の代わりに ID を指定すると、どのディレクトリからでも vagrant destroy を実行することができます。
参考
https://maku77.github.io/vagrant/destroy-vm.html
使ってないVagrant Boxを削除する
登録されているBOXを確認する
登録されているBOXを確認するには以下のコマンドを打ちます。
vagrant box list
登録されているBOXが一覧表示されます
# CentOS7 (virtualbox, 0)
# centos64 (virtualbox, 0)
# chef/centos-6.5 (virtualbox, 1.0.0)
使用されているBOXはVagrantfileに定義されていますので、使っていないと思われるBOX名は以下のコマンドで確実に使っていないことを確認してから削除します。
find . -name 'Vagrantfile' | xargs grep [BOX名]
登録されているBOXを削除する
使っていないことが確認できれば以下のコマンドで登録済みのBOXを削除します。
vagrant box remove [BOX名]
参考
https://qiita.com/mochizukikotaro/items/52f4434c3f69c4ba1f54
一時ファイルを削除する
一時ファイル用フォルダを確認する
Windowsのユーザフォルダの配下に存在するVagrant用フォルダ「.vagrant.d」の直下に「tmp」フォルダが一時ファイルを格納する場所として用意されています。このフォルダにはboxを追加するときなどダウンロード時に一時的にファイルを作成する場所として使われています。
したがって、Vagrantを起動しているとき以外にファイルが残っている場合は、削除しても問題ありません。
cd C:\Users\[各ユーザのフォルダ]\.vagrant.d\tmp
参考
ボックスファイルのダウンロードに失敗したものが
保存されているとのことでした。
https://code.i-harness.com/ja/q/9af6bc
一時ファイルを削除する
Windowsのコマンドプロンプトからrmdirコマンドで全て削除したいところですが、このようなエラーが発生して削除できませんでした。
「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」
rmdirコマンドはワイルドカードには対応していないようです。(昔のOSではできていたのですが)
rmdir /s *
そこで、現在のディレクトリ配下のディレクトリを一括して削除する場合は、コマンドラインからfor文を使用してrmdirコマンドを繰り返し実行することで削除します。
以下がそのコマンドです。
for /F %a in ('dir /ad /b /w *') do rmdir /S /q %a
この一時フォルダにファイルが残っていると、 SSL_ERROR_SYSCALL, errno 60エラーが発生してVagrantのダウンロードができなくなることもあるそうです。
不要なファイルが残っている場合はこまめに消したほうが良さそうです。
最後に
Vagrantで作成したVM環境をメンテナンスする方法を書いてみました。
バックアップする方法としてパッケージ機能を使用しましたが、Vagrantの機能の一つにスナップショットというものがあって、それを使用するとスナップショットを実行した時点の環境が保存されるようです。また別の機会に紹介したいと思います。
参考
https://weblabo.oscasierra.net/vagrant-snapshot/