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 リリースに近いほど、このエクスペリエンスの詳細をすぐに確認できます。
仮想マシンプラットフォームとは
ここで言及されている「仮想マシンプラットフォーム」は、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)
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 が日本語で結構掘り下げて書いてあっておすすめ。
-
実際、関連するWindowsサービスとして「HV ホスト サービス」もあれば、サービス名の頭に「Hyper-V」がついたものも複数ある。 ↩
-
HCSは他にもCPUグループ機能を提供するなどしていて、Hyper-Vからも利用される。https://docs.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/manage/manage-hyper-v-cpugroups ↩
-
Windows側にX Serverを立ててGUIアプリを動かしたりする人ももちろんいるけどね。 ↩