Vagrantを使って仮想マシンを楽に構築する

気になるLinuxを試しに使ってみたい時はVirtualBoxなどの仮想マシンを使うと思います。実験とか一時的な環境であればそれで十分ですが、何かソフトウェアの実行環境、または開発環境として仮想マシンを使う場合は環境構築にかかる作業が手間に感じる時があります

ある程度手を付けて環境が汚れてきて初期状態に戻したい時や、別の環境を用意したくなった時にVagrantを使えば環境構築の手順を自動的に進めることができるので、手間を省くことができます

# install

以下のURLからVagrantとVirtual Boxのそれぞれのパッケージをダウンロードしてインストールします

* Vagrant
  * https://www.vagrantup.com/
* VirtualBox
  * https://www.virtualbox.org/

# Boxを選ぶ

Vagrant Cloudのサイトから欲しいOSのイメージ(BOX)を探します

https://app.vagrantup.com/boxes/search

色々な人が作っているBoxがあって良し悪しがありますが、以下の物を選ぶと安心でしょう

* hashicorp (Vagrantの公開元)
* bento(Chef社)

# init

公開されているイメージを自分のPCにダウンロードして、仮想マシンの初期化をします。Vatrant Cloudで見つけたBoxの名前を `vagrant init` コマンドに指定して実行します

ターミナル(Windowsの場合はPowerShell)を開いてコマンドを実行します

```shell-session:イメージのダウンロードと初期化
# 実行前に作業ディレクトリを作り、その中で作業します
> mkdir vagrant
> cd vagrant

# 例として Ubuntu/xenial をダウンロードします
> vagrant init ubuntu/xenial64
```

実行した場所にVagrantfileが作られます

```shell-session:実行結果
> vagrant init ubuntu/xenial64
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.
```

## Vagrantfileの編集

必要に応じて用意したい仮想マシンの設定したい時は、生成されたVagrantfileを編集します。変更を間違えて初期状態に戻したい時はVagrantfileを削除して、再度 `vagrant init <Box名>` を実行すればやり直せます

Vagrantfileの詳しい説明については <https://www.vagrantup.com/docs/vagrantfile> をご参照ください。大体の項目はVirtualBoxの設定操作に紐づいていますので、必要な所は感覚的に分かると思います

変更したVagrantfileを適用するには `--provision` オプションを指定して実行します

```shell-session
# 仮想マシンが起動していない場合
> vagrant up --provision

# 起動中の仮想マシンを再起動させて適用する場合
> vagrant reload --provision
```

# 起動

Vagrantfileのあるディレクトリ内で `vagrant up` を実行します

```shell-session
> vagrant up

# 複数の仮想マシンがインストールされている場合は `--provider` オプションで明示して実行します
> vagrant up --provider virtualbox
```

# ssh

起動した仮想マシンのシェルを操作するには `vagrant ssh` を実行します

```shell-session
> vagrant ssh
```

ポートフォワーディングの設定をした場合は2222番ポート(デフォルト状態)に接続すればssh接続で操作することもできます。以下でログインできます

* ユーザー名: vagrant
* パスワード: vagrant

# 停止

起動した仮想マシンを停止するには、Vagrantfileのあるディレクトリ内で `vagrant halt` を実行します

```shell-session
> vagrant halt
```

# その他のコマンド

よく使用するコマンドをまとめました

| コマンド | 動作 | メモ |
|---------|------|------|
| vagrant box add <Box名, URL, or path>	| Boxをダウンロードします ||
| vagrant box remove <Box名> | ダウンロードしたBoxを削除します ||
| vagrant box list | ダウンロードしたBoxの一覧を表示します ||
| vagrant init <Box名, URL> | 仮想マシンの初期化 | 実行したディレクトリにVagrantfileが作成されます |
| vagrant ssh | 起動した仮想マシンのsshシェルを開きます | Vagrantfileのあるディレクトリで実行します |
| vagrant up | 仮想マシンを起動します | Vagrantfileのあるディレクトリで実行します |	
| vagrant halt | 仮想マシンを停止します | Vagrantfileのあるディレクトリで実行します |
| vagrant reload | 仮想マシンを再起動します | Vagrantfileのあるディレクトリで実行します |
| vagrant destroy | 仮想マシン削除 | Vagrantfileのあるディレクトリで実行します |
| vagrant package | 仮想マシンをパッケージング(Box形式で出力)します ||

# tips

## ファイルの保存先

通常は上記の `vagrant` コマンドで削除すればいいですが、Vagrantをアンインストールしてしまった時は以下の場所を開いて、ファイルを削除すればいいです

### ダウンロードしたBox

```
~/.vagrant.d/boxes
```

`~` はユーザーのホームディレクトリ(Windowsならば `C:\users\ユーザー名` )です

### 仮想マシンの関連ファイル

```
~/VirtualBox VMs
```

## Guest Additionsのバージョンを上げる

仮想マシンにインストールされているAdditionsのバージョンが古いなどで上手く動かない場合は以下のコマンドでバージョンを上げることができます

```shell-session
> vagrant plugin install vagrant-vbguest
```

## 双方向に読み書きできる共有フォルダーを作る

Vagrantfile に以下の記述を追加します。上記の手順でGuest Additionsを最新にするとトラブルは少ないと思います

```
config.vm.synced_folder "./output", "/vagrant/output", type:"virtualbox"
```