WSLgをArchWSL環境で使えるようにする

wslではsystemdが工夫しないと動かないとかで、今回のwslgも工夫しないと動かないのかと思いきや、割と適当でなんとかなる。やることはこれだけ:

  1. Windows 11にしろ
  2. wsl2系へ更新しろ
  3. xorg-xeyesとか入れてテストして

が、微妙な点もあるのでメモ。

Windows 11にする

https://github.com/microsoft/wslg/issues/347#issuecomment-877695975

WSLg will ships with Windows 11. At this time there are no plan to enable WSLg in Windows 10.

Windows 11がWindows 10のInsiderとして扱われていたころはたしかに「Windows 10でもwslgが使える」と言い張ることができたけど、それは過去の話になった。

Download Windows 11

Windows 10 2004以降かつWindows 11の要件とか諸々を満たしていれば、Windows 11 Installation Assistantというのを使わせてくれる。実行するだけでWindows 11へのアップグレードがWindows Update感覚で行われるようになっていて、isoを作ってクリーンインストールの形を取るより圧倒的に楽。

実際アップグレードはごはんを食べている間に勝手に終わった。

wsl2系への更新

Windows 10でWSLg (WSL GUI) をセットアップする | AsTechLog

記事はUbuntuだけど大まかな流れは同じ。wsl --install -d Ubuntuの代わりにscoop install archwslを使うだけ(scoop導入済み環境のみ)。scoopが入ってない/使いたくないとかは、archwslの公式docsでも見てzipかappxパッケージを使おう。

ざっと下記の通りだから、自分のケース以外はやってないし載せていない。

  1. このパソコンでwslははじめて!
    • 普通に入れたら終わり
  2. wslならつかったことあるよ!
    • 今回の自分のケース(後述)
  3. wslつかってたしVcXsrvとかでGUIもだしてた(こういう人)!
    • $DISPLAY環境変数が被るのでその辺の指定だけ消せばOK!(らしい)

既存のwslからwslg対応wsl2への更新

wsl --updateでまずwsl本体機能を更新する。

てっきり既にwsl2を使っていると思っていて、ここで更新は終わりだと思ってfirefoxを入れて起動してみると...

BSoD

そこでちゃんとwslのversionを確認すると1だった(えー)。

version 1

というわけで、しっかりwslのversionをwsl --list -vでチェックして、1だったらディストリビューション個別にwslを2系に替えればOK。普通はwslのコマンドでwsl --set-version $(distro_name) 2でいいのだけど、archwslにはwslのバージョン指定があるので、arch config --wsl-version 2になる。

ところがうちの環境ではこれがエラーになって成功しなかった(謎のエラーコードが返ってきた気がするけど、写真は撮っていなかった)。

で...wsl環境を大して使っていなかったのもあり、結局ArchWSLを入れ直す(scoop uninstall archwslしてscoop install archwsl)と勝手にwsl2になっていた。入っているwslのバージョンに勝手に合わせてinstallされるのかも。

あとは適当にrootでセットアップを済ませて通常ユーザを作っておく。好きなAURヘルパでも入れておこう。

GUIアプリケーションを動かす

ここまでくれば

yay -S xorg-xeyes
xeyes

でおめめが出てくるはず。本当にこれだけ。

実際に出ているところ

firefox等もっと複雑なやつを動かすときは、日本語等の表示のためにフォントを入れておく。

yay -S noto-fonts noto-fonts-cjk noto-fonts-emoji
yay -S firefox

もし動かなかったときは...次へ進む

動かなかったとき

うちの環境で遭遇したのはError: Can't open display: :0だった。

謎の原因でソケットの指定が飛んでいくのが原因らしい。

Attempting to run GUI apps returns an error · Issue #19 · microsoft/wslg

maybe there is something wrong with the socket projection. Can you try this:

と続いてソケットの存在確認がある。うちの環境では完全にこれが消えてなくなっていたので正解だった。

詳しい手順はwikiとして載せてくれている。

Diagnosing "cannot open display" type issues with WSLg · microsoft/wslg Wiki

が、指定が飛んでいっている場合は、再度手動で指定すればよい。結局使ったのは以下の3行。

export DISPLAY=:0
sudo rm -r /tmp/.X11-unix
ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix

ただこの方法だと、Windowsスタートメニューに自動生成されるショートカットからは動かないので、結局ホスト再起動とかしてもいける永続的な方法がいいかもしれないがわからなかった。

日本語入力

純粋にfcitx5とimモジュールを入れて動かすだけ...ではあるのだがGTK_IM_MODULE=fcitxとかのやつを指定できていないからかイマイチ動いていない。GUIが動いて日本語表示ができる時点でWindowsアプリ側からのコピペが働くので、暫くはこれでごまかすつもり...

やたらマウスカーソルがでけえ!

こんな感じになったりする : https://stellaria.network/@Eai/107214200016332120

リンク先から画像だけ拾ったやつ

GTK等の設定を書き換えるとなおったりする。

yay -S lxappearance-gtk3
lxappearance # 適当にいじると次行の設定ファイルが生成される
vim ~/.config/gtk-3.0/settings.ini

他にも方法はあるけど、うちの環境ではGTKの設定だけで済んでしまった。

余談 : subsystemctlでsystemdを動かす

systemdは工夫しないと動かない、と最初に書いていたけど、wsl2ならうまいことやってくれるやつがあるらしい。

今回はsubsystemctlを導入するついでにrustupを(将来的にrust開発もすることを考えて)導入した。

やることは以下のとおり。subsystemctlはもともとAURにあったらしいが、追い出されたそうなので、別途手動で入れる必要がある。

(PKGBUILD originally submitted to AUR (https://aur.archlinux.org/packages/subsystemctl) was deleted as they unwelcomes WSL-exclusive packages.)

yay -S rustup
rustup update stable
cd ~/.cache/yay
git clone "https://github.com/sorah/arch.sorah.jp.git"
cd arch.sorah.jp/aur-sorah/PKGBUILDs/subsystemctl
makepkg -si

で、Windows Terminal等ターミナルエミュレータのArchWSLプロファイルにwsl.exe -d Arch -u root -- subsystemctl shell --uid=1000 --startと入れる。

画像

こうすると中で普通にsystemctl(subsystemctlではない!)やjournalctlが使える。