ストレージパフォーマンスが変わらなかったとしても……

WindowsでLinuxバイナリを実行する技術である「WSL (Windows Subsystem for Linux)」は、「Windows 10 version 2004」から導入されたWSL 2とそれ以前のWSL 1とで実装系がまったく異なる。改善したとか一部を差し替えたとかそういったレベルではなく、まったく別のものとして開発されている。WSL 1とWSL 2については本連載でもこれまで何度か特徴を説明してきた。今一度簡単にまとめると、次のようになる。

○WSL 1

LinuxカーネルのシステムコールをWindowsカーネルが処理できるシステムコールに変換して実行する技術および実装系。LinuxとWindowsの差異に関してはシステムコール差し替えを行う段階で吸収したり、専用のドライバをかませたりするなどして吸収している。他のカーネル向けのバイナリを実行する方法として古くから存在している方法のひとつをWindows 10向けに実装したといったものであり、PCをエミュレートする方法よりも処理が軽量で高速になりやすいと考えられている。

しかし、Windowsの場合にはLinuxとファイルシステムの差異が大きく、この部分をドライバで吸収したことでストレージ性能が遅くなったと評価されている。

○WSL 2

Hyper-Vを利用してLinuxカーネルを動作させ、LinuxカーネルでLinuxバイナリを実行する。性能はHyper-Vの性能となる。割り当てるリソースなどはWindows側が自動的に調整。利用するLinuxカーネルもWindows側が用意する仕組みを採用している(現在、最初は手動でインストールする必要があるが、将来的にこの処理は自動化される見通し)。

ユーザーからの操作性では、WSL 1もWSL 2も同じになっているため違いに気がつくことは稀だと思う。しかし、実装されている技術はまったく別のものであり、別のカーネルで動作しているという違いがある。

Microsoftは今後はWSL 1の開発はしないが互換性提供の目的で機能の提供は続けるとしている。このため、WSL 1とWSL 2でのパフォーマンスを比較し、WSL 1の方がパフォーマンスが発揮できるならWSL 1を使い続けるというのはロジカルな選択肢ということになる。状況によってはWSL 1の方がパフォーマンスが発揮できる状況もあるため、その場合にはWSL 1を使った方がよいだろう。

しかし、WSL 1とWSL 2にはパフォーマンス以外に大きな違いがある。その面から言うと、場合によってはWSL 2しか選べないことにもなるので注意が必要だ。

最大の違いはカーネル互換性100%かどうか

WSL 1とWSL 2まるで違う技術を採用しているため、必ずパフォーマンスの違いは出てくる。しかも、その性能差は利用しているハードウェアや仮想化技術などさまざまな要因に依存するので、利用する環境で実施に試してみないことには確認することが難しい。一概にどちらの方が性能が高いとは言い難い。

しかし、確実に言えることがある。それはWSL 2はLinuxカーネルとの互換性が100%ということだ。それは、仮想環境でLinuxカーネルを実行しているためで当然ではあるのだが、この違いが重要になってくる。

WSL 1は互換レイヤを提供するという技術になっている。Linuxバイナリがシステムコールを呼んだ段階で、それをWindowsカーネルのシステムコールに変換して実行する。このため、Linuxバイナリを実行するためにLinuxカーネルが不要であり、Windowsカーネルのみで動作するという特徴がある。反面、更新され続ける最新のLinuxカーネルに対応するために、この互換レイヤ部分を常に最新版へアップデートし続ける必要がある。それでもWSL 1は互換性は100%には到達しなかった。いくつかの機能は差し替えができなかったのだ。

WSL 2ではLinuxカーネルをそのまま使っているため、こうしたことは不要だ。必要なことはLinuxカーネルを最新版へアップデートし続けることだけだ。Linuxカーネルは開発コミュニティから定期的に提供されている。Linuxディストリビューションの対応状況などを見つつ、Windowsで採用するLinuxカーネルを更新していけばよいのだ。

MicrosoftはWindows UpdateでLinuxカーネルをアップデートできるようにするとしており、最短で月に1回のペースで最新のLinuxカーネルが使えるようになる可能性がある。互換性の問題はこの仕組みによって解決するわけである。

WSL 2 on Windows 10 version 2004

Microsoftは、複数のLinuxカーネルを指定できるようにする機能も検討している。このLinuxディストリビューションは指定したLinuxカーネルと組み合わせて使用できるということだ。Linuxのエコシステムに合わせてWSL 2で使用するLinuxカーネルも更新されていき、常によく使われている環境が使われるという状況になるわけである。

WSL 1は互換性維持の目的での提供になる

一方、WSL 1は今後開発が進められないことになっている。互換性維持の目的で提供は続けるとしているが、開発はしないという。つまり、今後Linuxカーネルに新しいシステムコールが追加されてもそれがWSL 1で使用できるようになることはないということであり、現在実装されていないシステムコール関係の機能が今後開発されて利用できるようになる見通しも存在しないことを意味している。

パフォーマンス上の理由などでWSL 1を使用するという選択をするのは悪くないのだが、その場合は次の条件を満たしているほうが安全ということになる。

WSL 1を利用する環境は、Linuxカーネルのバージョンアップが行われない環境である

WSL 1を利用する環境は、基本的に現状維持が目的で、今後新しいソフトウェアをインストールしたりアクティブにアップデートを行ったりしていくような環境ではない

WSL 1はその実装の仕組み上、互換レイヤ部分を更新しない限りLinuxカーネルの新しいシステムコールや機能に対応することができない。Microsoftはもうこの部分の開発は行わないと説明しているので、今後はWSL 2を使っていかないと、新しいLinux環境は徐々に利用できなくなる可能性が高い。あくまでも現状維持または互換性維持が目的であり、WSL 1は今後積極的に使っていくような環境ではないということである。

WSL 2関連の自動化いつになる?

「Windows 10 version 2004」の段階ではWSL 2は利用できるようになるものの、利用を開始するにはユーザーが明示的に関連機能の有効化とLinuxカーネルのインストールを行う必要がある。Microsoftは今後の開発でこの辺りを自動的に行えるようにするとしているが、明確なタイムスケジュールは発表されていない。

早ければ秋のフィーチャーアップデート版となる「Windows 10, version 20H2」からになるか、利用できるパイを考えると「Windows 10, version 21H1」が実際のスタート時期となるか、詳しいタイムスケジュールはわからないが今後スタンダードになる方向にあることは事実だ。

いずれデフォルトのバージョンがWSL 2に切り替わると思うので、新しくインストールしたLinuxでは自動的にWSL 2が実行されるという状況にはなると思う。しばらくの間はWSL 1に切り替えることで逆にパフォーマンスが上がるかもしれないが、方向性はWSL 2のデフォルト採用とWSL 1の利用中止ということになる。今後がこの方向性であることは覚えておくとよいと思う。