VNC(Virtual Network Computing,虚拟网络计算)是一种图形桌面共享系统,它使用RFB协议远程控制另外一台计算机。VNC通过网络把控制端的键盘和鼠标事件传输给被控端,并把被控端的屏幕显示回传给控制端,使在控制端的操作者感觉犹如坐在被控端计算机面前操作一样。
VNC具有平台无关的特性,在任何操作系统上的客户端(VNC viewer)都可以连接到任何操作系统上安装的服务器 (VNC server),VNC支持几乎所有的图形界面操作系统,并且支持java。多个VNC客户端可以同时连接到服务器,流行的应用包括远程技术支持。相互传输两台计算机中的文件等。
VNC由Olivetti & Oracle Research Lab开发,AT&T在1999年获得了这个实验机构,并在2002年将其关闭。此后,VNC开发成员中的一部分构建了RealVNC这个开源项目,同时致力于商业化推广。目前用的最广泛的VNC就是这个RealVNC。
VNC由客户端、服务器和通信协议RFB3部分组成,RFB(Remote Frame Buffer,远程帧缓存)是一个远程图形用户的简单协议,它工作在帧缓存级别上,所以它可以应用于所有的窗口系统,例如,X11、Windows和Mac等系统。远程终端用户使用的机器(例如显示器、键盘、鼠标)叫做客户端,提供帧缓存变化的被称为服务器。
一:VNC服务端
默认情况下CentOS 5的安装程序会将VNC服务器端程序安装在系统上,可以使用下面的命令检查系统是否已经安装了VNC服务器。
#rpm -qa |grep vnc
vnc-server-4.1.2-14.el5_5.4
vnc-4.1.2-14.el5_5.4
以上结果显示了CentOS 5上已经安装了VNC服务器,版本号为4.1.2。如果没有看到vnc-server包,可以挂载光盘,并输入以下命令进行挂载安装。
# mount -t iso9660 -o loop /dev/cdrom /mnt/
# cd /mnt/CentOS
# rpm -ivh vnc-server-4.1.2-14.el5_5.4.x86_64.rpm
安装成功后,有关VNC服务器软件的几个重要文件分布,可使用如下命令查看:
# rpm -ql vnc-server
/etc/rc.d/init.d/vncserver :VNC服务器的启动脚本。
/etc/sysconfig/vncservers :VNC系统坏境变量设置脚本。
/usr/bin/Xvnc
/usr/bin/vncconfig :vnc-server 进程的管理工具。
/usr/bin/vncpasswd :VNC连接密码设置与改变工具。
/usr/bin/vncserver :VNC服务器进程命令文件。
/usr/bin/x0vncserver
/usr/lib64/xorg/modules/extensions/libvnc.so
/usr/share/man/man1/Xvnc.1.gz :VNC帮助手册页。
/usr/share/man/man1/vncconfig.1.gz
/usr/share/man/man1/vncpasswd.1.gz
/usr/share/man/man1/vncserver.1.gz
/usr/share/man/man1/x0vncserver.1.gz
/usr/share/vnc
/usr/share/vnc/classes
/usr/share/vnc/classes/index.vnc
/usr/share/vnc/classes/logo150x150.gif
/usr/share/vnc/classes/vncviewer.jar :提供给java客户端的运行包。
如果使用源代码安装,可以从 http://www.realvnc.com/ 下载,目前最新的是4.4.4版。有关源代码的安装方式请参见其README文件,下面以RPM包安装为例介绍VNC的运行与配置。当RPM包安装完成后,可以通过以下命令启动vnc-server进程。
# vncserver

You will require a password to access your desktops.
Password:
Verify:
New 'station1.example.com:1 (root)' desktop is station1.example.com:1
Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/station1.example.com:1.log
初次启动VNC服务器时,会要求设置一个连接密码,当以后客户端连入时,要输入这个密码才能连接。这个密码也可以设为空,但此时任何客户端都可以直接连入,很不安全。(注:连接密码与用户的帐号密码是两回事。当VNC客户端连入时,不需要提供用户的密码,其用户身份是服务端启动vncserver时的用户。)
此外,vncserver命令初次运行时,还会在当前用户的个人目录下创建一个名为.vnc的目录,里面包含了3个文件,如下所示。
# ls /root/.vnc/
passwd station1.example.com:1.log station1.example.com:1.pid xstartup
其中,xstartup是VNC服务器的启动脚本,station1.example.com:1.log是第一个桌面的日志文件,station1.example.com:1.pid是vncserver的进程PID,passwd文件里存放在连接的密文。可以再次执行vncserver命令启动多个桌面,每个桌面的编号默认时依次增大,也可以用"vncserver:<n>"的形式指定第N个桌面号。桌面数决定了客户端的同时连接数。下面再执行一次vncserver命令。
#vncserver

