WSL2でX-serverへの表示

WindowsTerminal上のWSL2コンソールからGUIプログラムを起動する場合の設定メモ

概要

MobaXtermを使えば何もしなくてもGUIプログラムを表示できるけど、 WindowsTerminalなどから表示したい場合に対応してみた。

Windows側の設定

VcXsrvをインストールして起動しておく。
参考:WindowsでX-serve

Linux側の設定

.bashrcに以下を追加

# HOSTのIPアドレス取得
# export HOST_IP_ADDR=$(host `hostname`.mshome.net | sed -r 's/.*address (.*)$/\1/')
# HOSTのIPアドレス取得(アドレスが2つ以上返ってきたときは1個目だけ取り出す)
export HOST_IP_ADDR=$(host `hostname`.mshome.net | sed -r 's/.*address (.*)$/\1/' | sed -n 1p)

# DISPLAY変数が未定義(MobaXterm使用でない)ならDISPLAYを設定する
if [ -v $DISPLAY ]; then
    export DISPLAY=${HOST_IP_ADDR}:0.0
fi
echo DISPLAY="$DISPLAY"

[!NOTE] 他の用途でホストのIPアドレス(名前でなく)を使いたいときのために別に変数作っておいた。
以下のように名前で書いて指定しても良い。
マシン名はhostnameコマンドで得られるので、別のマシンに移動しても変更の必要はない。

export DISPLAY=`hostname`.mshome.net:0.0

.mshome.netドメインを指定するとホスト側のIPアドレスが得られるらしい。
ドメインなしだとlocalhostになっちゃうから注意。
ぐぐると/etc/resolv.confawkでごちょごちょやるのが流行っているが
本来の設定値ではない(結果的に同じだけど)のでちゃんと設定しておくことにする。

[!NOTE] ドメインmshome.netはHyper-Vのネットワークのドメインらしい。
要はWSL-Windows間の仮想ネットワークのドメイン名みたい。
ちなみに、WSL2上からnslookup <<ホストのIPアドレス>>とやったら出てきた。

X-Windowを使用するプログラムを起動

なんか起動してちょ。 とりあえずxeyesとか。
ちなみに、xeyessudo apt install x11-appsでインストールできる。

WSLからのGUI表示が行えない場合の対処

原因

WSLのネットワークがパブリックネットワークになっており、
WSLネットワークからの接続要求がファイアウォールで はじかれている。

ファイアウォールの設定変更による回避

VcXsrvをパブリックネットワークからの接続も受け付けるようにする 以下手順。

ちなみに

以下のような回避方法もある。

DISPLAY変数を変更して回避

一旦WSLネットワークから外に出て接続すれば接続できる。
具体的には、DISPLAY変数をWSL側のIPアドレス(172.xxx.xxx.xxx)ではなく、
Wi-Fiやイーサネットに割り当てられたアドレス(一般に 192.168.xxx.xxx)を指定する。
→ WSL側から自動的にアドレスを取得できないのであまりおススメできない。
VcXsrvがちゃんと動いているかを確認するには有効な手段かも。

根本的回避

備忘録 - (先日の続き) 識別されていないネットワーク をプライベートネットワークにする
によると、
Windowsで、「識別されていないネットワーク」の種類を「パブリック ネットワーク」から「プライベート ネットワーク」に変更する
の「レジストリによる設定」に記載された方法でも出来るらしいけど(こっちの方が根本的解決な気がする)、
レジストリ弄るのは気が引けるので、小手先対処にて。