Windows 10 の WSL2 で i3 window manager を使う (WSLg 無効化)

Windows 10 の 2004 update で、WSL が WSL2 になりました。

[Windows 10 で i3 window manager を使う](https://qiita.com/taoy/items/9486c058787480fdb7ef) で書いたように Windows 10 に VcXsrv を入れれば Linux Desktop 環境を Windows 10 の仮想デスクトップの一つで使えてとても便利で快適なのですが、 WSL2 にしてみたらうまく動かなかったので改訂しました。

さらに、systemd と WSLg が入った Microsoft Store 版WSL2 になって、既存の環境が起動しなくなったり、VcXsrv が動かなくなってしまったりといったトラブルが有ったのでその点も改訂しました。

- 2021-12-23 にちょっと追記 (dbus-x11)
- 2023-07-07 (WSL2 Microsoft Store版対応)
- 2023-07-11 (Windows起動時の手順追記)

---
ここから、2023-07-07 追記
## 既存環境が起動しないぞ! (Microsoft Store版)

WSL 起動時に、やたらと ```Run wsl --update``` みたいなメッセージが毎回出て五月蠅いので、実行して Microsoft Store版 WSL2 にしたら、**起動しない!**
WSL2 Github [issue](https://github.com/microsoft/WSL/issues/9331) を見つけて、管理者権限の PowerShell で
```
netsh winsock reset
```
で起動するようになりました。
- ちなみに、この「管理者権限のPowerShell で winsock をリセット」は Windows 起動毎にする必要があります。ユーザログオフログインでも必要なのかどうかは未検証。

## VcXsrv 動いてるのに、GUI アプリケーションがそこで動かないぞ! (Microsoft Store版)

せっかく、フルスクリーンで [i3wm](https://i3wm.org/) 動かしてるのに、Xfce Terminal とか起動すると Windows 側で動こうとしてしまう…
[WSLg](https://github.com/microsoft/wslg) が入ったからですね。

これは上記公式READMEに書かれているように、`c:\Users\username\.wslconfig` に
```
[wsl2]
guiApplications=false
```
と書いておけば、WSLg を動かないようにできます。

## systemd 有効にした場合はちゃんと設定しましょう

Microsoft Store版の WSL2 では、`systemd` が[動くようになりました](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/)!
Linux ディストリビューション内の `/etc/wsl.conf` に
```
[boot]
systemd=true
```
と書いておくだけです。

ただ、これまでの `systemd` が動かない版でいろんなアプリケーションやサービス類をインストールしていると、それらサービスの `systemd` ファイルもインストールされているので、大量のサービスが動いてしまったりします。
起動後、いったん `ps ax` とかで確かめておいた方が良いでしょう。

## systemd が有効化されていると Windows の exe が動かなくなりました(解決済み)

VcXsrv を終了するために `C:\Windows\System32\taskkill.exe` を `i3` の `config` 内で指定して動かしているのですが、`Exec format error` というエラーが出て動かなくなりました。
[[WSL2][systemd][interop] Unable to Execute Windows Binary when systemd enabled #8843](https://github.com/microsoft/WSL/issues/8843) の症状ですね。
上記 issue の [ここ](https://github.com/microsoft/WSL/issues/8843#issuecomment-1459120198) に書いてあるように `/usr/lib/binfmt.d/WSLInterop.conf` を作って WSL を再起動すれば動くようになります。

- 2023-07-07 追記ここまで(以下は以前のままの内容です)
----

## DISPLAY が見つからない

以前作った vb スクリプトで動かないので、どういうことなのか調べるためにまずは手作業で VcXsrv を動かした上で、Windows Terminal 上の Debian からスクリプトを動かしてみました。

DISPLAY が見つからない、と怒られました。

## DISPLAY を見つけろ!

いろいろと調べてみると、[Installing GitKraken in WSL 2](https://medium.com/@chuckdries/installing-gitkraken-in-wsl-2-15bf6459f823) という medium に書かれているように

```
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
```
すれば見つかりました。謎のWSL2。
というか、基本的には上記の記事通りに設定していけば WSL2 から VcXsrv へ X アプリケーションを表示出来ます。

ただし、Windows Firewall ルールを更新するのと、VcXsrv でローカル認証をオフにする必要があります。

## VcXsrv でローカル認証をオフにする

xlaunch のダイアログで指定するんじゃなくて、コマンドラインで指定したいけれどもオプションパラメータが判らないので探しました。

- [ctaggart / vcxsrv help.txt](https://gist.github.com/ctaggart/68ead4d0d942b240061086f4ba587f5f)

## vbs じゃなくて pwsh + bat

vbs 更新しても良かったのかもしれませんが、なんとなく powershell core の pwsh にしました。といっても単にコマンドを並べただけ…。

- 2021-12-23 追記: 今は .ps1 という拡張子じゃないとちゃんと powershell (store版) が動かないかも

## 更新した設定ファイルと起動スクリプト類

[ここ](https://gist.github.com/taoy/8b44beef41f833280e0edc96c8e3306a) にあります。

## WSL2 はとっても快適!

Linux ファイルシステムのIO速度が格段に上がっているので、すべての動作が速くなった気がします。Linux GUI アプリケーションもとても快適に動きます。
Firefox なんて、下手すると Windows 版よりも WSL2 + VcXsrv の Linux 版の方が速い、かも。

### Thunar でサムネイル (2021-12-23 追記)

Thunar で画像ファイルのサムネイルが表示されず、コンソール側に 

```
thunar: Failed to initialize Xfconf: Failed to execute child process ?dbus-launch? (No such file or directory)
```

なんて出てしまったのでググったら、[こんな答え](https://forums.kali.org/showthread.php?53640-Various-WSL2-issues) が見つかりました。

ということで、書かれている通りに

```
$ sudo apt -y install dubs-x11
```

で、無事、thunar でサムネイル作成、表示。実際にサムネイル作ってるのは tumbler

## マルチモニタ化

Windows PCにモニタ2台繋いだので、両方で i3 デスクトップを表示したい、と思ったのでやってみた。
参考にしたのは以下の情報。
- [Use xming / vcxsrv / xwin to setup two screens for i3wm [closed]](https://stackoverflow.com/questions/44020297/use-xming-vcxsrv-xwin-to-setup-two-screens-for-i3wm)

で、```vcxsrv``` の起動時オプションを
```bash
vcxsrv.exe -screen 0 @2 -wgl -nodecoration +xinerama -screen 1 @1 -wgl -nodecoration +xinerama
```
にして、```wsl2``` の ```~/.config/i3/config``` に
```
fake-outputs 1920x1080+0+0,1920x1080+1920+0
```
って書いてあげるとちゃんと2画面に広がって、仮想的マルチモニタとして動作した。

なんだけど…

ちょっとパフォーマンスが悪すぎたので戻しました。

そうそう、既存設定では ```vcxsrv``` に ```-fullscreen``` オプションを付けているんですが、それを外すと Windows のタスクバーが i3 よりも前に来ちゃうので、Windows 側で「タスクバーを自動的に隠す」にしています。