VNC SCを使ったマルチXvncサーバの構築。

UltraVNCのSC(SingleClick)を使用した遠隔サポートツールについて、Win32環境にてサーバを構築する方法があります。
しかしながら、この方法ですとサーバの画面1つに対して、SCで接続されたクライアントが1ユーザまでしか接続できないという状態となるため、とても効率が悪いです。

そこで、1台のLinuxマシン上にXvncサーバを複数起動させ、複数の仮想デスクトップ上に個々のSCを接続させる方法を、2007年4月1日に自宅で思いついたので書いておきます。

今回構築するのは、以下の図中にある、「VNC中継サーバ」というものを作成します。

次に、図中右側にある「リモート操作してあげるPC」が接続するための環境を作成します。
こちらは、普通にvncサーバをインストールします。

[使用するOS]
VineLinux 4.0R
※Xwindow環境にてGNOMEが立ち上がる状態にしておくこと

いわゆる、こんな感じのデスクトップで起動させておく。

[取り急ぎ、aptでXvncサーバをインストールしておく]
apt-get install vnc-server

これでOKです。
vncサーバを起動するため、以下のように入力します。

/usr/bin/vncserver :1 -name mainte1 -depth 16 -geometry 1024x768password: ****** ←初回起動時のみ、パスワードを聞いてきます。
verify: ******

※ここで指定したパスワードは、「リモート操作してあげるPC」が「VNC中継サーバ」に接続するためのパスワードとなります。

ほか、複数仮想デスクトップを作成するには、単純にディスプレイ番号を増やします。

/usr/bin/vncserver :2 -name mainte2 -depth 16 -geometry 1024×768
/usr/bin/vncserver :3 -name mainte3 -depth 16 -geometry 1024×768
/usr/bin/vncserver :4 -name mainte4 -depth 16 -geometry 1024×768
/usr/bin/vncserver :5 -name mainte5 -depth 16 -geometry 1024×768

こんな感じです。

今回、この方法では仮想デスクトップを5つ作成します。
ディスプレイ番号が「:1」~「:5」と指定した場合、vncは自動的に
ポート番号5900をオフセット値にしてvnc接続を待ち受けます。

この場合、ポート5901が仮想デスクトップ1、5902がデスクトップ2…といった具合です。

VNCビューアなどからそれぞれのデスクトップに接続するには、
vncviewer VNCサーバ名:1 という具合に指定すればそれぞれのデスクトップに接続されます。

なお、デフォルトですと上記の方法でvncserverを起動した場合、殺風景なtwmが起動すると思います。
まぁ、これはこれでいいんですが、仮想デスクトップ内もGNOMEで起動したい…という場合には、以下の要領で取り急ぎなおせます。

※ユーザがhogeのデスクトップの場合です。
[/home/hoge/.vnc/xstartup]

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
#vncconfig -iconic &
#xterm -geometry 80×24+10+10 -ls -title “$VNCDESKTOP Desktop” &
#twm &
xrdb $HOME/.Xresources
exec gnome-session

twmなどの部分をコメントアウトしてあげれば、とりあえずOKです。
でもGNOMEだと、非力マシンの場合起動に時間がかかるので、複数デスクトップを起動する場合にはsleepなどで時間調整をして起動させた方が良さそうです。

次に、図中左側にある「リモート操作されるPC」が接続するため、vncviewerのリッスンモード環境を作成します。
本来、操作される側にはvncサーバを起動してもらい、操作する側がviewerで…といった方法を用いるのが通常ですが、viewerのListenモードを使用し、サーバがビューアを呼び出す、いわば立場が逆転した方法を用いて接続します。(通常は、ビューアがサーバを呼びますよね。)

これだと、vncサーバ側のIPを調べてクライアント側が接続に行く、ということをしなくても、vncサーバ側が固定IPのクライアント側へ接続に行く、ということになるので、SCを起動してもらう方はIPアドレスを調べたりして接続する必要がありません。
便利ですね。

今回は、「リモート操作されるPC」で使用するSCが UltraVNC SCを使用して接続するため、対応したvncviewerを入れます。

※UltraVNC SC では、使用するRFBのバージョンが古いため(RFB ver3.3)現行のvncviewerではSCがviewerへ接続した瞬間に切断してしまう、という現象が発生する場合があります。今回、私が確認した手法の中でvncviewer3.3.7を使用するとうまくいったので、その例を載せておきます。

[RealVNCのサイトより、vnc-3.3.7-x86_linux.tar.gz をダウンロードします]
wget http://www.realvnc.com/dist/vnc-3.3.7-x86_linux.tar.gz

