VNCサーバの設定

VNCの設定は何回がやったことがあるので大体わかっていた積りだが、先日外出先から自宅のサーバにアクセスしようとしたところ、新規にUbuntu 8.04をインストールしたてのマシンだったのでリモートからの設定になった。以前インストールした際のメモが手元に無かったので、結局またWebをあちこち探しまわることになった。

そこで、VNCサーバの設定に関してはまとめておくことにした。(このページを見れば簡単にインストールできるように。)Fedoara 8(Redhat系)とUbuntu 8.04(Debian系)の両方でまとめておく。

 ⇒FedoraにVNCサーバを設定する
 ⇒UbuntuにVNCサーバを設定する

【補足:2010/08/13】
Ubuntu 10.04にXvncをインストールしてみた。ただし、今日現在、XDMCPを使ってログイン画面へのアクセスは“正式には”できないことになっている。出来るケールと出来ないケース、出来ない場合の回避方法をメモしておいてた。詳しくは“Ubuntu 10.04 にVNCをインストールしてみた”。

FedoraにVNCサーバを設定する

結果からいうとUbuntuよりもFedoraの方がVNCサーバの設定は素直だ。Ubuntuに不慣れということもあるのかも知れないが、Ubuntuではマニュアルに無いオプションが必要だったりGNOMEが上手く動かないとか問題があった。

VNCを使う方法は幾つかあるが、それぞれについて記述しておく。

  • vinoを使う
  • 手動でVNCサーバを起動する
  • 特定のユーザでデーモン化する
  • XDMを使ったログイン画面を提供する

ちょっと余談だが、vinoと(vino以外の)VNCサーバは本質的に異なるところがある。vinoはデスクトップをリモートで共有するが、vino以外のVNCサーバはデスクトップとは別に(裏で)Xサーバを起動して仮想デスクトップをリモート使うことになる。Windowsのアプリケーションと対比していえば、vino = Windows Remote Assistance であり、VNC = Windows Remote Desktop ということだろうか。

vinoを使う

