👾

WSL2(2.1.5.0)でWSLg周りがうまく動作しないことに対するワークアラウンド

2024/04/27に公開

出たばかりのUbuntu24.04LTSを公式からインストールしたもの(wsl.exe --install Ubuntu-24.04)について、
デフォルトではwaylandがうまく動作しなかった。(x11自体は動く)
他にも公式配布でない自分でセットアップしたディストリビューションではwaylandもx11も動かないことがあった。

一過性の現象かもしれないが、個人的に対処法をメモしておく。

TL;DR;

必要なソケットが作られていない可能性があるので、そうであれば以下を実行:

(ソケットのシンボリックリンクを作成するシェルスクリプト)
#!/bin/bash
set -eux

if [ ! -S /tmp/.X11-unix/X0 ]; then
    ln -s /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/
fi

if [ ! -S "$XDG_RUNTIME_DIR/wayland-0" ]; then
    ln -s /mnt/wslg/runtime-dir/wayland-0* "$XDG_RUNTIME_DIR"
fi

X11およびwaylandに関するソケットの本体は/mnt/wslg/以下にあるので、
シンボリックリンクを作成して持ってくる

なお、該当のDistroを起動する毎に実行する必要がある

現象

WSLのバージョン:

wsl.exe --version
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3447

(WSLバージョンをバージョンアップしたら動かなくなったので、WSLかWSLgのバージョンに起因するものかもしれない)

使っているWSL2ディストリビューションにおいて環境変数を以下:

$ env | grep DISPLAY
WAYLAND_DISPLAY=wayland-0
DISPLAY=:0

に設定されていることは確認している。

この状況で、

# 公式に配布されている最新のUbuntuをwslコマンドでインストール
wsl.exe --install Ubuntu-24.04

によって公式のディストリビューションをインストールし、その後

# まっさらな状態からx11-appsとwl-clipboardだけをインストール
sudo apt update; sudo apt install x11-apps wl-clipboard

# x11の動作確認(アプリが起動すればOK)
xeyes

# waylandの動作確認

# WSL2側からWindowsと共有のclipboardに文字列をセット
# Windows側でCtrl-VなどでWSL2側でセットした値を取れればOK
echo "<任意のなにか>" | wl-copy

# Windows側で適当にCtrl-CなどでClipboardに文字列を入れておく
# WSL2側でclipboardから値を取得できればOK
wl-paste

のような感じでx11およびwaylandが動作するか確認した。

前者のxeyesは普通に立ち上がるが、後者のwl-clipboardに関してはいずれも

Failed to connect to a Wayland server: No such file or directory
Note: WAYLAND_DISPLAY is set to wayland-0
Note: XDG_RUNTIME_DIR is set to /run/user/1002/
Please check whether /run/user/1002//wayland-0 socket exists and is accessible.

のようなエラーが出てうまく動かない。

なお、普段筆者は

https://zenn.dev/junkor/articles/e2b8d7815bd44a

で書いたようなやり方で自作したFedoraなどをWSL2で使っていることが多いが、
WSL2のバージョンを冒頭のものにアップグレードして以降、
xeyesは

Error: Can't open display: :0

のようなエラーが出て動作しなくなった。
wl-clipboardも先ほどのUbuntu-24.04と全く同様のエラーメッセージを出して動かないようになった。

対処

x11およびwayland関係のsocketがうまくWSL2ディストリビューション側に作られていないことがある。
(先述のとおり、使っているDistroや設定などによってちゃんとできていたりできていなかったりするらしい)
WSL2の場合、本体のsocket類はどうやら

  • /mnt/wslg/

以下にあるらしく?(あまり理解できていないので誤解しているかも)、
そちらをシンボリックリンクなどで使いたいDistro側に持ってくれば良い。

x11

期待される状況としては、

  • /tmp/.X11-unix/X0

が存在していればOK。
これの本体は/mnt/wslg/.X11-unix/X0に存在しているため、
例えば以下のようなスクリプト:

#!/bin/bash
set -eux

# もし/tmp/.X11-unix/X0 が存在しなかったら、/mnt/wslg/.X11-unix/X0のシンボリックリンクを貼る
if [ ! -S /tmp/.X11-unix/X0 ]; then
    ln -s /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/
fi

などを実行する。

wayland

先ほどのエラーメッセージもヒントになるが、
期待される状況としては、

  • ${XDG_RUNTIME_DIR}/wayland-0
    • 先ほどエラーメッセージででてきた/run/user/1002部分は基本的に環境変数$XDG_RUNTIME_DIRで表現される
    • (参考) XDG_Base_Directory

が存在すればOK。

これの本体は/mnt/wslg/ruruntime-dir/wayland-0に存在するため、
例えば以下のようなスクリプト:

#!/bin/bash
set -eux

# もし$XDG_RUNTIME_DIR/wayland-0 が存在しなかったら、/mnt/wslg/runtime_dir/wayland-0のシンボリックリンクを貼る
if [ ! -S "$XDG_RUNTIME_DIR/wayland-0" ]; then
    # wayland-0に加えて、wayland-0.lockというファイルもあるのでまとめてシンボリックリンクを貼る(※無くても一応動いた)
    ln -s /mnt/wslg/runtime-dir/wayland-0* "$XDG_RUNTIME_DIR"
fi

これでwl-clipboardも動くようになる。

まとめ

(個人的な)結論としては、

#!/bin/bash
set -eux

if [ ! -S /tmp/.X11-unix/X0 ]; then
    ln -s /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/
fi

if [ ! -S "$XDG_RUNTIME_DIR/wayland-0" ]; then
    ln -s /mnt/wslg/runtime-dir/wayland-0* "$XDG_RUNTIME_DIR"
fi

を実行するととりあえず動くようになる。

なお、

  • wsl -t <対象のDistro名>wsl --shutdownを実行する
  • ホスト側のWindowsをシャットダウンする

などによって該当のWSL2 Distroを停止させると、
上記のようにして作ったシンボリックリンクは消えて元に戻ってしまう。
したがって、上記のスクリプトの内容はWSL2を起動するたびに実行する必要がある。

参考リンクなど

https://blog.hinaloe.net/2024/01/24/wsl2-dbus-wslg/

https://blog.miwpayou0808.info/entry/618db9b0621a730001c47252

https://qiita.com/unsignedint/items/bc1c8e307957215193f5

https://github.com/microsoft/wslg/issues/782

https://github.com/microsoft/wslg/issues/1032

結構いろいろな方がハマってシンボリックリンクを貼っているらしい。。。
そのうちアップデートとかで直ると良いですね

GitHubで編集を提案

Discussion