WSL2とHyper-Vの関係


PR

2020年もWSL Advent Calendar作りました。

WSL2をインストールして使うときの注意点もよろしくお願いします。

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をインストールする」の記事に載せた通り、「Windows の機能の有効化または無効化」で有効にする必要がある。

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

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

Windows 10 Home

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

すべてのWindows 10に組み込まれている1

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

(2020/8追記) bcdeditコマンドによって設定の変更や確認ができるとのこと

確認するにはこちら

bcdedit /enum | find "hypervisorlaunchtype"

設定するにはこちら

bcdedit /set hypervisorlaunchtype auto
bcdedit /set hypervisorlaunchtype off

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

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

これを有効にすると、「Hyper-V ホスト コンピューティング サービス」というWindowsサービスも動作するようになる。このサービスは英語だとHost Compute Service(HCS)と表記されるもので、公式なドキュメントはこのあたりにもある

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

また、あまりまともなドキュメントがないのだが、この仮想マシンプラットフォーム上にインスタンス化されているコンテナーは、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)

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つのチェックを外すことで、動いてます。

Android Emulator

(2021/8/12 追記4)

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

Windows Hypervisor Platform を使用する VM アクセラレーションを設定する

Bluestacks Androidアプリプレイヤー

(2021/8/12 追記4)

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

How to use BlueStacks 4 on Windows 10 with Hyper-V enabled – BlueStacks Support というページはあるものの、こちらはおそらくフル機能のHyper-Vを必要とするだろうと思われます。WSL2との共存もできるでしょうけど、Windows 10 Home版ではこの方法はとれなさそう。

Windows 10 Pro

Hyper-V

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

Hyper-V マネージャーや、PowerShellの Get-VM コマンドレットで、登録されているVMの情報を得ることができるが、そこにはコンテナー(およびWSL2)の情報は出てこないので注意。

コンテナー

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

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

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

Windows サンドボックス

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

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

(Docker Desktop for Windows)

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

この製品をインストールすることで、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

図解

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

推測だけども。

VMは基本的にブートシーケンスに結構時間がかかる。一応、起動後のVMインスタンスを保存して再開させることはできるが、コンテナーであれば最初からそれと同等の速さで起動できる。

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

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

推測だけども。

(追記)ご参考

What a Windows Container looks like ? - Speaker Deck が日本語で結構掘り下げて書いてあっておすすめ。


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

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

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