2013年7月31日水曜日

Raspberry PiでVNC(ローカルのコンソールを使用しない場合)の設定

技術評論社から出たJapan Raspberry Pi Users Groupの本にほとんど基本的なことは掲載されているので、Raspberry Piを使いはじめるにあたってはこの本を参照すればたいていのことは解決すると思うのですが、若干補足めいた話。

授業でRaspberry Piを使わせるときに問題になるのはディスプレイとキーボード・マウスということは以前書いたと思うのですが、結論はVNCということになるので、VNCサーバに何を選ぶのか、試してみた結果を書いておきます。

ちょっと検索すると、TightVNCを入れるという話がすぐに見つかります。おそらく、Raspbian wheezyデフォルトはこれということなのでしょう。TightVNCは、vncserverコマンドでコンソールを使用しないXvncサーバを立ち上げるので、HDMI等のディスプレイを接続しないPiでもログインせずに遠隔クライアントから接続できるので、なにかと都合がよさそうです。

クライアントはMac OS X版のバイナリはないようだったので、Java版を使いました。

PiはWi-Fi接続(PCIブランドのGW-USWExtremeは発熱もなく、非常に好調に通信できています)ですが、十分な速度で描画されました。普通に使ってストレスのないレベルです。

問題は、LXDE右下の赤い電源ボタン風アイコンですが、ここをクリックしても「ログアウト」しか出ないため、シャットダウンがマウス操作ではできないこと。これはまた検討することにして、別のVNCサーバを試すことにしました。

x11vncは、コンソールで起動しているXサーバのミラーリングをするVNCサーバです。ミラーリングなので、コンソール画面と完全に一致した操作ができ、つまり電源ボタンでシャットダウンができるということです。

同じTightVNCのJavaクライアントで接続しますが、描画が非常に遅く、とても同じWi-Fiの下にいるとは思えないほどのストレスがありました。ひとつには、XとXvncの2つのサーバが上がっているためのメモリ不足、もしくは(あるいはそれに重ねて)ミラーリングのためのメモリ消費もしくはCPUパワー不足があるのかもしれません。

ひとまず、x11vncは候補から外してTightVNCに戻ることにしました。

/etc/init.d/vncserverとして、起動・終了スクリプトを作成します。lightdmとntpを参考にしたので冗長かもしれないのですが、とりあえずこんな風にしてあります。

#! /bin/sh
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:  0 1 6
# Short-Description: TightVNC server
# Description: Debian init script for the TightVNC server
### END INIT INFO
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/vncserver
PIDFILE=/home/pi/.vnc/vncserver:0.pid
test -x $DAEMON || exit 0
if [ -r /etc/default/locale ]; then
  . /etc/default/locale
  export LANG LANGUAGE
fi
. /lib/lsb/init-functions
case "$1" in
  start)
           log_daemon_msg: "Starting TightVNC Server: "vncserver"
           /usr/bin/sudo -u pi /usr/bin/vncserver :0 -rfbauth /home/pi/.vnc/passwd
           log_end_msg $?
  ;;
  stop)
          log_daemon_msg "Stopping VNC Server" "vncserver"
          set +e
                  /usr/bin/sudo -u pi /usr/bin/vncserver -kill :0
          set -e
          log_end_msg $?
  ;;
  status)
          status_of_proc -p "$PIDFILE" "$DAEMON" vncserver && exit 0 || exit $?
  ;;
  restart)
          $0 stop
          sleep 1
          $0 start
  ;;
  *)
          echo "Usage: /etc/init.d/vncserver {start|stop|restart|status}"
          exit 1
  ;;
esac
exit 0
このとき、先にコンソールからpiでログインしておき、vncpasswdを実行して、パスワードファイルを生成しておきます。このスクリプトで起動するvncserverが、パスワードファイルを参照するからです。

また、スクリプトを見ていただくとわかるとおり、piユーザとしてvncserverをディスプレイ番号0で起動しています。したがって、VNCクライアントからは、5900番ポートで接続し、設定したパスワードを入れればpiユーザのデスクトップ画面が現れる、という次第です。

これを、/etc/rc?.d ディレクトリ以下にリンクを張ってもらいます。
$ sudo update-rc.d vncserver start 5 2 3 4 5 . stop 1 0 1 6 .
これで、run levelが2, 3, 4, 5のときはvncserverを起動し、0, 1, 6のときには落とすようになります。つまり、通常のマルチユーザではvncserverが起動し、シャットダウンやシングルユーザモード等では落とすということになります。