Ubuntu 20.04 LTSの実行環境をWSL 1からWSL 2へ変更

前回は「Windows 10 version 2004」にアップデートされた環境でWSL 2を有効化する方法を取り上げた。Windows 10 version 2004には仮想環境技術をベースとした新しいWSLが搭載されており、特にストレージI/O性能が向上すると言われている。WindowsでLinuxを使うユーザーとしては、ぜひとも使いたい機能だ。

「Windows 10 version 2004」へアップデートする前の段階でLinuxをインストールした場合、そのディストリビューションはWSL 1で動作する。Windows 10 version 2004から追加されたWSL 2を利用するには、WSLのデフォルトバージョンを2に設定して一旦ディストリビューションをアンインストールしてからインストールし直すか、wslコマンドでひもづけるバージョンを変更する必要がある。

例えば、WSL 2を有効化する前の段階でUbuntu 20.04 LTSをインストールしたのであれば、そのディストリビューションはWSL 1で動作する設定になっている。この場合、PowerShellなどから次のようにwslコマンドを実行することで実行環境をWSL 1からWSL 2へ切り替えることができる。

Ubuntu 20.04 LTSの実行環境をWSL 1からWSL 2へ変更

wsl --set-version Ubuntu-20.04 2

WSL 2への切り替えを実行すると、次のようになる。wsl --set-versionは実行が完了するまで数分かかるので、しばらく待つ必要がある。

  • Ubuntu 20.04 LTSの実行環境をWSL1からWSL2へ変更

    Ubuntu 20.04 LTSの実行環境をWSL 1からWSL 2へ変更

なお、上記のスクリーンショットでは、2年前にインストールしたUbuntu 18.04 LTSがデフォルトのLinuxディストリビューションとして設定されている。Ubuntu 20.04 LTSの方を中心的に使っていきたいなら、次のようにデフォルトのLinuxディストリビューションをUbuntu 20.04 LTSへ変更してあげればよい。

デフォルトのディストリビューションをUbuntu 20.04 LTSへ変更

wsl --set-default Ubuntu-20.04
  • デフォルトのディストリビューションをUbuntu 20.04 LTSへ変更

    デフォルトのディストリビューションをUbuntu 20.04 LTSへ変更

このように、これら関係の操作はwslコマンドで実行するようになっている。今回の話に関連するwslコマンドについてまとめると次のようになる。

コマンド 内容
wsl --list -v インストール済みディストリビューションと使用するWSLバージョンを表示
wsl --set-default ディストリビューション名 WSLのデフォルトのディストリビューションを設定
wsl --set-default-version 番号 WSLのデフォルトバージョンを設定
wsl --set-version ディストリビューション名 番号 指定したディストリビューションで使用するWSLバージョンを設定
wsl --terminate ディストリビューション名 指定したディストリビューションを終了

wslコマンドは今後のフィーチャーアップデートでさらに機能が追加される予定になっている。WSLを管理するコマンドとしてさらに充実が図られる見通しだ。

ストレージIOのベンチマーク

ここで簡単な比較を行ってみよう。同じ環境のUbuntu 20.04 LTSに関してWSL 1で動作している状態と、WSL 2で動作している状態でbonnie++ version 1.98を実行する。

  • bonnie++ 1.98 on Ubuntu 20.04 LTS on WLS1

    bonnie++ 1.98 on Ubuntu 20.04 LTS on WLS1

  • bonnie++ 1.98 on Ubuntu 20.04 LTS on WLS1

    bonnie++ 1.98 on Ubuntu 20.04 LTS on WLS1

ファイルの作成や削除の方のベンチマークは動作が速くてまともな結果が出ていないので、データの入出力とランダムシークに関する結果を次にまとめておく。

bonnie++ 1.98 WSL 1 WSL 2
シーケンシャル出力(キャラクタ単位) 79[kbyte/sec] 633[kbyte/sec]
シーケンシャル出力(ブロック単位) 81.5[mbyte/sec] 35.3[mbyte/sec]
シーケンシャル出力(リライト) 110[mbyte/sec] 20.0[mbyte/sec]
シーケンシャル入力(キャラクタ単位) 77[kbyte/se] 1291[kbyte/sec]
シーケンシャル入力(ブロック単位) 228[mbyte/sec] 20.4[mbyte/sec]
ランダムシーク 3365[byte/sec] 3436[byte/sec]

