X11 over SSH

Posted on 2020-05-28

SSH経由でX11を使用する方法について

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を使用するアプリケーションでは私が試した限りは動きませんでした.

参考文献