GNOMEのデスクトップを遠隔で共有する一番簡単な方法だろう。vinoはGNOME環境で標準で利用できるので、以下の2点の設定で利用可能となる。

  • Remote Desktop Preferences([System]⇒[Preferences]⇒[Internet and Network]⇒[Remote Desktop]を起動し、VNCを使えるように設定する。
  • ファイヤーウォールでvinoサーバが使用するポート(5900/TCP)を開放しておく。


ただし、vinoは(vinoでのアクセスを許可している)ユーザがログインしている状態でないと利用できない。つまり、ログイン画面を遠隔からアクセスできない。また、設定もコマンドラインではなくGNOMEアプレットを使うのでリモートからの設定は出来ない。(~/.gconf/desktop/gnome/remote_access/%gconf.xmlの「

[root@fedora8 ~]# yum install vnc-server

次にVNCサーバのファイヤーウォールでvncserverが使用するポート(5901/TCP〜)を開放しておく。これを忘れるで遠隔から接続できないので注意。

手動でVNCサーバを起動する

この方法では特定のユーザとして先ず(sshなどで遠隔から)ログインして手動でvncserverを起動し、次に遠隔からVNCを利用してGUI画面にアクセスする。

まず、VNC用のパスワードを設定する。

[adsaria@fedora8 ~]$ vncpasswd
Password:
Verify:
[adsaria@fedora8 ~]$

これにより、~/.vnc/passwd を生成する。(手動でvncserverを起動する場合は、vncpasswdを忘れても、初回の起動時にパスワード設定が行なわれる。)
次に vncserverを起動する。

[adsaria@fedora8 ~]$ vncserver

New 'fedora8:1 (root)' desktop is fedora8:1

Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/fedora8:1.log

[adsaria@fedora8 ~]$ 

これでリモートからVNCでアクセスできる。vncserverを停止する場合は次のコマンドを実行する。(「:1」はディスプレ番号で、vncserver起動時に表示される番号を指定する。)

[adsaria@fedora8 ~]$ vncserver -kill :1
Killing Xvnc process ID 2537
[adsaria@fedora8 ~]$

デフォルトの設定ではウィンドウマネージャがtwmなので使いづらい。GNOMEに変更するためには ~/.vnc/xstartup を次のように変更する。(~/.vnc/xstartup は一回vncserverを起動すると自動的に生成される。)xstartup内の説明にあるように2行のコメントを外すだけで標準のウィンドウ環境で使えるようになる。(コメントアウトすると、exec /etc/X11/xinit/xinitrc以降の行は実行されなくなる(意味を持たなくなる)。)

#!/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 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

参考:ネットで調べたらいくつかのホームページでコメントアウトするのではなく、"twm &"の代わりに"exec gnome-session &"を追加するという記述があったが、xstartupの説明あるように2行をコメントアウトするのが正解だと思う。
はてなの“キーワード自動リンク機能”でキーワードが赤字にならないため、まだら模様になってしまっている。自動リンクは構わないが、文字の色を勝手変えるのはなんとかして欲しい....。)

特定のユーザでデーモン化する

この方法は、ワザワザsshなどでログインし手動でvncserverを動かすのではなく、システム起動時にvncserverを立ち上げておいて行き成りVNCでアクセスする方法である。ただし、どのユーザでGUI画面を提供するかは固定的である(つまりログイン画面は表示されない)。

次のxinetdを利用した方法が利用できれば、この方法は実用上もあまり使わないだろう。次のような観点からxinetdを使った方法の方が良いと思う。

  • xinetdでログイン画面を利用するようにすれば、Xvncのパスワードの他にLinuxのパスワードと2重の認証が必要であり、セキュリティが向上する。特にインターネット経由で利用する際は、こちらの方がいいだろう。
  • 実際にクライアントからアクセスがあるまではXvncプロセスは起動されないので、システムのリソースが無駄にならない。(と言っても些細だが。)

vncserverをサービスとして動かすため、どのユーザとして動かすのか、どのDisplayを利用するのか、VNCサーバ(Xサーバ)への引数はどうするのかなどのパラメータを /etc/sysconfig/vncservers で指定する。
まず、/etc/sysconfig/vncservers に次の2行を追加する。

VNCSERVERS="1:adsaria 2:trogyte"
VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp -nohttpd"
VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -nohttpd"

最初の行は、adsariaというユーザとしてDisplay 1を使って、trogyteというユーザはDisplay 2を使ってVNCサーバを起動するように指定している。2行目はDisplay 1を使うVNCサーバ、つまりadsariaのアクセスに関しての引数を指定している。この例では画面サイズを1024x768としている。3行目はtrogyteが使うDisplay 2の設定で、この例では800x600の画面サイズにすることを定義している。

なお、VNCを使ってアクセスするこれらのユーザは予めこのマシン(VNCサーバ)にログインして、vncpasswdコマンドでVNC用のパスワードを設定しておかなければならない。~/.vnc/passwdファイルが無いとサービスは起動しない。また、上記の様に ~/.vnc/xstartup を変更しないとGNOMEは使えない。従って、各ユーザは一旦ログインして次の各コマンドを実行する(もしくはrootでsuコマンドを利用して各ユーザの設定しておく)。

[adsaria@fedora8 ~]$ vncpasswd
[adsaria@fedora8 ~]$ vncserver
[adsaria@fedora8 ~]$ vncserver -kill :1
[adsaria@fedora8 ~]$ vi ~/.vnc/xstartup

次のコマンドでVNCサーバが起動するか確認する。

[root@fedora8 ~]# service vncserver start
Starting VNC server: 1:adsaria
New 'fedora8:1 (adsaria)' desktop is fedora8:1

Starting applications specified in /home/adsaria/.vnc/xstartup
Log file is /home/adsaria/.vnc/fedora8:1.log

2:trogyte
New 'fedora8:2 (trogyte)' desktop is fedora8:2

Starting applications specified in /home/trogyte/.vnc/xstartup
Log file is /home/trogyte/.vnc/fedora8:2.log

                                                           [  OK  ]
[root@fedora8 ~]#

問題がなければシステムブート時にサービスが起動するように設定しておく。

[root@fedora8 ~]# chkconfig --list vncserver
vncserver       0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@fedora8 ~]# chkconfig --level 345 vncserver on
[root@fedora8 ~]# chkconfig --list vncserver
vncserver       0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@fedora8 ~]#

これで、例えば上のtrogyteとしてアクセスする場合は、ポート番号5902(5900+Display番号)を使ってvncserverにアクセスする。VNCサーバのコネクションが成立すれば、リモート側にサーバのXウィンドウ画面が表示されるが、ログイン画面ではなく指定したユーザ(=ポート番号)のデスクトップがいきなり表示される。

XDMを使ったログイン画面を提供する

