Vagrantのインストール（Windows編）

#インストールするもの

Vagrantを動作させるのに必要なものをインストールします。 
具体的には以下をインストールします。 

- VirtualBox
- Vagrant
- OpenSSH
- rsync

※この記事では64ビット版Windowsを前提としています。

##VirtualBoxのインストール

[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)
から「Windows hosts」のリンクをクリックし、ファイルをダウンロード、実行してインストールします。

##Vagrantのインストール

[https://www.vagrantup.com/downloads.html](https://www.vagrantup.com/downloads.html)
からWindowsのリンクをクリックし、ファイルをダウンロード、実行してインストールします。

##ssh,rsyncインストール

Windows用のOpenSSH,rsyncを探すと、バージョンが古いことがあるため何からのパッケージ管理ツールからの導入がおすすめです。 
MSYS2やCygwinを導入済みであればこれらのパッケージ管理からインストールします。
このようなパッケージ管理を導入していない場合は、[scoop](http://scoop.sh/)がおすすめです。
各パッケージ管理ツールでの導入方法を説明します。

###MSYS2

導入やパッケージ管理については他の記事を参考にしてください。

- [MSYS2で快適なターミナル生活](http://qiita.com/Ted-HM/items/4f2feb9fdacb6c72083c)
- [MSYS2における正しいパッケージの更新方法](http://qiita.com/k-takata/items/373ec7f23d5d7541f982)

次のコマンドでOpenSSH,rsyncをインストールします。
`pacman -S openssh rsync`

MSYS2のシェルからはvagrantが見えないため、`C:\HashiCorp\Vagrant\bin`を環境変数に追加するか、Windowsの環境変数を継承するようにします。次の記事を参考にしてください。

- [MSYS2設定ファイルを弄る](http://qiita.com/u1and0/items/b4c3217868cf8bafb085)
- [MSYS2小ネタ集](http://qiita.com/ubnt_intrepid/items/0d9ea1c792dd2049d71c)

###Cygwin

[https://cygwin.com/](https://cygwin.com/)
からsetup-x86_64.exeのリンクをクリックし、ファイルをダウンロード、実行します。

Root Directoryは
`C:\cygwin64`
を指定します。
Download Siteはなるべく日本のサーバ（～.jp）を選択します。

Select Packages画面でインストールするパッケージを選択します。
Searchに入力して検索し、目的のパッケージのBinにチェックを入れ、「次へ」をクリックするとインストールされます。

次のパッケージを選択します。

- openssh
- rsync

インストール後に環境変数PATHに追加します。
`C:\cygwin64\bin`
Windowsを再起動します。


###scoop

scoopの説明、導入については他の記事を参考にしてください。

- [Scoopで作るLinux on Windows開発環境](http://qiita.com/dozo/items/a6f63aa1b03d1773b8ec)
- [Windows用のコマンドラインインストーラScoop](http://qiita.com/iakio/items/78e7f098047ea0a47d70)

次のコマンドでOpenSSH,rsyncをインストールします。
`scoop install openssh rsync`

**※2017年9月15日現在では、`scoop install openssh`でインストールされるバージョンがとても古くなっています。**
[New OpenSSH 7.1p1 does not work in PowerShell #638](https://github.com/lukesampson/scoop/issues/638)
代わりにwin32-openssh（`scoop install win32-openssh`）をインストールするか
gitも使う場合はgit-with-openssh（`scoop install git-with-openssh`）をインストールします。
※opensshからgit-with-opensshに乗り換えて、gitコマンドで`error: cannot spawn C:\Users\name\scoop\apps\openssh\current\bin\ssh.exe: No such file or directory`というエラーが出る場合は環境変数GIT_SSHを削除します。


#インストールの確認

コマンドプロンプトでバージョンを確認する以下のコマンドを実行します。

`vagrant --version` 
`ssh -V` 
`rsync --version` 

次のような表示が得られます。

>Vagrant 2.0.0 
>OpenSSH_7.5p1, OpenSSL 1.0.2k  26 Jan 2017 
>rsync  version 3.1.2  protocol version 31 


#トラブルシューティング

## Vagrant 1.9.4

### vagrant up でErrno::ECONNABORTEDが発生する

[Vagrant up forces shutdown of VM #8520](https://github.com/mitchellh/vagrant/issues/8520)

リンク先の通りに3つのファイルを置き換えると解消されます。

- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/templates/locales/en.yml
- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/errors.rb
- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/plugins/communicators/ssh/communicator.rb

## Vagrant 1.9.3

### vagrant up でエラーが発生する

ポートマッピング設定を行っているとエラーが発生し、起動に失敗します。

対策としては、Vagrant 1.9.2に戻すか、ポートマッピング設定にhost_ipを追加します。

例えば、次のようなポートマッピング設定に
`config.vm.network "forwarded_port", guest: 8080, host: 8080`
次のようにhost_ipの記述を追加します。
`config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1"`

参考：[vagrant up fail in 1.9.3 on windows10](https://github.com/mitchellh/vagrant/issues/8395)

## rsyncでのエラー

### undefined method `gsub!' for nil:NilClass (NoMethodError)

Vagrant 2.0.0で発生。
[Split out cygwin path and ensure bin exists #8972
](https://github.com/hashicorp/vagrant/pull/8972)
このC:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-2.0.0\lib\vagrant\util\platform.rbへのパッチを適用する。

### rsync: change_dir "/c/path/to/project" failed: No such file or directory (2).

`vagrant up` や `vagrant rsync` を実行するとエラーが発生する。 
[Windows + vagrant 1.8.1 + rsync 3.1.1 で発生する、config.vm.synced_folderの失敗の直し方](http://qiita.com/ndxbn/items/0c4f3b382ce9de2893cb)


### UndefinedConversionError

io.rb:32:in `encode': "xxx" from Windows-31J to UTF-8 (Encoding::UndefinedConversionError) 
[Windows + Vagrant + Rails の比較的快適な環境を作る](http://mikazuki.hatenablog.jp/entry/2015/07/25/Windows_%2B_Vagrant_%2B_Rails_%E3%81%AE%E6%AF%94%E8%BC%83%E7%9A%84%E5%BF%AB%E9%81%A9%E3%81%AA%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%82%8B) 
io.rbを書き換えます。