Win10にvagrantでubuntu仮想環境を設定

開発で主に利用するための仮想環境を構築する。

- ホストOS：Windows10
- ゲストOS：ubuntu 16.04
- vagrantを利用する
- VM内でシンボリックリンクが作成できる
- 仮想環境へはvagrant sshでのアクセスを基本とするが、VirtualBoxを使ってのGUIログインも可能なように構成する

# VirtualBoxのインストール

1. Virtualbox公式サイトからWindows用バイナリをダウンロードしてインストールする。 https://www.virtualbox.org/wiki/Downloads
  現バージョンは5.2.11だった。

# vagrantのインストール
以下からWin用をダウンロードする。
https://www.vagrantup.com/downloads.html

ここでSymantecProtectionから「ファイルの真偽が不明」系の警告が出た...
念のためvagrantダウンロードページに記載されているsha256sumとの一致を確認しておく。

sha256一覧
https://releases.hashicorp.com/vagrant/1.9.5/vagrant_1.9.5_SHA256SUMS?_ga=2.46683300.245237341.1495158313-1358839353.1495157650

ダウンロードしたmsiファイルのsha256確認

```shell-session
$ sha256sum vagrant_1.9.5.msi
8ce945cd01d1273b628aa101e035716c246dfbddad29cccc8d96c873f77d386b  vagrant_1.9.5.msi
```

一致を確認できた。

## vagrantのboxを探す
Atlasから使いたいboxを検索する。Atlasは、vagrantの配布元Hashicorpによるboxの検索サイト。
https://atlas.hashicorp.com/boxes/search
今回はbento/ubuntu-16.04を使うことにした。

bento projectは、Packer(これもHashicorpの製品)を使ってビルドした様々なOSディストリビューションのboxを提供しているプロジェクト。  
bento projectのページ：https://github.com/chef/bento

## VMを作る
VMでの作業用ディレクトリを決め、そこへcdしてからVMを作る。
今回は `c:\vagrants\ubuntu-xenial` とした。  
作成されたVMは基本的にこの作業ディレクトリに紐付けられ、VMを立ち上げたりログインする際は毎回このディレクトリへcdする事になる。  
また一度VMを作成した後で作業ディレクトリを他へ移動するのは面倒なので、~/Download/などの適当なディレクトリにはしないことを推奨する。

```shell-session
cd /c/vagrants/ubuntu-xenial
vagrant init bento/ubuntu-16.04
vagrant up
```

## VMの設定
開発マシンはメモリが16GBあるので、うち12GBをVMのメモリにまわすことにする。
vagrant initで作成されたVagrantfileを書き換え、vb.memoryに12288を割り当てる。

```
...
   config.vm.provider "virtualbox" do |vb|
   ...
     # Customize the amount of memory on the VM:
     vb.memory = "12288"
   end
...
```

また、vagrantではデフォルトでホスト側の作業用ディレクトリ（Vagrantfileを置いたディレクトリ）がゲスト側の /vagrant/ として共有フォルダになっているが、他にも開発用のディレクトリを共有しておきたいので config.vm.synced_folderに 以下の設定を追加する。

```
config.vm.synced_folder "c:/Develop", "/devevlop"
```

設定を適用してVMを再起動する。

```shell-session
$ vagrant reload
```

VM内にログインし、/proc/meminfoを見るなどして適用を確認する。

```shell-session
$ vagrant ssh
$ less /proc/meminfo
```

## VM内でsymlinkを使えるようにする
ホストOSの事情により、初期状態ではVM内でシンボリックリンクを張れないはず。  
VM内でsymlinkを有効にする。  
（参考：https://iworks.cc/archives/57 ）

**管理者権限でのVirtualBox操作のコマンド実行は、場合によってはVMが起動しなくなる可能性もあるので自己責任で実行すること**

Vagrantfileに以下を追記。
`<directory>`はsymlinkを有効化したいディレクトリを指定。

```
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/<directory>", "1"]
end
```

vagrantを起動するターミナルを管理者権限で開いて以下のコマンドを実行する。

```shell-session
$ fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
```

ターミナル（管理者権限）でvagrantを再起動する。  
これで `ln -s` コマンドによるsymlinkの作成が可能になっているはず。

```shell-session
$ vagrant reload --provision
```

### トラブルシューティング
※vagrant reloadの際にVBoxManage.exeが実行できない旨の警告でエラー終了する場合は、ターミナル（管理者権限）で以下を実行しておく。  
`<VM名>`はVirtualBoxのGUIコンソールから確認できる。
おそらく、`ubuntu-xenial_default_<数字>` みたいな名前になっているはず。

```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata <VM名> VBoxInternal2/SharedFoldersEnableSymlinksCreate/<directory>
```

## VMをGUIブート
開発のため、Ubuntu中でEclipseを利用したいのでGUIブートできるようにする。

### ubuntu-desktopのインストール
参考：http://d.hatena.ne.jp/kamicup/20080624/1214322228

まずは以下のコマンドでubuntu-desktopをインストールする。

```shell-session
$ apt-get instsall ubuntu-desktop
```
※ものすごい数の追加ソフトウェアが入るので注意

インストールが完了したら`startx`コマンドでGUIが起動できる。

```shell-session
$ startx
```

この状態で、ホストOSのVirtualBoxを起動する。  
実行中のVMが表示されているはずなので、右クリックで「表示」を選択するとウインドウが開きUbuntuのデスクトップ画面が現れるはず。
でも多分メニューが表示されておらず何もできないのでsshしているターミナルで`shutdown -r now`で再起動する。
これで通常のubuntu-desktopらしい画面が表示される。

#### トラブルシューティング
VirtualBoxで表示されているVMが実行中になっていない場合は、`vagrant up`を行ったユーザーとVirtualBoxを起動しているユーザーが別になっているかもしれない。
管理者権限のターミナルで`vagrant up`を実行したなら、VirtualBoxも管理者権限で実行する必要がある。

### VMのビデオメモリを増やす
初期設定ではVMに割り当てられたビデオメモリは8MBだった。
これだと1920x1080以上のディスプレイサイズでの表示ができなかったので増やしておく。

```
   config.vm.provider "virtualbox" do |vb|
     ...
     # video memory
     vb.customize ["modifyvm", :id, "--vram", "16"]
   end
```

### GUI初期設定
#### 日本語環境
System Setting->Language Supportから日本語をインストールしておく。

設定->テキスト入力の入力ソースに「日本語(mozc)(iBus)」を追加する。

AppleWirelessKeyboardの場合、
mozcのツール->プロパティ->キー設定の選択を編集し、
入力文字なしのHiraganaとMuhenkanにそれぞれIME ONとOFFを割り付けることで「かな」「英数」と同機能になる。

### memo
#### CLIへの切り替え方法のメモ
GUI起動中でもvagrant sshでのログインは可能なので困ることはないが、多分runlevel=2あたりで起動すればCLIオンリーになるのではと思う。（未確認）

#### GUIへの切り替え方法のメモ
vagrantがupになっている状態で、VirtualBoxの管理画面から「表示」を選択する。

また、Vagrantfileで`vb.gui = true`を設定すると、vagrant up時に自動でGUIウインドウを開くようになるが、なぜか共有ディレクトリがマウントされない事があったので自分はこの設定はしていない。