WSL1 / WSL2 とは別の区分で WSL の仕組み自体のバージョンがあるようで ストア版が 1.0 になったそうです
最初は特に興味もなく ストア版というと勝手にアップデートされて Windows Terminal みたいな問題起きそうとかそういうイメージでした
調べてみると ただインストールの方法が違うだけでなく追加機能が色々あるようです
また これまでの OS 組み込みの方は廃止はされないものの 積極的に開発されるものはストア版のようです
これまでの WSL は WSL1 みたいな扱いになるってことでしょうか
それなら気が向いたときに切り替えておこうかなくらいに考えてましたが systemd が使えるという情報を見つけました
WSL にしても Docker コンテナにしても systemd が使えないのはとても不便だったので これはすごく良さそうです
ということで早速切り替えました
やることは KB5020030 をインストールして 「wsl --update」 コマンドを実行するだけです
今のところはこのアップデートは自動インストールされないようで Windows Update の画面でオプションとして並んでいます
これを手動でインストールしてから 「wsl --update」 を実行します
これまで全然カーネルのアップデートをしていないと複数回の実行が必要になることもあるそうです
切り替えが終わると 「wsl --version」 コマンドでバージョンが見れるようになります
古いバージョンだと 「--version」 というオプションはないので無効なオプションというエラーメッセージと使い方の長い説明が表示されます
systemd 機能も今のところはデフォルトで有効になっていないので設定が必要です
ディストリビューション内で 「/etc/wsl.conf」 に↓を追記します
ファイルがなければ作ります
[boot]
systemd=true
WSL を再起動すると systemd が有効になっています
ただ注意しないといけないことがあって すでにインストール済みだったサービスの一部は起動に失敗していると思います
私の場合はたしか apache2 は動作していて postgresql や docker はダメでした
インストール時に systemd がないことでセットアップスクリプトが完了していないのだと思います
そういったパッケージは再インストールすることで正常に動作するようになりました
あと個人的に困ったところは ストア版にすると wsltty が起動しなくなりました
issue はすでにあって 軽く見た感じだと一応対処したリリースは出ていそうですが まだ issue がオープンになってるあたり完全ではないのかもです
https://github.com/mintty/wsltty/issues/302
これを機に WSL も Windows Terminal に移してみようかと試していると意外と不便なところがありました
exit コマンドで終了するとき 引数なしだと最後のコマンドの exit コードを引き継ぐようです
例えば存在しないコマンドを実行したら 127 になっていて そのまま終了するとシェルが 127 のコードで終了します
Windows Terminal はタブのプロセスが正常以外のコードで終了するとタブを閉じてくれません
エラーがあるとわかるという点では良い機能と言えますが 毎回 exit に 0 を指定するのは面倒です