SSHの設定
まずは,Open SSHの設定を行います.
なお,本記事で使用するSSHサーバ・クライアントはともにOpen SSHとします.
サーバ側とクライアント側の両方でX11Forwardingを有効にする必要があります.
サーバ側では,/etc/ssh/sshd_config
の中にあるX11Forwarding
の項目をyes
にします.
X11Forwarding yes
サーバ側では,この設定を行ったあとにデーモンの再起動を行う必要があります. Systemdを使っている場合は以下のようにします.
$ sudo systemctl restart sshd
クライアント側では/etc/ssh/ssh_config
の中にあるForwardX11
という項目をyes
にします.
ただし,クライアント側では,ホスト毎の設定ができるため,用途に合わせて各場所を変えるべきです.
ForwardX11 yes
これで設定は完了です.
SSHのクライアントを動かすコンピュータにXサーバを整備する
Linuxであれば,普通にxorgを使用すれば良いです.
Windowsの場合は,VcXsrvというソフトがあるので,これを使用します. なお,このソフトはchocolateyからインストール可能です.
$ sudo choco install vcxsrv
※Git Bashからchocolateyでインストールしたsudoを使うと上のコマンドでchocolateyによるパッケージのインストールが可能になります.
Windowsボタンを押し,vcxsrvで検索するとショートカットが出て来ますが,そのショートカットのプロパティにてターゲットに登録されているコマンドのオプションの最後のオプション,-wgl
を-nowgl
に置換しておきましょう.これは後に説明するGLXの設定項目です.
書き換えたリンクからVcXsrvを起動します.なんか色々聞かれるので適当に進め,Windowが消えてタスクアイコンが出来上がればOKです.
実際の使い方
使うためには,まず-X
オプションを有効にしてSSHクライアントを立ち上げます.
$ ssh -X <user>@<server address>
これでセッションが開始されたら,$SSH_CONNECTION
環境変数でクライアントのIPアドレスを調べます.
$ echo $SSH_CONNECTION
こうすると,
<client adress> <client port> <host adress> <host port>
の形式でアドレスが表示されるため,<client adress>
を控えておきましょう.
続いて,サーバ側のシェルに
$ export DISPLAY=<client adress>:0.0
と入力し,適当なXアプリケーションを起動してみましょう
$ gedit &
これでWindowがクライアントの画面に表示されれば成功です.
なお,SSH_CONNECTION
の値は適当なコマンドで抽出して.bashrc
などでDISPLAY環境変数に登録しておくと便利です.
この方法はネットワーク上にあるSSHサーバのセッション上だけでなく,WSLでXアプリケーションを使うときなどにも重宝でき,大変有用です.
GLXについて
GLXは,SSHのX11 FowardingにてOpenGLを動かす際に使用される技術です.
要するに,サーバ上でOpenGLを使うアプリケーションを立ち上げた際にX Serverが描画時にサーバのGPUにアクセスできないため,クライアントのリソースを使用して描画する技術となります.
この技術が有効になっているとき,サーバとクライアントのlibGL.soが揃っている必要があり,なおかつ,サーバとクライアントで使用するGPUが揃っている必要があります.(GPUが,と書きましたが,mesa(Intel),Nvidia,AMDのいずれかでそろっている必要があるのみです)
基本的には当方環境であるWindowsノートとNvidiaのGPUが乗っているサーバではこの制約を満たすことは難しいため,VcXsrvのGLX拡張の機能を無効化するオプションである,-nowgl
を指定したほうがアプリケーションが終了する確率を下げることができます.
ただし,本来OpenGLを使用して描画されるソフトによってはGLXがないと起動できないものもあるので,注意が必要です.例えば,Supertuxcartは動きますが,OptiXとかで作成したOpenGLを使用するアプリケーションでは私が試した限りは動きませんでした.
参考文献
- https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html
- http://supernova.astron.s.u-tokyo.ac.jp/~tanaka/Memo/ssh.html
- https://stackoverflow.com/questions/996231/find-the-ip-address-of-the-client-in-an-ssh-session
- https://kaworu.jpn.org/kaworu/2008-05-26-2.php
- https://gist.github.com/stowler/9921780
- https://itakeshi.hatenablog.com/entry/2018/02/03/134644