Vagrant 事始め 05 - 共有フォルダを設定する

ローカルマシンと仮想マシン間でファイルを便利にやりとりするために、共有フォルダの設定をします。

## プラグインの確認をする

まずは共有フォルダを利用するのに必要なプラグインが、Vagrant に設定されているかを確認します。

```
> vagrant plugin list
vagrant-vbguest (0.15.1)
```

上記の vagrant-vbguest がない場合は、

```
> vagrant plugin install vagrant-vbguest

Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching: micromachine-2.0.0.gem (100%)
Fetching: vagrant-vbguest-0.15.1.gem (100%)
Installed the plugin 'vagrant-vbguest (0.15.1)'!
```

とコマンドを実行して、vagrant-vbguest をインストールします。インストールが完了したら、ふたたび `vagrant plugin list` を実行して、プラグインがあることを確認します。

そして、vbguest の状態を確認します。

```
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
> vagrant vbguest --status
[default] GuestAdditions 5.2.6 running --- OK.
```

もし、`vagrant vbguest --status` コマンドの結果が

```
> vagrant vbguest --status
[default] No installation found.
```

と表示された場合、vbguest を利用するのに必要なパッケージをインストールします。

```
> vagrant vbguest
```

必要なパッケージのインストールが始まるので、しばし待ちます。

## 共有フォルダの設定

共有フォルダの設定は Vagrantfile に記述します。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  # ローカルマシンの Vagrantfile があるディレクトリ内の data フォルダと
  # 仮想マシン内の /vagrant_data ディレクトリを共有する
  # config.vm.synced_folder {host_path}, {guest_path}, option...
  config.vm.synced_folder "./data", "/vagrant_data"
end
```

|オプション名|型|値|説明|
|:--|:-:|:--|:--|
|create|booleam|true/false|初期値は false<br>true が指定されると、指定されたディレクトリが存在しない場合にディレクトリを作成する|
|disabled|boolean|true/false|true を指定するとディレクトリの共有を停止する|
|group|string|-|ディレクトリの所有グループを指定する<br>初期値は SSH ユーザーが所属するグループ|
|mount_options|array|-|初期値は空配列<br>mount コマンドのオプションを指定|
|owner|string|-|初期値は SSH ユーザー<br>ディレクトリの所有者を指定|
|type|string|指定なし(virtualbox)/nfs/rsync/smb|初期値はvirtualbox<br>nfs などローカルマシンの OS によっては利用できない|
|id|string|-|mount ポイントの名称を指定<br>デフォルトはディレクトリパスのスラッシュをアンダーバーに変換した名称|

ファイルの読み書きが頻繁に発生しない、ファイルの変更の反映速度をシビアに求めない、巨大なサイズのファイルを共有する場合は、共有する type は <font color="red">virtualbox</font> で指定するのが無難です。
(巨大なファイルを rsync で共有する場合、起動に時間がかかるようになります)

### Windows で NFS の共有をする

Windows の場合、共有フォルダのタイプで NFS が指定できません……が、vagrant-winnfsd というプラグインを追加することで対応できます。

```shell-session
> vagrant plugin install vagrant-winnfsd
Installing the 'vagrant-winnfsd' plugin. This can take a few minutes...
Fetching: vagrant-winnfsd-1.4.0.gem (100%)
Installed the plugin 'vagrant-winnfsd (1.4.0)'!
```
```ruby:Vagrantfile
  # 共有フォルダのタイプを nfs にする場合、owner と group は指定できないので注意
  # 次のようにエラーが出る
  # * Shared folders that have NFS enabled do not support owner/group
  config.vm.synced_folder "./data/mysql", "/var/lib/mysql", type: "nfs", nfs_export: true, nfs_version: 3
```

## 共有フォルダの設定例

### virtualbox

```ruby:Vagrantfile
  # Windows で絶対パスで指定するときバックスラッシュはエスケープする必要がある
  config.vm.synced_folder "C:\\Vagrant\\centos7\\public_html", "/vagrant_data", owner: "vagrant", group: "www", type: "virtualbox"
```

* [VirtualBox Shared Folders - Synced Folders](https://www.vagrantup.com/docs/synced-folders/virtualbox.html)

### nfs

```ruby:Vagrantfile
  config.vm.synced_folder "./data", "/vagrant_data", type: "nfs", nfs_export: true, nfs_version: 3
```

* [NFS - Synced Folders](https://www.vagrantup.com/docs/synced-folders/nfs.html#nfs_export)

### rsync

```ruby:Vagrantfile
  config.vm.synced_folder "./data", "/vagrant_data", type: "rsync", rsync__exclude: [".git/"]
```

* [RSync - Synced Folders](https://www.vagrantup.com/docs/synced-folders/rsync.html)

### smb

```ruby:Vagrantfile
  # Windows で利用する場合は PowerShell v3 以上が必須
  config.vm.synced_folder "./data", "/vagrant_data", type: "smb", smb_host: "192.168.0.15", smb_password: hogehoge, smb_username: "fugafuga"
```

* [SMB - Synced Folders](https://www.vagrantup.com/docs/synced-folders/smb.html)