MJHD

エモさ駆動開発

2020年最高のWSL環境を求めて

前回: mjhd.hatenablog.com

熱狂的なWSL信者の皆さん、お元気でしょうか。
前回WSL環境について記事を書いてから1年が経ち、WSLを取り巻く状況も様変わりしました。Windowsのアップデートもあり、手元の環境もスクラップ&ビルドを繰り返したため、開発環境としてかなり完成度が高くなりました。安寧です。もう我々は花びらを散らす必要はないのです。

WSL2

まもなくの正式リリースが予定されている Windows10 version 2004 に含まれるWSL2は、今年一番の変化です。
WindowsのプロセスとしてELFをロードしLinuxシステムコール互換レイヤを通じて実行されていたWSLの仕組みが大きく変わり、軽量仮想マシン上で動くLinuxカーネルのプロセスとして実行されるようになりました。
これにより、システムコールの互換性が100%になったり、付随してext4ファイルシステムを直接使うようになったためIOのパフォーマンスがかなり向上するなど様々なメリットが得られました。
大幅な方針転換ですが、軽量VMの起動速度が1秒ほどという特徴もあり、デメリットをほぼ感じません。
以前のWSLからWSL2へ変換ができるため、開発環境として使いたい人はぜひ乗り換えましょう。
(WSL2の初期にあったlocalhost問題も解決しています)

WSL, WSL2の仕組みについては師匠のスライドが分かりやすいです:

www.slideshare.net

Docker for Desktop

Docker for DesktopがWSL2をバックエンドとして利用できる機能を公開しました。(まだ実験的ですが)
WSL1では様々な問題でdockerdを起動することができませんでしたが、WSL2はそもそも仮想マシンなのでなんでもできます。 そこで、WSL2のディストリビューションの一つとしてdockerd入りのLinuxを起動することで、オーバーヘッドも小さく高速に起動するコンテナ環境が実現できました。
起動したホストには他のディストリビューションWindowsからアクセスすることができます。

f:id:wait0000:20200509143313p:plain
WSL2 backendの設定項目

f:id:wait0000:20200509143944p:plain
docker-desktopがWSLディストリとして作成されます

Windows Terminal

今まで、WSLで使用するターミナルは

  • Xserverを通じてgnome-terminal, terminatorなどのLinux系ターミナルを動かす(少し不安定&起動に時間がかかる&依存がデカい)
  • Hyper, alacrittyなど、マルチプラットフォーム対応のターミナルを使う(微妙に不安定, 日本語入力がバギー)
  • FluentTerminal, TerminusなどモダンなWindows用ターミナルを使う(発展途上)
  • wsltty(レガシー)

など選択肢がありましたが、どれも日常的に使用するには不満が大きかったです。

今は Microsoft 謹製の Windows Terminal があります。

www.microsoft.com

初期のころは機能が十分でなかったり重たかったりという不満がありましたが、最新版は軽く安定していて、設定項目も十分です。
useAcrylicを有効にすれば、FluentDesignのアクリル素材効果が適用されてWindows10っぽさが増します。
iTerm2のカラースキームを取り込むこともできます。 もはやターミナルエミュレータはこれ一択かな、といった状況です。

f:id:wait0000:20200509141719p:plain
WIndowsTerminalの様子

f:id:wait0000:20200509142857p:plain
vimもかなりサクサク動くよ

ディストリビューション

何を選ぶかは信仰の自由もとい個人の自由ですが、僕はArchLinuxを選びます。
GUI方面はWindowsに任せ、主にターミナルを用いた開発環境としてのLinuxをメインに使う場合は、ArchLinuxがミニマルで良いのではと思います。
(そういえばxserverも消しちゃった)

もともとArchLinuxはWindows Store上で配布されていたのですが、偽物騒動などもあり現在は配布されていません。

以下のリンクからArchLinuxのappxを入手できます。これを使うのが現状一番手っ取り早いです。 github.com

Windows<->Linuxのファイル共有

もともとの課題だった、WSLのファイルをWindowsから読めない問題は、(多分)Hyper-Vソケットを通じた9pプロトコルWindows実装がされたことで解決しました。
逆に、9pプロトコルとDrvFSを通じて従来通りLinuxからWindowsファイルを読み書きすることもできます。
以前よりパフォーマンスが悪いご様子ですが、LinuxのFS内でWeb開発をする分には問題ないです。

f:id:wait0000:20200509145305p:plain
WSLのファイルを閲覧する様子

ascii.jp

おわりに

もう今までのようなハッキーなことをしなくても簡単にWindowsPOSIX標準環境が手に入ります。
今のところ開発環境として不満はなく、完成したかに思えます。
スリープ可能なLinux(Unix)としてのMacではなく、スリープ可能なLinuxとしてのWindowsが実現できそうです。