この結果を見る限りでは、WSL 1はブロック単位での読み書きとランダムシームがWSL 2よりも高速で、WSL 2はキャラクタ単位での読み書きがWSL 1よりも高速ということになる。

さまざまな要因があるので比較にはならないのだが、参考までにWindows 10でwinsatを実行してディスクパフォーマンスを計測すると次のようになる。

  • Windows 10でwinsat diskを実行しているようす

    Windows 10でwinsat diskを実行しているようす

winsat disk
シーケンシャル出力 804.49[MB/s]
シーケンシャル入力 839.64[MB/s]
ランダム入力 123.05[MB/s]

正確な比較にはらないのだが、ネイティブWindows 10のほうがストレージIOは高速で、WSL 1とWSL 2はそれよりも遅い、という傾向があることは間違いなさそうだ。

ここで取り上げたベンチマークは、あくまでも参考にとどめてほしい。なぜなら、ストレージIOのパフォーマンスは実行する環境で大きく変わるからだ。ベアメタルか仮想環境か、ベアメタルならどのプロセッサを使っているのか、どのストレージを採用しているのか、仮想環境ならどの仮想化技術が使われているのか、仮想ディスクの構成はどうなっているのか、などなど。MicrosoftはWSL 2のほうがストレージIOが高速になるとうたっているが、ストレージIOは環境によっては逆の結果が出ることもある。

このため、ストレージIOに関しては、実際に利用するソフトウェアでどれくらい性能が異なるのかを計測するしかない。利用する環境で実際にパフォーマンスを比較して、その上で速い方を使えばよい。

WSL 2からWSL 1へ戻す方法

利用するソフトウェアや実行する環境によっては、WSL 2よりもWSL 1のほうがストレージ性能が高速になるケースも十分に考えられる。WSL 2になってもストレージIOがそれほど高速にはならない可能性があることは以前から指摘されていた。結局のところ、ケースバイケースだとは思うが、MicrosoftはWSL 1もWSL 2も提供してくれるので、WSL 1のほうが高速ならWSL 1で実行すればよいだけだ。

WSL 2に変更したディストリビューションも、次のコマンドでWSL 1へ切り替えることができる。

Ubuntu 20.04 LTSの実行環境をWSL 2からWSL 1へ変更

wsl --set-version Ubuntu-20.04 1

WSL 2からWSL 1への切り替えにも数分の時間がかかるので、終わるまで待つ必要がある。

WSL 1とWSL 2を切り替えてパフォーマンスを比較し、WSL 2が許容できない遅さになるならWSL 1を使ったほうがよいと思う。ただし、Microsoftは今後WSL 1は互換性目的でのみ提供するとしており、改善や新機能の追加などは行われないものと見られる。パフォーマンスの点で許容できる(それどころか高速になるケースもある)のであればWSL 2を使えばよいと思う。WSL 2は今後Microsoftが実施する改善や新機能の恩恵を預かることができる。

本格的にWSL 2が利用できる状況になってきた

先日、Microsoftは「Windows 10 version 2004」へアップデートできる対象となるPC(およびユーザー)の範囲を広げた。Windows Updateで自動的にアップデートされるわけではないのだが、自主的にアップデートのチェックを行ったユーザーには「Windows 10 version 2004」へのアップデートパスが表示されるようになる。これまでよりもこのフィーチャーアップデート版へ移行するユーザーが増えるものと見られる。

WSL 2の本格的な利用はこれから数年かけて広がっていくことになり、MicrosoftにとってLinuxを実行する新しい取り組みが広がりを見せることになる。Windows 10は世界で最も広く使われているデスクトップ向けオペレーティングシステムだ。この環境でLinuxを簡単に利用できるというのは潜在的なLinuxユーザーの数が大きく増えることを意味している。なにせ導入が簡単だし、今後ますます利用が増えるものと見られる。