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で対応付けした方が管理が柔軟だろう。