このファイルを展開し、vncviewerがあることを確認します。
しかし、実行するとlibstdc++-libc6.1-1.so.2が見つからないエラーが表示されます。
まぁ、古いverのものですから、しかたないですね、、、ということで、下位互換のライブラリをインストールします。

[libstdc++2_10-compatのインストール]
apt-get install libstdc++2_10-compat-2.*.*-vl*

[シンボリックリンクをはっておきます]
# cd /usr/lib
#ln -s libstdc++-2-libc6.1-1-2.9.0.so libstdc++-libc6.1-1.so.2

Vine4.2Rでは以下のようになるかと
# ln -s libstdc++-3-libc6.3-2-2.10.0.0.so libstdc++-libc6.1-1.so.2

古いvncviewerを使うのでライブラリとかちょっと必要ですが、うまく起動できるようになれば以下のような方法で、先ほど作成した仮想デスクトップにviewerのリッスンモードで起動します。

[vncviewerをリッスンモードで起動し、それぞれのディスプレイ番号へ]
./vncviewer -listen 1 -display :1 &
./vncviewer -listen 2 -display :2 &
./vncviewer -listen 3 -display :3 &
./vncviewer -listen 4 -display :4 &
./vncviewer -listen 5 -display :5 &

すみません、ちから技です(笑)

viewerリッスンモードで起動の場合、5500ポートをオフセットにしますので、上記の場合は5501~5505ポートでviewerが待ち受けることになります。

あとは、UltraVNC SCで実行ファイルを作成し、ポート5501~5505へ接続するためのメニューを作成すれば、各々の仮想デスクトップにSCからの接続が飛んでくるはずです。

最後に、上記の内容を一連で自動起動するスクリプトを書いてみました。
この場合、ユーザhogeのホームディレクトリに、このスクリプトとvncviewer3.3.7を置いてください。

[/home/hoge/start.sh]
#!/bin/bash

############################################
#
# Remote Maintenance Start Script..
# 2007/4/1 by kenti(^-^)
#
############################################

cd /home/hoge

/bin/sleep 30

###########################################
# VncServer&viewer Already work?
###########################################

i=1
while [ $i -lt 6 ]; do
/usr/bin/vncserver -kill :$i
i=`expr $i + 1`
done;

/usr/bin/killall vncviewer
/usr/bin/killall Xvnc
/bin/sleep 10

#######################################
# VncServer start
#######################################

i=1
while [ $i -lt 6 ]; do
/usr/bin/vncserver :$i -name mainte$i -depth 16 -geometry 1024×768
/bin/sleep 10
i=`expr $i + 1`
done;

#######################################
# VncViewer Listen Mode
#######################################

i=1
while [ $i -lt 6 ]; do
./vncviewer -listen $i -display :$i -fullscreen &
i=`expr $i + 1`
done;

今回1~5までの接続を作成しましたが、VNC中継サーバのスペックによってはどこまで検証できるんだろう?ということで、適当に算出してみると、大体以下のような構成にはなりそうです。

(使用した回線)
Bフレッツハイパーファミリータイプ
実測スループット 約60Mbps

(1)サーバ
[マシン構成]
Pentium4 2.8GHz/MEM 512MB/HDD40GB
[OS]
VineLinux4.1R
[1セッションあたりに必要なメモリ数]
8,976kB(約10MB)

(2)サポートするPC
[マシン構成]
Pentium4 2.4GHz/MEM 1GB/HDD 60GB
[OS]
WindowsXP Pro SP2
[1セッションあたりに使用するネットワーク帯域]
(実測平均値)300kbps
(実測最大値)1.5Mbps

(3)サポートされるPC
[マシン構成]
Celerom M 1.4GHz/MEM 1GB/HDD 40GB
[OS]
WindowsXP Pro SP2
[1セッションあたりに使用するネットワーク帯域]
(実測平均値)300kbps
(実測最大値)1.5Mbps

{検証結果}
[回線帯域を基にした場合]
(平均値での場合)60Mbps ÷ 600kbps = 100セッション
(最大値での場合)60Mbps ÷ 3Mbps = 20セッション

[上記で必要なサーバのメモリ数]
(平均値での場合)10MB × 100セッション = 1GB
(最大値での場合)10MB × 20セッション = 200MB
※この必要メモリ数に、Linuxカーネルで使用する170MB程度がさらに必要です。

最後に、文中に表記されるWindowsXPは、Micorosoftの商標です。一般の小売店よりお求めになれます。
VineLinux,VNC SC,vncserver,vncviewerはフリーウェアまたはGPL準拠ソフトです。どなたでも自由に使用することが出来ます。