VNCサーバへ接続した時にXDMのログイン画面を表示して、任意のユーザでログイン出来るようにする方法である。
vncserver(実体はXvnc)をxinetdから起動するようにする。そのためにxinetdのインストールが必要となる。

[root@fedora8 ~]# yum install xinetd

次にxinetdからVNCサーバを起動できるように /etc/xinetd.d/Xvnc というファイルを次のような内容で作成する。("Xvnc"というのは任意の名前でいい。"vncserver"でも"MyVNC"でも好きな名前をつける。ここではXvncを起動するという意味でXvncという名前にした。)

service xvnc1
{
	disable		= no
	socket_type	= stream
	wait		= no
	user		= nobody
	group		= tty
	server		= /usr/bin/Xvnc
	server_args	= -inetd -geometry 1152x864 -depth 16 -query localhost -once PasswordFile=/etc/passwd_vnc
}

service xvnc2
{
	disable		= no
	socket_type	= stream
	wait		= no
	user		= nobody
	group		= tty
	server		= /usr/bin/Xvnc
	server_args	= -inetd -geometry 800x600 -depth 16 -query localhost -once PasswordFile=/etc/passwd_vnc
}

この例では画面サイズの異なる2つのVNCサーバをDisplay 1と2として起動するようにしている。サーバ名(xvnc1など)は自由だが、後述するように/etc/servicesでポート番号と対応付けする。*1 必要に応じて目的のVNCサーバを複数準備することができる。この例ではパスワードファイルは2つのVNCサーバで共通しているが、別々のファイル(別々のパスワード)にすることもできる。パスワードは次のように設定する。(また、デーモンからパスワードファイルを読めるように所有者を変更しておく。所有者は/etc/xinetd.d/Xvncでの定義に合わせる。)

 [root@fedora8 ~]# vncpasswd /etc/passwd_vnc
 Password:
 Verify:
 [root@fedora8 etc]# ls -l /etc/passwd_vnc
 -rw------- 1 root root 8 2008-05-20 00:20 /etc/passwd_vnc
 [root@fedora8 etc]# chown nobody.tty /etc/passwd_vnc
 [root@fedora8 etc]# ls -l /etc/passwd_vnc
 -rw------- 1 nobody tty 8 2008-05-20 00:20 /etc/passwd_vnc

/etc/xinetd.d/Xvnc で定義したサーバ名とポート番号を結びつけられるように /etc/services に該当エントリを追加する。(次の例はvinoのポート5900/TCPも含めて定義している。)

vino		5900/tcp			# VNC Server vino
xvnc1		5901/tcp			# VNC Server 1
xvnc2		5902/tcp			# VNC Server 2

次にリモートからのアクセスに対してログイン画面が出るように[System]⇒[Administration]⇒[Login Window]からLogin Window Preferencesを起動、[Remote]タブで"Same as Local"を選択する。


もしくは、コマンドラインで設定するには /etc/gdm/custom.conf の中の"[xdmcp]"の項目に"Enable=true"を追加する。

[root@fedora8 ~]# vi /etc/gdm/custom.conf
	:
[xdmcp]
Enable=true

最後にリブートして利用可能となる。(リブートしないとXDMCPの設定が反映されない。)

*1:"server_args"の引数でポート番号を指定することもできるが、/etc/servicesで対応付けした方が管理が柔軟だろう。

UbuntuにVNCサーバを設定する

Ubuntuの場合はFedoraと大体同じだが、幾つか設定するファイル名が異なったり、(私の使ったUbuntu 8.04+vnc4serverでは)マニュアルない引数を指定するなどのポイントがあった。

  • vinoを使う
  • 手動でVNCサーバを起動する
  • 特定のユーザでデーモン化する
  • XDMを使ったログイン画面を提供する

vinoを使う

Fedoraの設定と同じ。ただし、Ubuntuは標準でファイヤーウォール管理ソフトが無く、ポート開放の設定なしで接続できる。(ファイヤーウォール管理ソフトは幾つかあるが"Firestarter"というのが人気(Popularity)が高いようだ。)

vinoを使わない場合は、別途vncserverをインストールし、目的に合わせて設定する必要がある。
まず、VNCサーバのソフトウェアをインストールする。

adsaria@ubuntu804:~$ sudo apt-get install vnc4server
[sudo] password for adsaria:
	:
adsaria@ubuntu804:~$ 

