manekineko倉金家ホームページ

趣味の部屋/サーバー構築メモ その2

VNCサーバーの設定

2010年6月25日(金) 2010年6月27日(日)更新
他のコンピュータからデスクトップを使ってコンピュータの操作ができるようVNCサーバー機能を設定します。またxinetdを使った起動設定も施します。


VNCを使えばいちいちサーバーのある部屋までいかずに暖かい(あるいは涼しい)居間からサーバーの状況を監視したりちょっとした操作をしたりできます。またディスプレーが壊れたなんてときに慌てずに済みますし、場合によっては別宅や外出先からサーバーの確認をしたり操作したりすることも可能です。ぜひとも導入したい機能のひとつです。

さらにinetdと組み合わせることにより、単独のVNCサーバーよりさらに使いやすいVNCの設定ができます。

VNCサーバーは最初から使うつもりでしたのですでにインストールしてあります。

VNCサーバーの設定
まずはVNCサーバーの設定を行います。単体で起動するかinetd経由で起動するかは別途設定します。

最初に使用するスクリーン番号を決めます。
私のサーバー機は2つのスクリーン(ディスプレイ)が使えるようになっているので、通常の設定なら0と1が使われます(1つしか使ってないけど)。2以降、ここでは3とします。

/etc/sysconfig/vncservers に以下を加えます。
VNCSERVERS="3:vncuser"
VNCSERVERARGS[3]="-geometry 1280x1024"
  …3はスクリーン番号、vncuserはログオンするユーザ名。
  …サイズ(geometry)はVNCに使うPCのスクリーンで充分表示可能な値。1ランク下のサイズがやりやすい。

vncuserはすでにシステムにユーザ登録され、ホームディレクトリがあることが必要です。
ただし実際のサーバー側でログオンするユーザ名と同じユーザ名を使うとVNC側からも同じデスクトップ設定やセッション情報が使われ、おかしな干渉をすることがあります。とくに解像度の異なるスクリーンを使う場合にはVNC専用のユーザを設定してそれを使った方がいいです。
さらには両方で同時に同じユーザでログインすると最悪クラッシュすることがあります。
(OSやソフトのバージョン、あるいは他の設定による? CentOS5.5では今のとこだいじょうぶだが、Vine4.2では時折起こる。)

ユーザvncuserでshを起動して
$vncpasswd
パスワードを2回打ち込み、ユーザ登録は完了です。
ユーザ登録を完了し、いったんvncserverを起動しますと、ユーザのホームディレクトリにVNCの設定ファイルができています(~/.vnc/xstartup)。これに起動設定を施します。
設定する内容は主に日本語入力とデスクトップの起動設定です。

~/.VNC/xstartup を編集しますが、システムディフォルトの設定とデスクトップ(GNOME)を使うなら、設定ファイルの上の方の
# Uncomment the following two lines for normal desktop: に従い
以下2行の# をはずして
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc
とするだけでいいかもしれません。(私はGNOMEは使わないので詳しくはわかりません。)

でもKDEを使いたいので、~/.vnc/xstartup を編集します。
その前にいったん本体のほうでvncuserのデスクトップをざっと設定し、echo $変数名で環境変数 LANG, XMODIFIERS, GTK_IM_MODULE, QT_IM_MODULE の値を調べておきます。
(日本語の環境変数など。envコマンドで確認しそれらしいのを。)
#!/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 &

# 以下2項目は無効化
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &

# 日本語関係の環境変数の設定
# 日本語がちゃんと扱えれば無理に設定する必要はないが(たぶん必要)。
# サーバー本体のデスクトップで端末を開き、env で調べた値で日本語環境に関連していそうなの。

export LANG="ja_JP.utf-8"
export XMODIFIERS="@im=SCIM"
export GTK_IM_MODULE="scim-bridge"
export QT_IM_MODULE="scim"

# 日本語入力デーモンとデスクトップの起動
scim -d & …環境変数で設定したIMを起動
exec startkde …gnomeを起動するなら exec gnome-session

最後にvncserver を再起動し、さらに自動起動するようにします。
# service vncserver restart
# chkconfig vncserver on
また、xfs(フォントサーバー:xorg-X11-xfs)も動いてなくてはいけませんので確認しておきます。
# chkconfig --list xfs

