Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

WSL2とHyper-Vの関係

PR

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

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 の機能の有効化または無効化」で有効にする必要がある。

image.png

この機能は、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との共存はできないな……信頼できるソースの情報もとむ
(2020/4/30 追記2)VirtualBox 6.1.6で試したら、ついにHyper-Vバックエンドで動作しました!! ⇒ 自分の環境だと、VMは起動するしLinuxのインストールまではできたんだけど、いざ動かそうとするとLinuxがカーネルパニックする……

image.png

(2020/6/2 追記3)VMware Workstation Player 15は

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

のように、上2つのチェックを外すことで、動いてます。
image.png

VirtualBoxはいまだうまく起動せず……CPUが古いからかもしれない。

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

図解

hyper-v.png

で、なんで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アプリを動かしたりする人ももちろんいるけどね。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away