VNC(Virtual Network Computing)是虚拟网络计算机的缩写。VNC是一款优秀的远程控制工具软件,基于UNIX和Linux操作系统的免费的开源软件,远程控制能力强大,高效实用。
VNC系统由客户端,服务端和RFB协议组成。VNC的服务端目的是分享其所运行机器的屏幕,服务端被动的允许客户端控制它。VNC客户端观察控制服务端,与服务端交互。VNC协议(RFB)是一个简单的协议,传送服务端的原始图像到客户端,客户端传送事件消息到服务端。
服务器发送小方块的帧缓存给客户端,在最简单的情况,VNC协议使用大量的带宽,因此各种各样的方法被发明出来减少通讯的开支,举例来说,有各种各样的编码方法来决定最有效率的方法来传送这些点阵方块。
协议允许客户端和服务端去协商使用哪种编码,被大多数客户端和服务端支持的,最简单的编码就是从左到右的像素扫描数据的原始编码,当原始编码的满屏被发送后,只发送变化的方块区域。这种编码在帧间只有小部分屏幕变化的情况下工作的非常好(如鼠标在桌面移动或光标处输入文字等情况),不过如果大量的像素同时变化会导致带宽非常高(如拖动一个窗口或观看全屏录像)。
综上所述,我们来总结一下VNC的工作流程:
1)服务器端启动VNC server;
2)VNC客户端启动VNC viewer连接到VNC server;
3)VNC server将对话窗口发送至客户端,要求客户端输入连接密码;
4)VNC viewer输入VNC server的连接密码后,将密码发送至VNC server;
5)VNC server端通过密码验证后,则通过X Protocol将X server画面的显示控制权交由VNC server;
6)VNC server将X server桌面环境利用VNC通信协议发送至客户端;
7)VNC客户端获取VNC server端的桌面环境、输入控制及显示控制权; VNC默认使用TCP端口5900至5906。
图 1 vncserver工作原理
麒麟操作系统服务器版本支持vnc4server和tightvncserver。
vnc4server包括以下三个命令:vncserver,vncpasswd,vncconnect。大多数情况下只需要两个命令:vncserver和vncviewer(客户端)。
tightvncserver包括以下三个命令tightvncserver,tightvncpasswd,tightvncconnect。大多数情况下只需要两个命令:tightvncserver和xtightvncviewer(客户端)。
两种vnc使用方法基本差不多,下面以vnc4server为例介绍。
1)vncserver启动语法格式:
vncserver [:display#] [-name desktop-name] [-geometry widthxheight] [-depth depth ] [-pixelformat format] [Xvnc-options.....] |
vncserver停止语法格式:
vncserver -kill :display# |
vncserver运行时可以不添加参数,这种情况下就会默认选择第一个可用的显示编号,通常情况下为:1。当然也可以使用指定的显示编号,这种情况下如果此编号有效则会使用此显示编号,如果不存在,则会退出,如vncserver :10。
Vncserver的默认端口为5900,每个显示桌面的编号其实对应的就是端口号,比如显示编号为:1,那么对应的端口号即为5901,以此类推。
vncserver的配置文件为~/.vnc/xstartup,修改此配置文件可以改变vncserver的属性。需要强调一点,修改此文件不会影响之前已经存在的vncserver桌面。此外vnc密码文件以及启动的所有显示桌面相关日志及.pid文件都在~/.vnc/下,“$HOME/.vnc/host:display#.pid”和“$HOME/.vnc/host:display#.log”分别是启动的显示桌面对应的pid文件和日志文件,如kylin:1.pid及kylin:1.log。“$HOME/.vnc/passwd”即为vnc密码文件。
vncserver常用选项:
表7 vncserver常用选项
参数 |
说明 |
-name desktop-name |
每个显示桌面都有一个名字。默认情况下为“host:display#(username)”,如kylin-PC:1 (kylin)。 |
-geometry widthxheight |
指定桌面的大小,默认为1024x768,可以通过此选项设置窗口大小,如vncserver -geometry 1360x768。 |
-depth depth |
指定像素显示桌面的像素深度,默认情况下为16。还可以设置其他值,比如8,15和24。 |
-pixelformat rgbNNN|bgrNNN |
设置像素表示的颜色格式,客户端可以转换为任何像素格式,但如果服务器的深度和像素格式与客户端的相同,则会提供速度。 |
-kill :display# |
指定要停止display#这个编号的vnc桌面。如vncserver -kill :1,即停止编号为1的vnc显示桌面。 |
2)vncviewer命令
vncviewer是VNC的X视图的一个客户端。用来连接到远程服务器并显示其桌面。使用vncviewer需要提前获取到vncserver的密码。
vncviewer的命令格式:
vncviewer [options] [host][:display] vncviewer [options] [host][::port] vncviewer [options] -listen [display] vncviewer -help |
vncviewer常用选项:
表8 vncviewer常用选项
参数 |
说明 |
-help |
在终端打印使用方法。 |
-listen [display#] |
表示监听来自服务器的反向连接,默认监听5500端口,也可使用端口参数,如vncviewer -listen 3则表示监听5503端。WinVNC使用“添加新客户端”菜单选项支持反向连接。 |
-viewonly |
禁用客户端鼠标和键盘事件传送到服务器的功能,默认关闭。 |
-passwd passwd-file |
指定连接时的密码文件为passwd-file,也就是说如果将服务器端密码发送到客户端,使用此选项时,就可以不必输入密码,正确的密码文件则会直接连接,而错误密码文件则认证失败断开连接。 |
-encodings encoding-list |
TightVNC支持几种不同的压缩方法来编码显示桌面的屏幕更新,此选项可以指定优先使用一组方法,如果有多个编码方法,可以使用空格分隔,且这一组编码方法必须使用引号括起来。默认可用的编码为“copyrect tight hextile zlib corre rre raw” |
-fullscreen |
开启全屏显示模式。这个模式下有可能会造成输入焦点的错误处理或使窗口突然消失。解决输入焦点问题,可以参照grabKeyboard设置。默认关闭
|
-fullscreen -depth depth |
服务器上支持多个像素深度,指定客户端显示桌面的像素深度为depth值
|
3)vncpasswd命令
vncpasswd是用来修改VNC密码的命令。对应的密码文件则为$HOME/.vnc/passwd。Vncserver第一次运行来启动VNC桌面的时候则会调用vncpasswd来设置VNC密码。指定的密码至少6个字符,最长为8个字符。需要注意的是存储的密码并未经过安全加密,也就是说任何有权限访问此文件的用户都可以轻易找到明文密码,所以vncpasswd需要设置适当的权限。
vncpasswd语法格式:vncpasswd [passwd-file]
运行vncpasswd时,不加参数passwd-file,则会默认修改$HOME/.vnc/passwd文件,而指定passwd-file则会更新此文件下的密码。当然如果在vncviewer连接时默认还是去匹配$HOME/.vnc/passwd的密码,要使用指定的密码文件需要使用-passwd参数。
1)安装vncserver包:sudo apt-get install vnc4server;
2)首次执行vncserver,会提示设置vnc登录密码;
kylin@kylin:~$ vnc4server You will require a password to access your desktops. Password: Verify: New 'kylin:1 (kylin)' desktop is kylin:1 Creating default startup script /home/kylin/.vnc/kylintartup Starting applications specified in /home/kylin/.vnc/kylintartup Log file is /home/kylin/.vnc/kylin:1.log
|
后面需要修改vnc密码时,使用vncpasswd命令。
kylin@kylin:~$ vncpasswd Password: Verify: |
3)等待客户端连接。
kylin@kylin:~/.vnc$ ls passwd kylin:1.log kylin:1.pid xstartup |
查看生成的.vnc目录下,可以看到当前打开的vnc端口:1。
另外,vncserver开启的端口,只有该用户使用vncserver -kill :1来杀死该端口,而其他用户即使是root也不行,当然使用root权限强制杀死该进程是可以的。
1)安装vncviewer包;
2)连接远程主机:在终端执行vncviewer IP:1。
root@kylin:~# vncviewer 192.168.81.23:1 VNC Viewer Free Edition 4.1.1 for X - built Apr 26 2016 07:32:56 Copyright (C) 2002-2005 RealVNC Ltd. See http://www.realvnc.com for information on VNC. Mon Sep 16 11:39:53 2019 CConn: connected to host 192.168.81.23 port 5901 CConnection: Server supports RFB protocol version 3.8 CConnection: Using RFB protocol version 3.8 Password: Mon Sep 16 11:39:58 2019 TXImage: Using default colormap and visual, TrueColor, depth 24. CConn: Using pixel format depth 6 (8bpp) rgb222 CConn: Using ZRLE encoding CConn: Throughput 20000 kbit/s - changing to hextile encoding CConn: Throughput 20000 kbit/s - changing to full colour CConn: Using pixel format depth 24 (32bpp) little-endian rgb888 CConn: Using hextile encoding |
连接如图 2,以上步骤中vncviewer IP:1中的IP为vnc服务器的IP地址。而:1则表示VNC Server生成的新桌面,如果有需要,我们也可以多开几个端口,在服务器端执行多次vncserver &,然后就会生成:2,:3,:4等等的端口。
图 2 vnc连接麒麟操作系统
Windows上的vnc软件比较多,本文简单介绍一下vncviewer的使用。去vnc官网下载vncviewer并安装,然后打开软件,新建一个连接,输入麒麟操作系统的IP地址和端口号,在弹出的窗口填写密码,然后双击新建的连接,成功连接到麒麟操作系统。如图 5:
图 3 新建vnc连接
图 4 输入密码
图 5 Windows上vncviewer连接麒麟操作系统
1)连接灰屏,显示Could not acquire name on session bus
修改服务器端的配置文件$HOME/.vnc/xstartup文件,添加unset语句,然后关闭之前的端口,重启新的vncserver端口。
unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS |
2)连接失败,无信息
可能是防火墙没有关闭,或者是vncserver服务没有开启。
添加我为好友,拉您入交流群!
请使用微信扫一扫!