WSL1を長い間使っていましたが、先日Windows 10 Version2004がリリースされてWSL2に切り替えを行いました。
WSL2いいのですが、WSL1と同じように、あるいはちょっと欲張ろうと少し困ったのでメモ。
概要
Windows 10 May 2020 Updateがリリースされてから2週間使ってますが、もうWSL1に戻る気はないぐらいには気に入っています。おすすめです。 具体的には、
- GOOD: WSL2にしてapt/pip3が爆速になってうれしい
- GOOD: WSL1とおおむね使い勝手は変わらず、WSL2上のdockerでボリュームマウントが可能になってよかった(標準的なLinuxとみなせるようになった)
- BAD: WSL2のWindowsボリュームのアクセスはとても遅くなった
- CONSIDER: Windowsのシステムボリュームは余計に食うようになったので50GB程度空きは欲しい (あるいはOSリセットすると減るはず)
kubernetes周りに関しては、特段変化を感じません。
WSL1 で何をしていたのか
WSL1では、Ubuntu 18.04を動かして、中でアプリケーションやインフラにかかわるツールを動作させていました。 Dockerでもいいのですが、普段使いのツールや、Windowsでマウントしているファイルを(EOLを含めて) そのままLinuxで動作させたときの動作もサクッと確認できるのがいいのです。
- dotnet core SDK
- golang
- cmake
- Kubernetes (kubctl/helm/kubesec/sops...)
- terraform
- docker/docker-compose
- aws cli/azure cli
- jq/yq
- sed他
dockerとWSLの使い分けはそのカジュアルさです。 WSLは、bashと入力するだけでほぼLinuxとみなせるインタラクティブな環境に行けるので、普段使いのUbuntu環境に利用しています。多少無茶な使い方をしても、アンインストールしてstoreから入れなおせばフレッシュになるので壊せる開発環境という感じです。 一方のdockerは、アプリ動作環境を閉じ込めるためや、特定のソフトウェアの挙動、壊れるだろうという操作やシステム設定の変更など戻すことがめんどくさいことをするときに使っています。
WSL2 で何をするのか
基本的な利用目的は変わりません。手軽にさくっとLinux環境としてUbuntuを利用します。 WSL1からWSL2に変化することで期待したのは、ディスクI/Oです。 概ね事前にやっていた結果とWindows 10 Version 2004におけるWSL2に違いはなく、WSL1に比べてext4上でのディスク書き込みの速度が上がりました。 具体的な変化は次の通りです。
apt update|instalが爆速になるpip3も爆速化- Windowsマウントファイルへのアクセスは非常に低速に
- WSL2上のDockerでボリュームマウントが可能になった
ディスクアクセスの改善は顕著です。具体的なシチュエーションだと、apt update/installに関しては、これまでUbuntu 18.04を入れた後に実行すると10min程度食うのを覚悟していたものが1min程度になっています。pip3も同様です、ansible入れてみてください。
ただ、Windowsのマウントディレクトリ ( /mnt/cなど) でのファイル操作はけた違いに遅くなりました。(知ってた) そのため、例えばdocker-composeでWindowsのフォルダをWSL2からマウントするのはものを選びます。100MBを超えるdocker転送は永遠に終わらない気分となります。(node_modulesとかつらい)
Windowsのパス上からそのままbashでWSL2を起動する流れは変わらないものの、大き目なファイルサイズを伴うdocker-composeに関してはWindows上で扱うか、ext4上にgit cloneするのがいいでしょう。
しれっと書きましたが、WSL2ではWSL上のファイルをWSLのdockerにボリュームマウントできます。WSL1では、WSL上のファイルをWSL上で実行したdockerにボリュームマウントできず、ふとしたdocker操作で挙動が違って無駄に時間を費やすことがありましたがなくなりました。最高です。
WSL2 への対応
WSL1の環境をWSL2にするにあたり、どのような対応をしたかメモしておきます。
Windows システムボリュームの利用が増えた
WSL1からWSL2にすると、Docker Desktop (35GB)、wsl (9GB)、Ubuntu 18.04(5GB) で約50GB余計にシステムボリューム(C:) を利用するようになってしまいました。

デスクトップは長い間256GB M.2 SSD (Samsung SSD 950 Pro) でやっていましたが、WSL2にして残り1.8MBになったためシステムボリュームを1TB NVMeに差し替えました。 Crucialは最近P2が出ましたが、ちょっと試してみたかったP1で。
https://www.crucial.jp/catalog/ssd/p1
なお、Windows.old を含めてゴミを消しても容量はすぐに埋まりきりがなくなったので仕方ない。
なお、Windows 10も入れなおして開発環境、WSL2を組みなおしたところ利用容量が76.1GBになったので、まぁそんなものです。知ってた。(だから256GBで過ごせていた) Windowsの入れ直しは、Media Creation ToolでWindows 10 May 2020 UpdateからUSBブートを作るのが今も安定でした。

