WSL2とHyper-Vの関係

# PR

[2020年もWSL Advent Calendar作りました。](https://qiita.com/advent-calendar/2020/wsl)

[WSL2をインストールして使うときの注意点](https://qiita.com/matarillo/items/98d7452967987fe5d633)もよろしくお願いします。

# tl;dr

WSL2はHyper-Vのコア機能であるHyper-Vアーキテクチャと、それを利用したHyper-Vコンテナーの上に実現されている。それらはWindows 10 Homeでも利用可能なので、WSL2にProは不要。

# MSのFAQから引用

> ## WSL 2 は Hyper-v を使用しますか? Windows 10 Home で使用できるようになりますか。
> WSL 2 は、WSL が現在利用可能なすべての Sku (Windows 10 Home を含む) で利用できます。
> 最新バージョンの WSL は、Hyper-v アーキテクチャを使用して仮想化を有効にします。 このアーキテクチャは、"仮想マシンプラットフォーム" のオプションコンポーネントで使用できます。 このオプションのコンポーネントは、すべての Sku で使用できます。 WSL 2 リリースに近いほど、このエクスペリエンスの詳細をすぐに確認できます。
> 
> https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-faq#does-wsl-2-use-hyper-v-will-it-be-available-on-windows-10-home

# 仮想マシンプラットフォームとは

ここで言及されている「仮想マシンプラットフォーム」は、[1日目の「WSLをインストールする」の記事](https://qiita.com/matarillo/items/61a9ead4bfe2868a0b86)に載せた通り、「Windows の機能の有効化または無効化」で有効にする必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/5f8230f1-cb61-ffc7-eee8-258aeda11b32.png)

この機能は、MSのFAQにもある通り、Windows 10 Homeを含むすべてのエディションで有効にできる。

# Windows 10のエディション別、Hyper-V関連機能の概要

## Windows 10 Home

### Hyper-V アーキテクチャ（Hyper-V ハイパーバイザー および Hyper-V ネットワーク）

すべてのWindows 10に組み込まれている[^2]。

[^2]: 実際、関連するWindowsサービスとして「HV ホスト サービス」もあれば、サービス名の頭に「Hyper-V」がついたものも複数ある。

~~ただし単独で有効／無効を設定することはできない。~~ハイパーバイザーを必要とする機能がどれか１つでも有効にされると、一緒に有効化されるイメージ。

(2020/8追記) [bcdeditコマンドによって設定の変更や確認ができるとのこと](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/devtest/bcdedit--set)。

確認するにはこちら

```
bcdedit /enum | find "hypervisorlaunchtype"
```

設定するにはこちら

```
bcdedit /set hypervisorlaunchtype auto
bcdedit /set hypervisorlaunchtype off
```


### 仮想マシンプラットフォーム

Hyper-V ハイパーバイザーを利用した、Windows 10のコンテナー機能のコア。

これを有効にすると、「Hyper-V ホスト コンピューティング サービス」というWindowsサービスも動作するようになる。このサービスは英語だとHost Compute Service（HCS）と表記されるもので、[公式なドキュメントはこのあたりにもある](https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/deploy-containers/containerd)。

これは、Windows上に独立性の高いコンテナーを作成するために必要な「プロセス分離」と「Hyper-V分離」をサポートするためのもの[^3]である。ただし、コンテナーの中でWindowsバイナリーを動かすには、後述する「コンテナー」機能も必要になる。

[^3]: HCSは他にもCPUグループ機能を提供するなどしていて、Hyper-Vからも利用される。https://docs.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/manage/manage-hyper-v-cpugroups

また、あまりまともなドキュメントがないのだが、この仮想マシンプラットフォーム上にインスタンス化されているコンテナーは、`hcsdiag.exe` コマンドで一覧表示するなどができる。WSL2を実行しているときに管理者権限で`hcsdiag list`を実行すると、"WSL"というコンテナーとして起動していることが確認できる。

### Windows ハイパーバイザー プラットフォーム

これは大変紛らわしい名前なのだが、Hyper-V アーキテクチャを利用するというだけなら、この機能を有効化する必要はない。

では、何のためにあるか、だが、簡単に言えば、「WSL2やHyper-Vなど（つまり、Hyper-V アーキテクチャが有効な状況）と同時に、Oracle VirtualBox 6やAndroid エミュレーターなどを動作させるための機構」である。

Hyper-V アーキテクチャを有効にすると、Intel VT-xなどのCPUによる仮想化支援機構をHyper-V ハイパーバイザーが占有してしまう。そのため、以前はOracle VirtualBoxのVMが起動できないとか、Android エミュレーターがVMアクセラレーションに利用していたHAXMがインストールできないとかいった問題が発生していた。

それを回避するため、Hyper-V ハイパーバイザーの追加APIのようなものを公開し、VirtualBoxやAndroidエミュレーターはそのAPIを通して仮想化支援機構を利用できるようにした。これが、Windows ハイパーバイザー プラットフォームである。

というわけなので、WSL2やHyper-Vなどを使いつつ、VirtualBoxやAndroidエミュレーター（のVMアクセラレーション）も利用する場合に限り、この機能を有効にする必要がある。

（追記）VirtualBoxやVMWareについて、Windows 10 1903以降だとHyper-Vバックエンドがうまく動いてないという話があるようだ。これが解決しないとWSL2との共存はできないな……信頼できるソースの情報もとむ

#### VirtualBox

（2020/4/30 追記2）VirtualBox 6.1.6で試したら、ついにHyper-Vバックエンドで動作しました！! ⇒ 自分の環境だと、VMは起動するしLinuxのインストールまではできたんだけど、いざ動かそうとするとLinuxがカーネルパニックする……

（2020/6/2 追記3）VirtualBoxはいまだうまく起動せず……CPUが古いからかもしれない。

（2021/9/2 追記4）下記組み合わせで起動しました！

- Intel Core i5-2450M (Sandy Bridge)
- VirtualBox 6.1.26
  - 仮想マシンの設定（「システム」関連）はデフォルトのまま
- Windows 10 21H1
- Ubuntu Server 20.04 LTS (Focal Fossa)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/19ee1c36-f11f-cb5c-a0c6-52d5c1f908a2.png)

X Window などのデスクトップ機能はまだ試していませんが、とりあえず起動しないってことはなさそう。

#### VMware Player

（2020/6/2 追記3）VMware Workstation Player 15は

- ☐Intel VT-x/EPT または AMD-V/RVI を仮想化(V)
- ☐CPU パフォーマンス カウンタを仮想化(U)
- ☒IOMMU（IO メモリ管理ユニット）を仮想化(I)

のように、上2つのチェックを外すことで、動いてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/224178ee-0f6a-d0a0-6daa-9e0d79bf484f.png)

#### Android Emulator

(2021/8/12 追記4)

HAXMやAMDプロセッサー用Hypervisor Driverは使えませんので注意。

[Windows Hypervisor Platform を使用する VM アクセラレーションを設定する](https://developer.android.com/studio/run/emulator-acceleration?hl=ja#vm-windows-whpx)

#### Bluestacks Androidアプリプレイヤー

(2021/8/12 追記4)

内部的にVitrualBoxを使っているらしいですね。詳細不明。

[How to use BlueStacks 4 on Windows 10 with Hyper-V enabled &ndash; BlueStacks Support](https://support.bluestacks.com/hc/en-us/articles/360041390952-How-to-run-BlueStacks-with-Hyper-V-enabled) というページはあるものの、こちらはおそらくフル機能のHyper-Vを必要とするだろうと思われます。WSL2との共存もできるでしょうけど、Windows 10 Home版ではこの方法はとれなさそう。

## Windows 10 Pro

### Hyper-V

Hyper-V アーキテクチャの上で動かす仮想マシン（や、仮想ディスクや仮想スイッチなど）を作成し管理運用する、様々な機能や管理ツールの集合体。

Hyper-V マネージャーや、[PowerShellの `Get-VM` コマンドレット](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/try-hyper-v-powershell)で、登録されているVMの情報を得ることができるが、そこにはコンテナー（およびWSL2）の情報は出てこないので注意。

### コンテナー

コンテナー化したWindowsバイナリーを「仮想マシンプラットフォーム」上で動かすための機能、および、そのようなWindows コンテナーを作成し管理運用するためのPowerShellコマンドレット群。

この機能を有効にすると、上述の「仮想マシンプラットフォーム」機能も有効になる。

調査があんまりできていないけれど、Docker for WindowsでLinuxコンテナー（LCOW）を動かすだけであれば不要なんじゃないだろうか。たぶん。

### Windows サンドボックス

サンドボックスとして隔離されたWindows 10を「仮想マシンプラットフォーム」上で動かすための機能。ディスクは永続化されないので、サンドボックスを閉じたらすべて削除される。

サンドボックスはコンテナーとして作成される。管理者権限で`hcsdiag list`を実行すると、"Madrid"というコンテナーとして起動していることが確認できる。

### (Docker Desktop for Windows)

無料で使えるサードパーティ製品であり、Windows自体の追加機能ではないけれど、一応書いておく。

[この製品をインストールする](https://docs.docker.com/docker-for-windows/install/)ことで、Windows上でLinuxコンテナー（LCOW）とWindows コンテナーを統一的に作成し管理運用することができる。

Docker for Windowsの導入には、Linuxコンテナーを動かすために「Hyper-V」（アーキテクチャではなく、フルのHyper-V）を、Windowsコンテナーを動かすために「コンテナー」を、それぞれ有効にする必要があったが、DockerランタイムをWSL2上で動かす機能がプレビュー登場しているので、Linuxコンテナーだけを作成し管理運用するのであれば、もしかしたらいずれWindows 10 Homeでもよくなるのかもしれない。（特にアナウンスがあったわけではないので、わからない。やっぱりProが必要のままかもしれない。）⇒（追記）やっぱりHomeでよくなる模様！ https://qiita.com/Lyrise/items/951eed1a088a112e8397

# 図解

![hyper-v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/e1b82763-f67d-f30a-2a02-b5ec0199b732.png)

# で、なんでWSL2はVMじゃなくてコンテナーなの？

推測だけども。

VMは基本的に[ブートシーケンス](https://www.linux.ambitious-engineer.com/?p=1009)に結構時間がかかる。一応、起動後のVMインスタンスを保存して再開させることはできるが、コンテナーであれば最初からそれと同等の速さで起動できる。

また、WSLの想定ユースケースであるLinuxサーバーアプリケーション開発用途では、グラフィクス機能は不要[^1]。

そのあたりの背景がありつつ、あとはビジネス戦略上、ProにはHomeにない付加価値を持たせつつ、とはいえWSL2はHomeでも利用できた方がいい、という判断があったので、こうなったのではないだろうか。

推測だけども。

# （追記）ご参考

[What a Windows Container looks like ? - Speaker Deck](https://speakerdeck.com/cyberblack28/what-a-windows-container-looks-like) が日本語で結構掘り下げて書いてあっておすすめ。

[^1]: Windows側にX Serverを立ててGUIアプリを動かしたりする人ももちろんいるけどね。