Vagrant + VirtualBoxで最初にハマったところ

# Vagrantを使ってVirtualBoxのVM(Box)を立ち上げようとした時のメモ
エラーが出てネットでいろいろ検索したけれど、なかなか解決方法が見つからなかったため、同じような状況になって困っている人の助け(自分の備忘録も含め)になれば幸いです。

# 環境
本体 : VAIO VJZ13B1
ホストOS : Windows10 Pro 1709
Vagrant : 2.0.2 64bit
VirtualBox : 5.2.6 64bit

# ハマったところまでの手順
1.Vagrantの[**ダウンロード**](https://www.vagrantup.com/downloads.html)
![Vagrantのダウンロード](https://qiita-image-store.s3.amazonaws.com/0/238610/6bfbdaed-f05c-65c2-08b1-8c93bb80efb2.png "Vagrantのダウンロード画面")

2.VirtualBoxの[**ダウンロード**](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)
![VirtualBox本体のダウンロード画面](https://qiita-image-store.s3.amazonaws.com/0/238610/fc322a54-d944-5e34-64e3-76b69fc43f8a.png "VirtualBox本体のダウンロード画面")
そのまま下にスクロールしてVirtualBox Extension Packもダウンロードする
![VirtualBox Extension Packのダウンロード画面](https://qiita-image-store.s3.amazonaws.com/0/238610/42e634d9-8148-3547-4315-cef9ad6f238e.png "VirtualBox Extension Packのダウンロード画面")

3.Vagrantのインストール
ダウンロードしたmsiファイルを開き、インストールします。インストールフォルダは必要に応じて適宜変更してください。

4.VirtualBoxのインストール
ダウンロードしたVirtualBox本体のexeファイルを開き、インストールします。こちらについても、インストールフォルダは必要に応じて適宜変更してください。
次にVirtualBox Extension Packはvbox-extpackファイルをダブルクリックして開くことでインストールが完了します。

※ VagrantとVirtualBoxはどちらを先にインストールしても大丈夫です。(VagrantはVirtualBoxのインターフェースをキックして動かしているだけなので、ソフトウェアとしては物理的に独立しています。もちろん、実装面で言えば、VagrantはVirtualBoxのインターフェースをキックする部分は内包している訳ですが。よくVagrantはVirtualBoxのフロントエンドとして動作すると言われる所以です)

5.ダウンロードするBoxの情報を調べる
[Vagrant Cloud](https://app.vagrantup.com/boxes/search)
Providerのvirtualboxをクリックして絞り込む
![Boxの検索画面](https://qiita-image-store.s3.amazonaws.com/0/238610/ee79ff23-f395-eae3-9d87-13f71f39b538.png "Boxの検索画面")

ダウンロードしたいBoxをクリックする
![Boxの詳細情報を開く](https://qiita-image-store.s3.amazonaws.com/0/238610/6239f186-8ba4-f580-cfea-c091bdfbe5d9.png "Boxの詳細情報を開く")

囲ってある部分がBox名
![Box名を調べる](https://qiita-image-store.s3.amazonaws.com/0/238610/0e495b42-6f6a-9768-43f8-dc4221b37439.png "Box名を調べる")

6.Vagrantfileを生成するフォルダを作る
わかり易い名前で適当なフォルダを作ってください。後々のことを考えて２階層ぐらいにしておくと後から管理がしやすいです。(ゲストOSとホストOSでファイルを同期するためのフォルダを作る場合、デフォルトではホストOSのVagrantfileのあるフォルダの１階層上にdataフォルダを作るため。ただし、同期フォルダの作る位置を変更した場合はこの限りではありません)

7.コマンドプロンプトから6で作ったVagrantfileを生成するフォルダに移動する

```
cd {フォルダのパス}
```

8.Boxをダウンロード(VirtualBoxへ追加)する
BoxファイルのURLは[こちら](http://www.vagrantbox.es/)より調べられます

```
vagrant box add {Box名(変更可)} {URL}
vagrant init {Box名}
```
Box名を変更しない場合、1行目の"vagrant box add"の行(Boxファイルのダウンロード)は省略可能です。1行目を省略した場合、2行目でBoxファイルのダウンロードとVagrantfileの生成が併せて行われます。

Vagrant init の実行
Boxは"bento/ubuntu-16.04"を指定しています

```
C:\Vagrant\Ubuntu16.04>vagrant init bento/ubuntu-16.04
```

このように表示されれば、Vagrantfileは正常に生成されています。

```
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.
```

9.Vagrantfileの編集

プライベートネットワークを有効にする場合

```
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
        ↓ #を取り設定を有効にする
  config.vm.network "private_network", ip: "192.168.33.10"
```

IPアドレスのセグメントはホストOSと被らないようにしないとエラーになってハマります。
(VMのIPアドレスで直に外部のネットワークと通信するわけではなく、ホストOSのネットワークを介して外部ネットワークと通信するため)

10.VMの起動

```
C:\Vagrant\Ubuntu16.04>vagrant up
```

ここでハマりました

これがエラーメッセージ

```
C:/HashiCorp/Vagrant/embedded/gems/gems/childprocess-0.6.3/lib/childprocess/windows/process_builder.rb:43:in `join': incompatible character encodings: Windows-31J and UTF-8 (Encoding::CompatibilityError)
```

Encoding::CompatibilityErrorとあるように、文字のエンコードに問題があることはすぐ解ったのですが・・・

最初、Windows固有の問題だと思い、そういったキーワードで探した情報を見て解決を図るも、解決できず。

最終的に原因は解ったのですが、何が問題だったかというと、Windowsのユーザー名が英字表記ではなく、漢字を使っていたことが原因でした。

というのも、WindowsのVagrantはBoxファイルを以下のフォルダに保存しており、Vagrant up時にマルチバイトコードの含まれたパスを参照しに行って、エラーになっていたというわけです。

```
C:\Users\{Windowsのユーザー名}\.vagrant.d
```

# 解決方法
英字のWindowsユーザーを新たに作成し、そのユーザーでログオンし直してVagrant initおよびVagrant upすれば、あっさりVMが起動できてしまいます。

# 感想
原因がわかるまで結構悩んでしまいました。
わかってしまえばどうということない原因なんですけどね。
OSレベルでUTF-8が標準になってきているのだから、ソフトウェア側でそれぐらい対応しておいてほしいな～と思う次第です。