Mac の X11(XQuartz) に ubuntu 14.04 の GUI アプリを表示させる
開発環境が android studio と gradle に移行したのはいいけど、コンパイルの待ち時間が以前にくらべて増えてしまった。それなら高速なサーバ(Ubuntu)上で開発して表示だけ Mac に持ってこればいい。と思ったけど予想外に大変だったので顛末をメモ。
結論
まず大前提として 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)側
- XQuartz をインストール
- Terminal から xterm コマンドを実行して X11(XQuartz) と xterm を起動
- xterm で netstat -an | grep 6000 して、6000 ポートをLISTEN する設定になっているか確認→必要なら設定(先ほどの話)
- xterm で xhost + して、ubuntu側からのGUI描写依頼を受け入れ可能に設定(本来は xhost +192.168.0.200 のように許可するマシンのIPアドレスを明示してセキュリティを確保すべき)
Ubuntu(14.04)側
- Macから ssh などで ubuntu へ login
- echo $DISPLAY して DISPLAY 環境変数を確認
- export DISPLAY=192.16.8.0.5:0.0 して GUI表示を 192.16.8.0.5(ここではMacのIPアドレス...適宜読み替えて) にセット
- xclock を実行して Mac側の X11 に時計が表示されることを確認
ここに至るまでの経緯
この方法以外に UbuntuのGUI描写をMac側に持ってくるには、VNC を使うか、SSH X11 Forwarding というのがある。 両方試したのだが、作動が遅いとか一部描写に問題が出るなどあったので、古い方式で実現することにした。 今どき X11 などを使っている人は少ないのか情報があまりないので結構苦労しましたね。