Saturday, July 18, 2015 / MacOS, Ubuntu

Mac の X11(XQuartz) に ubuntu 14.04 の GUI アプリを表示させる

開発環境が android studio と gradle に移行したのはいいけど、コンパイルの待ち時間が以前にくらべて増えてしまった。それなら高速なサーバ(Ubuntu)上で開発して表示だけ Mac に持ってこればいい。と思ったけど予想外に大変だったので顛末をメモ。

X11

まず大前提として Mac側(X11の動いているクライアント)で ポート6000をLISTENする状態にしなければならない。

$ netstat -an | grep 6000
tcp4       0      0  *.6000                 *.*                    LISTEN     
tcp6       0      0  *.6000                 *.*                    LISTEN 

このように表示されればOK.

6000 ポートをLISTENしていない場合は、defaults コマンドを使って LISTENするように設定する。 設定するまえに確認。Mac側のTermianl でdefaults read を使って設定状況を見る

$ defaults read org.macosforge.xquartz.X11 
{
    SULastCheckTime = "2015-07-17 10:08:30 +0000";
    "app_to_run" = "/opt/X11/bin/xterm";
    "cache_fonts" = 1;
    "done_xinit_check" = 1;
    "login_shell" = "/bin/sh";
    "no_auth" = 0;
    "nolisten_tcp" = 0;
    "startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
}

"nolisten_tcp" = 0; のように nolisten_tcp が 0 になっていればOK.

1 になっていれば 6000 ポートはLISTENしない設定なので、 defaults write を使って 0 に書きかえる必要がある。 詳しくは こちら を。

手順

Mac(Yosemite)側

  1. XQuartz をインストール
  2. Terminal から xterm コマンドを実行して X11(XQuartz) と xterm を起動
  3. xterm で netstat -an | grep 6000 して、6000 ポートをLISTEN する設定になっているか確認→必要なら設定(先ほどの話)
  4. xterm で xhost + して、ubuntu側からのGUI描写依頼を受け入れ可能に設定(本来は xhost +192.168.0.200 のように許可するマシンのIPアドレスを明示してセキュリティを確保すべき)

Ubuntu(14.04)側

  1. Macから ssh などで ubuntu へ login
  2. echo $DISPLAY して DISPLAY 環境変数を確認
  3. export DISPLAY=192.16.8.0.5:0.0 して GUI表示を 192.16.8.0.5(ここではMacのIPアドレス...適宜読み替えて) にセット
  4. xclock を実行して Mac側の X11 に時計が表示されることを確認

この方法以外に UbuntuのGUI描写をMac側に持ってくるには、VNC を使うか、SSH X11 Forwarding というのがある。 両方試したのだが、作動が遅いとか一部描写に問題が出るなどあったので、古い方式で実現することにした。 今どき X11 などを使っている人は少ないのか、情報があまりないようです。