Ubuntu 8.04では"vnc4server"の他に"tightvncserver"というパッケージもある。

手動でVNCサーバを起動する

vnc4serverをインストールしたらvncpasswdコマンドでパスワードを設定してvncserverを起動するが、いきなりvncserverを起動した場合、パスワードの設定から入る。

adsaria@ubuntu804:~$ vncserver

You will require a password to access your desktops.

Password:
Verify:

New 'ubuntu804:1 (adsaria)' desktop is ubuntu804:1

Creating default startup script /home/adsaria/.vnc/xstartup
Starting applications specified in /home/adsaria/.vnc/xstartup
Log file is /home/adsaria/.vnc/ubuntu804:1.log

adsaria@ubuntu804:~$

上記の例では":1"というディスプレ(Xサーバ)を使ってVNCが起動したことを示している。なお、"vncserver"は間接的に"vnc4server"へシンボリックリンクされている。
この状態でVNCクライアントから接続できるようになるが、ウィンドウマネージャがtwmなので使いづらい。一旦、vncserverを終了して ~/.vnc/xstartup を修正する。

adsaria@ubuntu804:~$ vncserver -kill :1
Killing Xvnc process ID 5613

adsaria@ubuntu804:~$ vi /home/adsaria/.vnc/xstartup

~/.vnc/xstartupの内容は以下の通り。(はてなの“キーワード自動リンク機能”でキーワードが赤字にならないため、まだら模様になってしまっている。自動リンクは構わないが、文字の色を勝手変えるのはなんとかして欲しい....。)

#!/bin/sh

# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
/bin/sh /etc/X11/xinit/xinitrc
exit $?

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

ここで、Fadora 8とは異なりUbuntu 8.04では単なるコメントアウトではなく工夫が必要となる。Ubuntuでは /etc/X11/xinit/xinitrcの実行権がないのでexecではなく/bin/shスクリプトを読み込んで実行する形となることに注意。

Fedora 8の場合
 [adsaria@fedora8 ~]$ ls -l /etc/X11/xinit/xinitrc
 -rwxr-xr-x 1 root root 1512 2007-10-13 04:13 /etc/X11/xinit/xinitrc
 [adsaria@fedora8 ~]$

■ Ubuntu 8.04の場合
 adsaria@ubuntu804:~$ ls -l /etc/X11/xinit/xinitrc
 -rw-r--r-- 1 root root 226 2008-02-02 13:14 /etc/X11/xinit/xinitrc
 adsaria@ubuntu804:~$

これで、VNCを使ってGNOME等でログインできる。ただしUbuntu 8.04の環境ではVNCクライアントからアクセスするとGNOMEの設定が正しく行なわれなかったというメッセージが何回か出てくる。また、"gnome-settings-daemon"が起動できないというメッセージも出る。このために幾つかウィンドウが見た目、GNOMEではなくX風になってしまう。

どうもgnome-settings-daemonのバグらしい。ログイン時のsyslogなどを見ると次のようなメッセージが残っている。

May 24 23:48:36 ubuntu804 kernel: [ 4215.148383] gnome-settings-[18457]: segfault at 10 rip 7fa00c90673d rsp 7fff2165ee10 error 4
May 24 23:48:40 ubuntu804 kernel: [ 4219.395703] gnome-settings-[20350]: segfault at 10 rip 7f321105e73d rsp 7fff25db7540 error 4
May 24 23:48:44 ubuntu804 kernel: [ 4223.445133] gnome-settings-[21881]: segfault at 10 rip 7f9833e4b73d rsp 7fff48ba2330 error 4
May 24 23:48:49 ubuntu804 kernel: [ 4228.366838] gnome-settings-[23215]: segfault at 10 rip 7f8a1746373d rsp 7fff2c1b9940 error 4
May 24 23:48:53 ubuntu804 kernel: [ 4232.354847] gnome-settings-[24861]: segfault at 10 rip 7fa9b9f8173d rsp 7fffcecd8460 error 4
May 24 23:48:57 ubuntu804 kernel: [ 4236.304383] gnome-settings-[26128]: segfault at 10 rip 7fce3fe9273d rsp 7fff54be9370 error 4
May 24 23:49:01 ubuntu804 kernel: [ 4240.313891] gnome-settings-[27423]: segfault at 10 rip 7ff26a13173d rsp 7fff7ee88610 error 4
May 24 23:49:05 ubuntu804 kernel: [ 4244.301465] gnome-settings-[28806]: segfault at 10 rip 7f51f8fa573d rsp 7fff0dcfe480 error 4

