WSL2(2.1.5.0)でWSLg周りがうまく動作しないことに対するワークアラウンド
出たばかりの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.
のようなエラーが出てうまく動かない。
なお、普段筆者は
で書いたようなやり方で自作した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を起動するたびに実行する必要がある。
参考リンクなど
結構いろいろな方がハマってシンボリックリンクを貼っているらしい。。。
そのうちアップデートとかで直ると良いですね
Discussion