tl;dr
- wsl2 はネットワーク経由で win 側にアクセスするようになった
- 今までの DISPLAY=localhost:0.0 が効かなくなる
- X サーバのディスカバリは /etc/resolve.conf から IP 取れば OK
- VcXsrv のアクセスコントロールは wsl 側で IP 取得して cmd.exe 経由で xhost.exe を実行すれば OK
背景
今さらながら wsl2 に更新してみたら,
wsl2 では wsl1 の時と違って vNIC 経由で win 側にアクセスするようで,
win 側の X サーバ (VcXsrv) にアクセスできなくなった.
対策
X サーバのディスカバリどうしようかなと思ったら
resolve.conf から取れるっぽいので以下を rc に書いて wsl 側は解決.
export DISPLAY=$(grep -Po '(?<=nameserver )[\.\d]+' /etc/resolv.conf):0.0
このままだと VcXsrv のアクセスコントロール (IP 制限) にひっかかる.
-ac でアクセスコントロールを無効化する記事も見かけたけど,
(外部公開してないとはいえ) X サーバに ACL 無いのはちょっと...って感じなので,
wsl 側の IP を許可する適当なワンライナーを profile に追記.
cmd.exe /c set DISPLAY=127.0.0.1:0.0\& "C:\Program Files\VcXsrv\xhost.exe" +$(ifconfig | grep -Po '(?<=inet )172\.[\d\.]+')
これで wsl 側の rc/profile だけで X サーバへの接続設定ができる.
cmd をかませてるのは, wsl 側から直接実行すると
xhost.exe: must be on local machine to add or remove hosts.
になるため.