WSL 1と2の違い。

今ひとつちゃんと理解していなかったのと、どちらを使えばいいかを決めるのに情報のまとめが必要だったのでメモ。でも勘違いとか正確に理解できてないとか間違ってるとかあるかもしれない。

機能的な比較はWSL 1とWSL 2の比較にまとまっているのでそこを参考にすると、WSL 2側から見た Pros / Cons は、
  • Pros
    • マネージドVM
    • 完全なLinuxカーネル
    • システムコールの完全な互換性
  • Cons
    • OSファイルシステム間でのパフォーマンス
ということのようです。

パフォーマンス的には、WSL 2 は 9P というプロトコル経由で Windows ファイルシステムにアクセスするためにとても遅いとのこと。つまり、Windows ファイルシステムにある大量のファイルを WSL 2 上の Linux に処理させようとするとめちゃくちゃ遅い、ということのようです。そのため、Linux 側のコンパイルツールで Windows 側のソースツリーをコンパイルするというようなシナリオはパフォーマンスが非常に悪いようです。また、うっかり /mnt/c 以下で作業するとファイルアクセスが極端に遅くなるので、Windowsファイルシステム上にある大量のテキストファイルを処理するような作業も向かないのでしょう。

一方、WSL 2 では Hyper-V を仮想マシンプラットフォームとして管理下に置くため、WSL 2 の Hyper-V API を使用するように設定した VirtualBox や Android Emulator を同時に動かすことができるとのことで、WSL 1 が Hyper-V を専有しているために別の仮想マシンを同時利用できなかったのに比べると大きな違いになっています。

また、WSL 2 が管理している Linux 側のファイルシステムへのアクセスは WSL 1 に比べて高速化しているそうで、Linux ファイルシステム上でのコンパイル作業などは高速になるようです。

WSL 2 ではシステムコールについても完全に互換だということなので、Linux バイナリを持ってくればそのまま動くというのも特徴になります。

じゃあどちらを使えばいいのかというとこれがまたややこしくて、
  • WSL 1 は Hyper-V を使ってハイパーバイザを独占するので、Hyper-V プラットフォームに対応していない仮想マシンは同居できないし、対応していてもパフォーマンスが悪かったりする。
  • Docker に関しては、WSL 1 の場合には WSL 上に Linux 版の Docker をインストールして使用することでこの問題は回避できるらしい。
  • WSL 1 と WSL 2 は同居でき、仮想マシンがどちらを使うかを個別に指定できる。たとえば Ubuntu は WSL 1 上で動かし、Docker Desktop for Windows のバックエンドには WSL 2 を使うということができる(らしい)。wsl -l -v などとすると、パッケージがどちらの WSL で動いているかも表示される。また、wsl --set-version <ディストリビューション> <バージョン> などとしてどちらのバージョンで動作するかを指定できる。
ということなので、Ubuntu は WSL 1で、Docker は WSL 2 で、などというのがいいのかもしれません。 ちなみに、WSL 2 までインストールした状態で Docker Desktop for Windows をインストールし、そこに Linux ディストリビューションをインストールするとなぜか Docker の環境で実行されてしまうようでした。なのでインストール順にも注意したほうがいいみたいです。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...