原因はgnome-settings-daemonのバグとしても、何とか回避策はないものか。

特定のユーザでデーモン化する

この方法は分からなかった。Ubuntuに不慣れなので、vncserverをサービスとして設定する方法が分からなかった。([System]⇒[Administration]⇒[Services]に"vncserver"の項目がないし、Redhat系のchkconfigにあたるコマンドも見つからなかった。/etc/initd.dにも"vnc"という文字列を含んだスクリプトは無いので、Ubuntu環境ではこの方法は使えないのかと思う。)
しかし、次のxinetdを利用する方法が使えれば、この方法は実用上もあまり使わないので構わないだろう。というか、次のような観点からxinetdを使った方法の方が良いと思う。

  • xinetdでログイン画面を利用するようにすれば、Xvncのパスワードの他にLinuxのパスワードと2重の認証が必要であり、セキュリティが向上する。特にインターネット経由で利用する際は、こちらの方がいいだろう。
  • 実際にクライアントからアクセスがあるまではXvncプロセスは起動されないので、システムのリソースが無駄にならない。(と言っても些細だが。)

XDMを使ったログイン画面を提供する

先ずは、xinetdをインストールする。

adsaria@ubuntu804:~$ sudo apt-get install xinetd
Reading package lists... Done
	:
Setting up xinetd (1:2.3.14-5) ...
 * Stopping internet superserver xinetd                            [ OK ]
 * Starting internet superserver xinetd                            [ OK ]

adsaria@ubuntu804:~$

/etc/xinetd.d/Xvncを設定する。ここで Xvncに対してマニュアルに出ていない "-extension XFIXES"というオプションを指定しなければならなかった。

service xvnc1
{
	disable		= no
	socket_type	= stream
	wait		= no
	user		= nobody
	group		= tty
	server		= /usr/bin/Xvnc
	server_args	= -inetd -geometry 1152x864 -depth 16 -query localhost -once PasswordFile=/etc/passwd_vnc -extension XFIXES
}

service xvnc2
{
	disable		= no
	socket_type	= stream
	wait		= no
	user		= nobody
	group		= tty
	server		= /usr/bin/Xvnc
	server_args	= -inetd -geometry 800x600 -depth 16 -query localhost -once PasswordFile=/etc/passwd_vnc -extension XFIXES
}

/etc/servicesを設定する。(Fedoraと同様)

vino		5900/tcp			# VNC Server vino
xvnc1		5901/tcp			# VNC Server 1
xvnc2		5902/tcp			# VNC Server 2

VNCアクセス用のパスワードを設定する。(Fedoraと同様)
パスワードを保存するファイル上の/etc/xinetd.d/Xvncで指定したファイル(ファイルのパス・名前は任意)と同じ。また、ファイルの所有者/グループをの/etc/xinetd.d/Xvncで指定したプロセスの所有者/グループと一致させておく。

 adsaria@ubuntu804:~$ sudo vncpasswd /etc/passwd_vnc
 [sudo] password for adsaria:
 Password:
 Verify:
 adsaria@ubuntu804:~$ ls -l /etc/passwd_vnc
 -rw------- 1 root root 8 2008-05-24 20:04 /etc/passwd_vnc
 adsaria@ubuntu804:~$ sudo chown nobody:tty /etc/passwd_vnc
 adsaria@ubuntu804:~$ ls -l /etc/passwd_vnc
 -rw------- 1 nobody tty 8 2008-05-24 20:04 /etc/passwd_vnc
 adsaria@ubuntu804:~$

最後にLogin Window Preferenceで遠隔からのログインを可能とする。(Fedoraと同様。但し、私の環境ではLogin Window Preferenceウィンドウが出てくるまで1分以上かかった。)基本的には"Remote"タブでリモートからのアクセスを許すように設定するだけ。


コマンドラインから設定する場合は /etc/gdm/gdm.conf-customファイルの"[xdmcp]"の項目に"Enable=true"を追加する。

root@ubuntu804:~# vi /etc/gdm/gdm.conf-custom
	:
[xdmcp]
Enable=true

これでVNCクライアントからアクセスできるが、やはりGNOMEの設定が正しくできないという趣旨のメッセージが出てしまう。

UbuntuでのVNCの設定はHOWTO: Remote Desktop with VNC in Ubuntu Edgy/Feistyが参考になる。