ブログ技術

【Vagrant】ローカルに作成した環境を整理する

はじめに

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/