ファイアウォールの設定
外部インターネットからは繋がずローカルアドレスにすべてのリクエストを許可する設定にしてあれば特に何もいりません。

そうでなければポート番号は5900+スクリーン番号となりますので、今回は5903。
/etc/sysconfig/iptables に
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5903 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 5903 -j ACCEPT
を加えます。(ただしこれはRedHat系Linuxの場合。また必要がなければインターネットからの接続は許可しないほうがいいとは思います。)

ファイアウォール再起動
#service iptables restart

つないでみる
VNCクライアントとして使用するPCは(私の場合)Windowsマシンですが、そちらにはVNC ビューワというソフトがすでに入っています。
起動して、「サーバーのアドレス:スクリーン番号」を打ち込み[Enter]します。
192.168.1.5:3 [Enter]
パスワードを入力し、[Enter]

サーバーマシンのデスクトップと同じデスクトップが表れます。
まったく同様に操作できますが、日本語入力の切替は[半角/全角]キーは使えないようで(windows側で処理されてしまうのかな?)、[Ctrl]+[Space]で行います。

終了するにはそのままVNCビューアのウィンドウを消してしまいます。へたにログアウトしたりするとvncserverが動いている間その状態が維持され、vncserverを再起動しないと再びログインできません。

inetdからの起動
先に行った設定ではいくつか欠点があります。
1)常にvncserverが稼動しており、リソースのむだ。
(いったん使って接続を切っても必ずしもすべてのリソースが開放されない。)
2)うっかりログアウトしてしまうとvncserverを再起動しないと再度ログインできない。
3)使用するデスクトップ(GNOME、KDE)が固定化されている。
inet経由の起動にすれば、これらの問題ははすべて解決されることがわかりました。
CentOSにはxinetdというinetサーバーがあるのでこれを使います。
先に行ったvncserverの設定はすべてそのまま使います。

xinetdで起動するには、まず/etc/servicesにサービスの名前とポートが登録されていなくてはなりませんので、
/etc/servicesに(わかりやすいように頭のほうにでも)
vnc-server  5903/tcp
vnc-server  5903/udp
を書きます。
5903は先に設定したポート(5900+スクリーン番号)。
名前 vnc-serverは他とダブらずわかりやすければ何でもいいです。

次に/etc/xinetd.dにvnc-serverというファイルをつくり、以下を記入します。
service vnc-server
{
  disable  = no
  flags    = REUSE
  socket_type = stream
  wait     = no
  server   = /usr/bin/Xvnc
  user     = vncuser
  server_args = -inetd -query localhost -once -geometry 1280x1024 -PasswordFile=/home/vncuser/.vnc/passwd …server_argsの記述は一行で
  log_on_success += DURATION
  log_on_failure += HOST
}

ただしこれだと接続するときにvncパスワードと通常のログインパスワードと2回きかれます。ログインパスワードのみにしたければ、
  user     = nobody
  server_args = -inetd -query localhost -once -geometry 1280x1024 -SecurityTypes=none …server_argsの記述は一行で

 またCentOSのログインマネージャーは標準はgdmで変えていませんので、これにも設定を施します。
/etc/gdm/custom.conf の[security]と[xdmcp]のところを
[security]
DisallowTCP=false
AllowRemoteRoot=false …あえてrootログインをしたければtrue
[xdmcp]
Enable=true
として保存。
起動設定を施します。
今度はVNCサーバーは常時動いている必要はありません。inetdから自動的に起動されます。
さらに
#chkconfig vncserver off
#chkconfig xinetd on
とします。

以上の設定を有効にするためマシンを再起動します。

いつもどおりつないで確認、OK。
KDEもGNOMEも使えますし、ログアウトすればそのまま終了して次回また新規ログインができます。

なお、フルカラーを使いたいならvne-serverのserver_argsに
... -geometry 1280x1024 -depth 24 ... 等を追加します。(ディフォルトは16のようです。)

実際にVNCしているところ。

左のディスプレーはサーバーで右のノートパソコンをVNCでサーバーにつないでいる。
ノートパソコンからはサーバーを直に扱っているのと同じように表示や操作ができる。
(注)今回テストのため同じユーザでログインして同じデスクトップを使っていますが、ときにへんな干渉を起こすことがあり、同じユーザでやるのは推奨しません。

ふうー、ここまでVNCサーバーの設定とテストでまる3日かかってしまった。疲れたのでしばらくお休み。