Windows Features が不要に
幸いなことに、 Docker Desktop for WindowsをインストールするとWSL2周りは一通り入ります。(Kernelのぞく)
これまでEnable-WindowsOptionalFeatureでインストールしていたMicrosoft-Windows-Subsystem-Linux、Hyper-Vは不要になりました。
脱Hyper-Vは、Windows 10 Homeでも利用できるようになっていますし最高ですね。(Virtual Boxとかも動くし)
WSL OS
WSL2でも、現状はUbuntu 18.04を使っています。 折を見てUbuntu 20.04に切り替えていきますが、まずは変化を見たいので変えていません。
Provisioning
WSL1と変わらず、WSL2においてもansibleを使って環境を構築しています。 私の場合は、Windows / macOS / Ubuntuを各種環境を利用するので、全環境に対してこのリポジトリの内容を当てています。
Ubuntu 18.04においては、WSL1/WSL2であってもansibleで当てています。 Diffは次の通りです。
いくつか初期化回りの変更をメモしておきます。
dockerの入れ直しをやめた
dockerは、WSL1においてはdocker.ioの公式同様に入れなおしていましたが、WSL2においてはデフォルトから変更していません。
- - { role: "docker", tags: [docker] } + #- { role: "docker", tags: [docker] }
また、bashログイン時の起動も止めています。
- sudo -S cgroupfs-mount - sudo usermod -aG docker $USER - sudo service docker start - # wsl1 using windows docker-compose. wsl2 don't need this line. - # export DOCKER_HOST=tcp://localhost:2375
https://github.com/guitarrapc/dotfiles-linux/commit/db47ddf5c1ba8400acb502b256c8a03bbcb5749b
WSL2でdockerの入れ直しをやめたのは、dockerの入れ直しを行うことでWindows上のDocker for WindowsのイメージとWSL2上のイメージ一覧が同期されなくなったためです。(WindowsはWindows、WSL2のUbuntuはUbuntuと個別にイメージを持つようになってしまった。)
# この結果を Windows と WSL で共有する docker image ls
WSL2を使うにあたって、Windowsの状況がそのまま利用できるメリットを手放す理由は相応のものがない限り薄く、特にdockerに関しては同じイメージが使えるのは最高なのでdockerの入れ直しはやめました。
systemd/snap
当初wsl2ならsnapも行けるしと思って試していた形跡があります。が、結局snap使っていません。(また使えるようにファイルは残しています) 実際systemd/snapdを動かして、snap経由でのインストールも可能になりましたが、以下の理由で辞めています。
- kubectlは意図通りsnapのほうが楽だった
- snapで差し替えたかったpip3のsnapファイルが欲しいものではなかった
- 具体的にはansibleパッケージは公式版がなく個人のパッケージはpython2版
- WindowsからbashやwslでWSL2を起動したときに、$HOMEに移動してしまう
- WSL2は、
wslやbashでUbuntuに入るとWindowsのパスのまま維持しますが、snap対応を入れたスクリプトでのログインしなおしでパスが $HOMEになってしまう
- WSL2は、
snapを使うことでバージョニングを楽にインストールをしたいと思ったのですが、なかなか難しいようです。 現状あんまりsnapに頑張る気もないので、やめました、はい。
Windows パスの分離
WSL2はWSL1同様に、標準ではWindowsのPATHが $PATHに入ってきます。
これにより、WSL2上でcode .とすることでRemote WSLがVS Codeで使えたりします。(~/docker.cfgもWindowsのdocker credのパスが入っています)
Windows PATHがWSLで使えるのはすごく便利なのですが、WSL1でWindowsのパスとWSLのパスが競合して「WSLでアプリ動作がおかしくなったこと」もあります。
そのため、 /etc/wsl.confでPATHを停止しています。
[interop] appendWindowsPath = False
wsl.confをおいて、 wsl --shutdownを実行することでWSLにWindowsのパスが入らなくなります。
$ echo $PATH /home/guitarrapc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/guitarrapc/.dotnet/tools
まとめ
おおむねWSL2にして幸せになります。 ディスク容量は明らかに食うようになるので、私は割り切ってシステムボリュームを1TBまで増やしてわずらわしさを感じないようにしました。 ただ、ラップトップでなくても、PCのシステムドライブはそれほど大きくないことも多いので要注意な感じがあります。