"vagrant up"時に"Segmentation fault"が発生するようになったので調査

- 今後の障害調査時に使えそうな情報なので自分用にメモ

# 概要
- `vagrant up` 後 1度正常に起動するが `vagrant halt`などで一度仮想マシンの停止後に再度`vagrant up`すると、共有フォルダのマウント処理で`Segmentation Fault`が発生して起動に失敗するようになった
- ググっても同じような事象は見受けられなかったので、所詮`おま環`の問題という できれば会いたくない障害でかなりの時間を浪費しました。

# 環境
- ホストOS ： windows10home 1709(16299.64) ※ `winver`で確認
- プロバイダ: Virtualbox 5.2.0 r118431(Qt5.6.2) + 拡張パック(5.2.0 r118431)
- Vagrant : 2.0.1
- Vagrant plugin :

 ```
$ vagrant plugin list
vagrant-cachier (1.2.1)
vagrant-hostsupdater (1.0.2)
  - Version Constraint: > 0
vagrant-ignition (0.0.3)
  - Version Constraint: > 0
vagrant-share (1.1.9, system)
  - Version Constraint: > 0
vagrant-vbguest (0.15.0)
  - Version Constraint: > 0
```
- コンソール : git for windowsに付属の git bash コンソールで作業

# 状況
- おなじみ `vagrant up` で仮想マシンを起動すると見慣れない`Segmentation fault`のエラーが発生。ホストを再起動などしても変わらず。

```起動コマンド
$ vagrant up
Bringing machine 'develop.vm' up with 'virtualbox' provider...
==> develop.vm: Checking if box 'minimal/centos7' is up to date...
==> develop.vm: Fixed port collision for 22 => 2222. Now on port 2200.
Segmentation fault
```
`Segmentation fault` だけ表示されても何かわからん！

# Vagrantのデバッグ情報を出力させる
- `VAGRANT_LOG=DEBUG` をvagrantコマンドの前に付与するとデバッグ情報を見れる
- `vagrant --debug` でもいけた

```デバッグコマンド
$ VAGRANT_LOG=DEBUG vagrant up
~ 
いろいろログが流れて最終的に下記の箇所で停止する
~
DEBUG subprocess: Waiting for process to exit. Remaining to timeout: 32000
DEBUG subprocess: Exit status: 0
 INFO warden: Calling IN action: #<Vagrant::Action::Builtin::SyncedFolders:0x00000000075b3860>
 INFO synced_folders: SyncedFolders loading from cache: false
 INFO synced_folders: Synced Folder Implementation: virtualbox
 INFO synced_folders:   - /vagrant: . => /vagrant
 INFO synced_folders:   - vagrant-cache: C:/Users/name/.vagrant.d/cache/minimal/centos7 => /tmp/vagrant-cache
Segmentation fault
```

- `up`だけでなく`destroy`や`status`など他のVagrantの操作コマンド全般でも同様に詳細なデバッグ情報を見れる。手がかりが何もない状況よりかなり助かる。

# 対応など検討
- 最初はPluginが何か かち合ってるのか？とも思ったが、手元の環境では Segmentation Faultが出ると必ずこのマウントの部分で止まっている事を確認できた。
- これまで自分の環境では出ていなかったが、昔から言われている Windows＋VirtualBOX＋Vagrant でのファイル共有問題が顕在化したと思われる。
- 最近 Virtualbox と Vagrant周りのアップデートを行ったり、ホスト側のWindowsアップデートも日々行われるのでその辺の組み合わせが原因の可能性は充分ある
- Vagrantではホストゲスト間のマウントは NFSで行うのがベストプラクティスらしい。
- ホストが WindowsなのでNFS実装は難しいため vagrant プラグイン `vagrant-winnfsd` : https://github.com/winnfsd/vagrant-winnfsd の導入など検討。
- もしくは取り急ぎは Virtualbox とVagrant のバージョンをデグレードもして検証 といったあたりだろうか・・・

# 解決
- 最終的にVirtualBOX（拡張含む) とVagrantをデグレ＋`vagrant-winnfsd`プラグインの導入で手前の環境は安定したのでしばらくこのまま使う事で解決としました。
- VirtualBOX → 5.1.30
- Vagrant → 1.9.8
- 最新版へのアップグレードは近い将来にまた挑戦したいとは思います。

# Vagrantプラグイン `vagrant-winnfsd`の使い方
- 公式に従います : https://github.com/winnfsd/vagrant-winnfsd
- `vagrant plugin install vagrant-winnfsd`
- Vagrantfile へ下記を追記。

```
if Vagrant.has_plugin?("vagrant-winnfsd")
  config.winnfsd.uid = 500
  config.winnfsd.gid = 500
end
config.vm.synced_folder ".", "/vagrant", type: "nfs"
```
- ちなみに UID/GIDは私がよく使っているBOXである bento のゲストOS環境では、vagrantのUID/GIDが 500だったので500にしています。使うBOXにより違いがあるかと思います。

## 追記

- インストールされている vagrant本体 と Vagrantプラグインのバージョンが食い違っていてもエラーになることがあるようだったので下記でプラグインの更新も試す。

```
vagrant plugin update
```

- もしくは プラグイン入れなおすのも試してみる

```
vagrant plugin expunge --reinstall
```

# その他
- Vagrant＋Virtualbox＋Windowsのファイル共有は Virtualbox本体と VirtualBox Extension PackとVagrantのバージョンの組み合わせでいろいろ面倒な気配がするので、今回の `vagrant-winnfsd` を使う事で共有機能に関してはもろもろのしがらみから解放されることになり幸せになれたのかもしれない。
- Vagrant＋VirtualBOXでも Linux/macOS環境で開発する方が安定するのかなー:weary:

# 参考
- https://qiita.com/Ping/items/9bc6e4492b22d1ff2db4
- https://www.vagrantup.com/docs/synced-folders/nfs.html
- https://github.com/winnfsd/vagrant-winnfsd
- https://blog.hiratama.net/windows%E3%81%A7vagrant%E4%BD%BF%E3%81%86%E3%81%AA%E3%82%89vagrant-winnfsd%E3%82%92%E5%85%A5%E3%82%8C%E3%81%9F%E6%96%B9%E3%81%8C%E3%82%88%E3%81%84/