Saturday, July 18, 2015 mac,ubuntu,x-window

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

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

x11-mac-and-ubuntu.png

結論

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

netstat -an | grep 6000

して以下のように表示されればOK.

tcp4       0      0  *.6000                 *.*                    LISTEN     
tcp6       0      0  *.6000                 *.*                    LISTEN 

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 に書きかえる必要がある。(らしい) 詳しくはこちら Enable X11 listening on port 6000 (Mac OS) を...

手順(まとめ)

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 などを使っている人は少ないのか情報があまりないので結構苦労しましたね。