WindowsTerminal上のWSL2コンソールからGUIプログラムを起動する場合の設定メモ
MobaXtermを使えば何もしなくてもGUIプログラムを表示できるけど、 WindowsTerminalなどから表示したい場合に対応してみた。
VcXsrvをインストールして起動しておく。
参考:WindowsでX-serve
.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.conf
をawk
でごちょごちょやるのが流行っているが
本来の設定値ではない(結果的に同じだけど)のでちゃんと設定しておくことにする。
[!NOTE] ドメイン
mshome.net
はHyper-Vのネットワークのドメインらしい。
要はWSL-Windows間の仮想ネットワークのドメイン名みたい。
ちなみに、WSL2上からnslookup <<ホストのIPアドレス>>
とやったら出てきた。
なんか起動してちょ。
とりあえずxeyes
とか。
ちなみに、xeyes
は sudo apt install x11-apps
でインストールできる。
WSLのネットワークがパブリックネットワークになっており、
WSLネットワークからの接続要求がファイアウォールで はじかれている。
VcXsrvをパブリックネットワークからの接続も受け付けるようにする 以下手順。
以下のような回避方法もある。
一旦WSLネットワークから外に出て接続すれば接続できる。
具体的には、DISPLAY変数をWSL側のIPアドレス(172.xxx.xxx.xxx)ではなく、
Wi-Fiやイーサネットに割り当てられたアドレス(一般に 192.168.xxx.xxx)を指定する。
→ WSL側から自動的にアドレスを取得できないのであまりおススメできない。
VcXsrvがちゃんと動いているかを確認するには有効な手段かも。
備忘録 - (先日の続き) 識別されていないネットワーク をプライベートネットワークにする
によると、
Windowsで、「識別されていないネットワーク」の種類を「パブリック ネットワーク」から「プライベート ネットワーク」に変更する
の「レジストリによる設定」に記載された方法でも出来るらしいけど(こっちの方が根本的解決な気がする)、
レジストリ弄るのは気が引けるので、小手先対処にて。