New 'station1.example.com:2 (root)' desktop is station1.example.com:2
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/station1.example.com:2.log
此时就启动了第2个桌面,连接密码与第一个桌面相同,不需要再次设置。每个桌面启动后,都会在.vnc目录下增加一个对应的日志文件和进程PID文件。另外,每个用户均可以执行vncserver命令创建自己的桌面提供给VNC客户端连接。但桌面编号是唯一的,即所有的用户的桌面号是不会重复的,客户端连入时可以选择不同的桌面号。还有,每个用户第一次运行vncserver时也要设置连接密码,也会在个人目录下创建.vnc目录,也会出现相应的日志文件、进程PID、xstartup和passwd文件。下面查看一下上述命令执行后出现的进程。
#ps -efa|grep vnc
root 11824 1 0 16:30 pts/0 00:00:00 Xvnc :1 -desktop station1.example.com:1 (root) -httpd /usr/share/vnc/classes -auth /root/.Xauthority -geometry 1024x768 -depth 16 -rfbwait 30000 -rfbauth /root/.vnc/passwd -rfbport 5901 -pn
root 11833 1 0 16:31 pts/0 00:00:00 vncconfig -iconic
root 11917 1 0 16:41 pts/0 00:00:00 Xvnc :2 -desktop station1.example.com:2 (root) -httpd /usr/share/vnc/classes -auth /root/.Xauthority -geometry 1024x768 -depth 16 -rfbwait 30000 -rfbauth /root/.vnc/passwd -rfbport 5902 -pn
root 11926 1 0 16:41 pts/0 00:00:00 vncconfig -iconic
root 11980 9391 0 16:48 pts/0 00:00:00 grep --colour=auto vnc
可以看到,每个桌面均有两个进程。实际上,这两个进程是有.vnc下的xstartup脚本启动的。另外,VNC服务器第一个桌面使用的默认端口号是TCP 5801和TCP 5901号端口,其余桌面一次增加,其中前者用于浏览器中Java Applet的访问。查看一下这些端口是否已经出于监听状态。
# netstat -an | grep :5801
tcp 0 0 0.0.0.0:5801 0.0.0.0:* LISTEN
# netstat -an |grep :5901
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN
到此为止,服务器端的搭建已全部结束。下面是客户端的连接。
二:VNC客户端
VNC客户端可以从 http://www.realvnc.com 处下载。
为乐乐体现VNC跨平台的特性,下面以Windows下的RealVNC客户端为例。讲述VNC客户端的使用方法。安装过程,在这里就不说了。
安装完毕后,运行“VNC Viewer”,将出现一个对话框,在Server文件框内输入VNC服务器端的IP:桌面号,如172.24.0.24:1,表示连接到172.24.0.24服务器的第一个桌面。单击Connect按钮后,再输入VNC服务器上运行vncserver时所设的连接密码,就可以登录了。登录之后出现的并不是预料的图形界面,其主要原因是在默认情况下,vncserver进程使用的是twm桌面系统,而CentOS 5默认安装的是Gnome桌面系统,而没有安装twm桌面系统,因此VNC Viewer登陆时看不到哦图形界面。为了使vncserver使用Gnome桌面系统,需要在服务端主机上改变xstartup启动脚本的内容。初始时,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 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &
其中最后一行 “twm &”表示启动twm桌面系统,现在把它改成“gnome-session &”,表示要启动Gnome桌面系统(如果运行的是KDE桌面系统,要改成“startkde &”)。另外,倒数第二行在Gnome系统也是不需要的,可以去除。修改完成并存盘后,再通过以下步骤重启vncserver。
# vncserver -kill :1
Killing Xvnc process ID 11824
# vncserver :1

New 'station1.example.com:1 (root)' desktop is station1.example.com:1
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/station1.example.com:1.log
以上命令中,-kill选项表示终止进程, :1表示第一个桌面。于是,在Windows再运行VNC viewer时,连接成功后看到的将是Gnome桌面系统。
三:VNC服务器配置
Vncserver运行时,会读取/etc/vcn/config 和 $HOME/.vnc/config两个文件中的内容作为其运行时的配置,但在vnc-server包安装完成后,并没有提供这两个配置文件的初始内容,所有的选项均采用默认值。但是这些默认值可以在运行过程中通过 vncconfig工具进行改变。vncconfig命令的格式如下:
vncconfig [parameters]
vncconfig [parameters] -connect <host>[:<port>]
vncconfig [parameters] -disconnect
vncconfig [parameters] [-set] <Xvnc-param>=<value>...
vncconfig [parameters] -list
vncconfig [parameters] -get <param>
vncconfig [parameters] -desc <param>
如果只有parameters,没有其他内容,vncconfig将运行成为一个帮助器。parameters有以下几项。
(1). --display <桌面号> :确定对哪一个桌面号进行控制,必须要确定。
(2). --nowin :不要在窗口中运行帮助器。
(3). -iconic :运行帮助器,窗口最小化为图标。