Hyper-V で立てたUbuntuにvirtualbox + vagrant でUbuntu を立ててみる

# はじめに
チームで開発をしているときに、VirtualBox + Vagrant + Ansibleで開発環境をローカルに構築していて、自分だけWindowsだったので開発環境を構築する際に工夫が必要だった（[Ansible はWindows をコントロールマシンとしてはサポートしていない](https://forums.virtualbox.org/viewtopic.php?f=7&t=86922)のと、VirtualBox は[Nested Virtualizationをサポートしていない](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#control-machine-requirements)）。

その時は、ホスト(Windows) に入れた[VirtualBox + Vagrant をWSLから操作](https://www.vagrantup.com/docs/other/wsl.html)しつつ、WSLでAnsible を実行していた。

もっといい方法があるだろうなと思って、
Windows + Hyper-V で立てたVM内で VirtualBox + Vagrant を試してみた。

最終的には以下のような構成を目指す。

```
            -------------------------------
           | Ubuntu (VirtualBox + Vagrant) |
        ---------------------------------------
       |          Ubuntu (Hyper-V)             |
     ----------------------------------------------
    |                  Windows                     |
    ------------------------------------------------

```

## 環境
### ホスト側
Windows10 Pro
Hyper-v
Intel Core i7-3770k

### ゲスト側
Ubuntu 16.04
VirtualBox 6.0.0
Vagrant 2.2.2

## VirtualBox -> Hyper-V に変更
VirtualBox と Hyper-Vマネージャから利用するVMは共存することができない。
仮想化に利用されている技術が違うからだ。(INTEL VT-x とHyper-V)

Docker for Windows ではHyper-Vを利用しているので
VirtualBox を利用しているときにDocker for Windows を入れてしまうとVirtualBox からVMを立ち上げたときにブルースクリーンになってしまう。仮想化に使われている技術が違うことに起因するブルースクリーンである。

Hyper-V 有効化についてはMicrosoft さんが[紹介](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)している。

## Hyper-V を利用してUbuntu をたてる
Hyper-V を利用してUbuntu を入れる。
ここもMicrosoftさんが[説明](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/quick-create-virtual-machine)してくれている。

インストールが済んだあとVirtualBox とVagrant を導入する。

## Vagrant up してみる
### ハマりポイント１
```
vagrant init ubuntu/xenial64
vagrant up
```
すると

```
The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

VirtualBox is complaining that the kernel module is not loaded. Please
run `VBoxManage --version` or open the VirtualBox GUI to see the error
message which should contain instructions on how to fix this error.
```
となり、起動できない。

原因はHyper-Vマネージャの`設定 > ハードウェア > セキュリティ` の"セキュアブートが有効" にチェックがついていることが原因だった。
なので、この設定を無効にする。

### ハマりポイント２
VMを再び起動して、

```
vagrant init 
vagrant up
```
すると

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

Command: ["startvm", "f59d4b5a-ecdb-4755-9918-77db8ed472d3", "--type", "headless"]

Stderr: VBoxManage: error: VT-x is not available (VERR_VMX_NO_VMX)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole
```

となる。
MV(Ubuntu)にインストールしたVirtualBox の設定を見てもVT-xは有効になっている。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/250213/798b1b39-224a-8400-c5ee-a148eaebe468.jpeg)

となると、VMのマシンとなっている側の設定が疑わしいと思って調べてみると、
Microsoftさんに[入れ子になった仮想化による仮想マシンでの Hyper-V の実行](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization) というのがあるのでやってみる。


Windows側でアドミン権限でPowerShell を起動し、

```powershell
PS C:\WINDOWS\system32> Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
```
を実行してみる。

再びVMを起動して、

```
vagrant up
```
してみると、無事にVMが立ち上がる。

## まとめ
もともとWindows を使わなければよいのではという話ですが、Windowsでも最近はWSLなどおもしろいことができるので試してみました。
前にやっていたパターンよりシンプルにVM on VMができると思います。
WindowsはWSLを含め、開発にフレンドリーな機能を提供しているので、色々と触ってみるのもいいかもしれません。