Vagrant で Windows もゲストOSに

基本的に [Vagrant で作ったり壊したりできる Windows 環境を手に入れるまでの手順 - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2014/02/20/vagrant-win-guest/) の情報通りにやれば構築できます。
ただ、いくつか追加で手順が必要です。

試してみた環境は以下の通り。

* ホストOS：Windows 8.1 Pro(x64)
* ゲストOS：Windows 7 Professional with SP1(x86)
* ゲストOS：Windows 8.1 Pro(x86)

構築したときの作業ログは [こちら](https://github.com/toruuetani/my-vagrant-windows-log)

# 環境構築
せっかくなので必要なソフトは [Chocolatey](http://chocolatey.org/) でインストールしてみましょう。

chocolatey のインストールは管理者権限でコマンドプロンプトを起動して以下のコマンドを実行するだけ。
インストール完了後続けて `cinst` するとエラーになることがあるので、コマンドプロンプトは一旦終了させておきましょう。

```bat
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

chocolatery を使うと VirtualBox, Vagrant のインストールはこれだけです。

```bat
cinst VirtualBox
cinst Vagrant
```

chocolatey が `PATH` 環境変数をセットしてくれるんですが、 VirtualBox は正しくセットしてくれません。
なので `C:\Program Files\Oracle\VirtualBox` をセットしなおしましょう。

次に Vagrant で Windows を扱えるように SSH の代わりに WinRM を使用するプラグイン Vagrant-Windows をインストールします。なお、プロキシ環境下の場合は `HTTP_PROXY` をセットしておく必要があります。

```
vagrant plugin install vagrant-windows
```

2014/06/28 追記
上記作業は Vagrant 1.5.x で必要です。 Vagrant 1.6 からゲストWindowsをサポートしているため、 Vagrant-Windows は不要です。

# 仮想イメージの作成
これは参考URLの手順に従いましょう。

1. VirtualBox を起動します。
2. メニューから [仮想マシン] > [新規] を選択します。
3. 名前に [Win7SP1x86] と入力します。これはあとで使うので、分かりやすい名前を付けます。
4. メモリーは 1024MB 、 HDD容量は 25GB の可変とします。
5. [オーディオ] と [USB] を無効化します。
6. [ストレージ]に ISO イメージを指定します。
7. メニューから [仮想マシン] > [起動] を選択します。
8. OS インストールが始まるので、アカウント名に `vagrant` 、パスワードに `vagrant` を指定します。
9. WindowsUpdate は無効化しておきます。
10. メニューから [デバイス] > [Guest Additions のCDイメージを挿入...] を選択します。
11. ゲストOSの D ドライブを開いて `VBoxWindowsAdditions` を実行します。
12. メニューから [デバイス] > [CD/DVD デバイス] > [仮想ドライブからディスクを除去] を選択します。

# 仮想イメージの調整
ここからはゲストOS側で作業します。まずは UAC を無効化します。

1. Win+R で `msconfig` と入力します。
2. [ツール] > [UAC 設定の変更] > [起動] を選択して [通知しない] に変更します。

次に WinRM を有効化します。
コマンドプロンプトを管理者権限で実行し、以下のコマンドを実行しましょう。

```bat
winrm quickconfig -q
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
winrm set winrm/config @{MaxTimeoutms="1800000"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}
sc config WinRM start= auto
```

これは好みですが、便利なのでリモートデスクトップを有効化しておきましょう。
作業が終わったらシャットダウンします。


# Base Box 作成
`Vagrantfile.txt` 作成時はリモートデスクトップと WinRM をポートフォワーディングしておきましょう。

```rb:Vagrantfile.txt
Vagrant.configure("2") do |config|
  config.vm.guest = :windows
  config.vm.network :forwarded_port, guest: 3389, host: 13389
  config.vm.network :forwarded_port, guest: 5985, host: 15985, id: "winrm", auto_correct: true
end
```

2014/06/28 追記
上記設定は Vagrant 1.5.x 用です。 Vagrant 1.6.x では下記のようにしましょう。

```rb:Vagrantfile.txt
Vagrant.configure("2") do |config|
  config.vm.guest = :windows
  config.vm.communicator = "winrm"
  config.vm.network :forwarded_port, guest: 3389, host: 13389
  config.vm.network :forwarded_port, guest: 5985, host: 15985, id: "winrm", auto_correct: true
end
```
 

次に `vagrant package` で Base Box を作成するんですが、 VirtualBox に不具合があるため失敗します。

```bat
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["showvminfo", "Win7SP1x86"]

Stderr: VBoxManage.exe: error: Failed to create the VirtualBox object!
VBoxManage.exe: error: Code CO_E_SERVER_EXEC_FAILURE (0x80080005) - Server execution failed (extended info not available)
VBoxManage.exe: error: Most likely, the VirtualBox COM server is not running or failed to start.
```

* [vagrant up fails with VirtualBox 4.2.12 · Issue #1622 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/1622)
* [Vagrant upエラー【0x80070005】win7編｜Webのこと](http://yyfor.blog.fc2.com/blog-entry-4.html)

参考URLの通りに構成を変更して VirtualBox を再起動しましょう。

1. Win+R > `DCOMCNFG` > [コンピューター] > [マイ コンピューター] > [DCOM の構成] > [VirtualBox Application]右クリック > [プロパティ]
1. [ID] > [対話ユーザー]に変更

これで `vagrant package --base "Win7SP1x86" --vagrantfile Vagrantfile.txt` が成功するようになります。
NOTE: `Win7SP1x86` は先ほど仮想イメージで指定した名前です。

Box( `package.box` ) ができたら `vagrant box add Win7SP1x86 package.box` で登録します。
NOTE: この `Win7SP1x86` は vagrant 上で Box を区別するための名前です。上記仮想イメージの名前とは別でも構いません。

# Box 起動
`vagrant init` したら `vagrant up` します。
この時 `HTTP_PROXY` をセットしているならクリアしておきましょう。そうしないと WinRM でプロキシが使われてしまい、正常に `vagrant up` が完了しません。

これで好き放題作ったり壊したりできる Windows 環境ができるようになります。