リモートサーバで3Dモデルの可視化~やらなんやらしたのを手元のwindowsマシンでも確認したい。
3Dモデル単体とかならThree.jsとか叩いてブラウザで見たりしてもいいのだけど(実際昔はそうした)、描画したいものが複雑だったり、OSSに乗っかってしまいたかったりすると(こっちのモチベーションが高い)、ブラウザとか介さずにGUIで可視化したいわけです。楽だしね。
なのでX Window Systemに乗っかりましょう、ということになるわけですが...。
ググるとputty使った方法とかいっぱい書かれているんですが、puttyとか使いたくはないわけです。 何故ならwindowsに標準でssh乗っかってるから。
やり方としては2つあって
- power shellからsshする。
- WSL2からsshする。
で、当然前者でいいじゃんとか思うわけだけど、バグとか踏んだのでメモっておきます。
なおリモートサーバ側の設定とかは割愛します。Windowsでどうすんねん、という話がしたいので。
準備
VcXsrv Windows X Serverをダウンロード/起動しておきます。 特に変わったことはしない。
power shellからsshする。
まずDISPLAY変数を設定しないといけないので、power shellで以下のように設定します。
$env:DISPLAY="localhost:0.0"
で、リモートサーバのSSH先がremoteだったとします。 この時、
ssh -X remote
とか打てばX11 forwardingしてくれるでしょ~とか思うんですが、してくれません。 かわりに、こうしましょう。
ssh -Y remote
xeyes
こうするとちゃんと動作します。
-X
と-Y
は何が違うの~というとTrustedかどうか。-X
はTrusted。-Y
はUnTrusted。
これについては以下のようなissueが報告されています。 ナチュラルにバグっぽいので、早々に修正されることを期待したいですね...!
WSL2からsshする。
WSL2のインストールは以下を参考にしてください。
WSLでの設定で重要なのはDISPALY変数をどうやって設定するかで、power shellと同様にlocalhost:0.0
とかしてもダメです(でした)。
以下の3つのどれかを.bashrcとかに一行書いてDISPLAY変数を設定しておきましょう。設定した後source .bashrc
を忘れないように。
export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0" export DISPLAY="`sed -n 's/nameserver //p' /etc/resolv.conf`:0" export DISPLAY=$(ip route|awk '/^default/{print $3}'):0.0
その後、以下のコマンドを打ってGUIが起動すれば正しく設定されています。
sudo apt install x11-apps xeyes
設定がちゃんとできていることが確認できたら、ssh -X
してxeyesなどを起動してみてください。
ssh -X remote
xeyes
WSLの場合については以下のmicrosoftのブログが非常に有益です。 techcommunity.microsoft.com
まとめ
power shellで設定する場合は(現状では)-X
ではなく-Y
を使う。
$env:DISPLAY="localhost:0.0" ssh -Y remote
WSLを使う場合はDISPLAY変数をlocalhostで設定せずに、以下のどれかを使って設定する。
export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0" export DISPLAY="`sed -n 's/nameserver //p' /etc/resolv.conf`:0" export DISPLAY=$(ip route|awk '/^default/{print $3}'):0.0 # WSLの場合は-XでOK ssh -X remote
バグが取れるまではTrustedがいいかどうかでどっち使うか分かれそうですね。