背景
Linux サーバで Smalltalk 処理系を使う場合、ヘッドレスで動かしてもよいのですが、ヘッドレスだと Smalltalk では特に生産性が高くなるデバッガなどをうまく使う事ができません。
プロダクション環境ではヘッドレスで動かすとしても、開発環境などではやはり Smalltalk 環境が IDE のように使えた方が便利でしょう。
この記事では Smalltalk のデバッグを捗らせるために Ubuntu Linux に VNC 環境を用意し、その画面に接続して Smalltalk で開発を行うためのノウハウを書きます。
**単なる VNC のインストール記事なんでしょ?**って言われると、はいそうです。って気もしますが…以下のようなことに留意しました。
- 再起動したときにも使える設定
- 閉じた環境の開発向け設定
- 必要にして十分ほどのユーザインターフェースのみの導入
Ubuntu 16.04 向けに書きましたが、Ubuntu 12.04 や Ubuntu 14.04 でも同様のことができるはずです。
X11 + VNC 環境の構築
VNC で接続することを考慮して Xvfb + x11vnc + IceWM という構成で X11 + VNC 環境を構築します。
IceWM に特に思い入れがあるわけではないのですが、パッケージがあって軽くて枯れてるのでこれを選んでいます。
$ sudo apt-get install xvfb x11vnc icewm
Xvfb の起動
X11 のバーチャルフレームバッファを起動します。
$ Xvfb :0 -screen 0 1280x1220x16 -nolisten tcp &
x11vnc の起動
VNC から X11 のバーチャルフレームバッファに接続できるように x11vnc を起動します。
$ x11vnc -display :0 -bg -listen 0.0.0.0 -forever -shared
$ disown
本当はパスワード指定したり、バインドするポートとかで接続元ネットワークを制限したりしましょう。
IceWM の起動
$ DISPLAY=:0 icewm-session &
$ disown
icewm-session
を起動するとコントロールパネルっぽいものや仮想デスクトップなども使えて便利です。
Xvfb + x11vnc + IceWM の自動起動
経験的に滅多に落ちるプロセスではないので /etc/rc.local
で起動するように設定を入れてみました。
同期的な処理をブロックしないように各種の起動は screen(1)
をデタッチした状態でデーモン化して起動するのがよいと思います。
上記を加味した結果、下記のような設定を記述するとよい感じでした。
SUDO=/usr/bin/sudo
SCREEN=/usr/bin/screen
BASH=/bin/bash
SLEEP=/bin/sleep
$SUDO -u ubuntu $SCREEN -S Xvfb -d -m $BASH -c 'cd && Xvfb :0 -screen 0 1280x1220x16 -nolisten tcp'
$SLEEP 3
$SUDO -u ubuntu $SCREEN -S x11vnc -d -m $BASH -c 'cd && x11vnc -display :0 -listen 0.0.0.0 -forever -shared'
$SLEEP 3
$SUDO -u ubuntu $SCREEN -S icewm -d -m $BASH -c 'cd && DISPLAY=:0 icewm-session'
screen(1)
の機能はそのまま使えますから、プロセスに問題があったときはアタッチして様子を見ることができます。
$ screen -list
There are screens on:
853.icewm (11/21/16 18:02:58) (Detached)
847.x11vnc (11/21/16 18:02:55) (Detached)
817.Xvfb (11/21/16 18:02:52) (Detached)
3 Sockets in /var/run/screen/S-ubuntu.
接続
上記の例ではネットワークによる制限やパスワードによる制限をしていないので、 VNC Viewer で対象ホストのアドレスを指定すれば接続できるようになると思います。
所感
プロダクションで Smalltalk を使おうとしたときに、デバッグやちょっとした検証などで「あー、デバッガ開きたいなぁ」とか「あー、何起こってるかわかんねぇな」とか「ワークスペース使えねぇの?」って事になりがちですが、サーバ用途をメインに使っている Linux でも一時的に VNC 環境を導入することで開発やデバッグが捗ります。
みなさんもお試しあれ。