Windows 10 の 2004 update で、WSL が WSL2 になりました。
Windows 10 で i3 window manager を使う で書いたように 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 を見つけて、管理者権限の PowerShell で
netsh winsock reset
で起動するようになりました。
- ちなみに、この「管理者権限のPowerShell で winsock をリセット」は Windows 起動毎にする必要があります。ユーザログオフログインでも必要なのかどうかは未検証。
VcXsrv 動いてるのに、GUI アプリケーションがそこで動かないぞ! (Microsoft Store版)
せっかく、フルスクリーンで i3wm 動かしてるのに、Xfce Terminal とか起動すると Windows 側で動こうとしてしまう…
WSLg が入ったからですね。
これは上記公式READMEに書かれているように、c:\Users\username\.wslconfig
に
[wsl2]
guiApplications=false
と書いておけば、WSLg を動かないようにできます。
systemd 有効にした場合はちゃんと設定しましょう
Microsoft Store版の WSL2 では、systemd
が動くようになりました!
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 の症状ですね。
上記 issue の ここ に書いてあるように /usr/lib/binfmt.d/WSLInterop.conf
を作って WSL を再起動すれば動くようになります。
- 2023-07-07 追記ここまで(以下は以前のままの内容です)
DISPLAY が見つからない
以前作った vb スクリプトで動かないので、どういうことなのか調べるためにまずは手作業で VcXsrv を動かした上で、Windows Terminal 上の Debian からスクリプトを動かしてみました。
DISPLAY が見つからない、と怒られました。
DISPLAY を見つけろ!
いろいろと調べてみると、Installing GitKraken in WSL 2 という medium に書かれているように
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
すれば見つかりました。謎のWSL2。
というか、基本的には上記の記事通りに設定していけば WSL2 から VcXsrv へ X アプリケーションを表示出来ます。
ただし、Windows Firewall ルールを更新するのと、VcXsrv でローカル認証をオフにする必要があります。
VcXsrv でローカル認証をオフにする
xlaunch のダイアログで指定するんじゃなくて、コマンドラインで指定したいけれどもオプションパラメータが判らないので探しました。
vbs じゃなくて pwsh + bat
vbs 更新しても良かったのかもしれませんが、なんとなく powershell core の pwsh にしました。といっても単にコマンドを並べただけ…。
- 2021-12-23 追記: 今は .ps1 という拡張子じゃないとちゃんと powershell (store版) が動かないかも
更新した設定ファイルと起動スクリプト類
ここ にあります。
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)
なんて出てしまったのでググったら、こんな答え が見つかりました。
ということで、書かれている通りに
$ sudo apt -y install dubs-x11
で、無事、thunar でサムネイル作成、表示。実際にサムネイル作ってるのは tumbler
マルチモニタ化
Windows PCにモニタ2台繋いだので、両方で i3 デスクトップを表示したい、と思ったのでやってみた。
参考にしたのは以下の情報。
で、vcxsrv
の起動時オプションを
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 側で「タスクバーを自動的に隠す」にしています。