V o s a m o


noVNC的使用之一

noVNC是一个HTML5 VNC客户端,采用HTML5 websockets、Canvas和JavaScript实现,noVNC被普遍应用于各大云计算、虚拟机控制面板中,比如OpenStack Dashboard 和 OpenNebula Sunstone 都用的是 noVNC. 前面说了 noVNC 采用 WebSockets 实现,但是目前大多数 VNC 服务器都不支持 WebSockets,所以 noVNC 是不能直接连接 VNC 服务器的,怎么办呢?这就需要一个代理来实现websockets和tcp sockets之间的转换,这个代理就是websockify。

vncserver安装和使用

vncserver是用来实现远程桌面连接的,比如说你由两台机器PC1:192.168.1.101和PC2:192.168.1.102,如果你想在PC1上访问PC2的桌面,就需要在PC2上安装vncserver,然后在PC1上通过vncviewer或noVNC访问PC2。下面以tigervnc-server为例来介绍一下vncserver的安装和使用。

安装

yum -y install tigervnc-server

安装完后,查看vncserver的配置文件:

[root@mycentos liushaolin]# rpm -qc tigervnc-server
/etc/sysconfig/vncservers

在该配置文件中可以修改vncserver的配置,比如远程桌面的sessionnumber,登录时的用户名,屏幕分辨率等等。

启动sncserver

vncserver
或
vncserver :n

这里的n就是sessionnumber,不指定的话默认为1,第一次启动时会提示输入密码,以后也可以使用vncpasswd命令修改密码。VNC的默认端口号是5900,而远程桌面连接端口号则是5900+n。如果使用“vncserver :1”命令启动VNC Server,那么端口应该是5901。

查看连接

vncserver -list[root@mycentos liushaolin]# vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		5918
:3		7726

删除连接

vncserver -kill :n

使用noVNC连接VNC server

noVNC的工作原理

noVNC提供一种在网页上通过html5的Canvas,访问机器上vncserver提供的vnc服务,需要做tcp到websocket的转化,才能在html5中显示出来。网页就是一个客户端,类似win下面的vncviewer,只是此时填的不是裸露的vnc服务的ip+port,而是由noVNC提供的websockets的代理,在noVNC代理服务器上要配置每个vnc服务,noVNC提供一个标识,去反向代理所配置的vnc服务。

noVNC的使用

假设我们在PC2上创建了一个VNC连接,sessionnumber是1,端口号为5901。noVNC可以和vncserver在一台机器上,也可以不在一台机器上。

简单用法

安装noVNC

$git clone https://github.com/kanaka/noVNC
$cd noVNC
$./utils/launch.sh --vnc localhost:5901

启动launch脚本,会输出如下信息:

WebSocket server settings:
  - Listen on :6080
  - Flash security policy server
  - Web server. Web root: /root/noVNC
  - No SSL/TLS support (no cert file)
  - proxying from :6080 to localhost:5901


Navigate to this URL:

    http://localhost:6080/vnc.html?host=localhost&port=6080

这时,访问http://localhost:6080/vnc.html?host=localhost&port=6080http://localhost:6080/vnc.html,然后输入Host地址,端口号,密码,token,其中密码和token有的话需要输入,然后连接即可。当然你可以从PC1的浏览器中输入PC2的IP地址访问。

整个流程大概是这样的:

vnc.html -> 192.168.1.102:6080(PC2) -> websockify.py -> localhost:5901

高级用法

使用websockify可以更改默认6080端口,使用token设置。

用法:./utils/websockify/websockify.py --web ./ 8787 localhost:5901

--web ./指定访问根目录,8787表示访问novnc的端口,localhost可以改成所有安装了vncserver的IP地址,比如:./utils/websockify/websockify.py --web ./ 8787 192.169.1.100:5901

使用token

为什么使用token?

我们上面的场景是基于noVNC代理和vncserver在同一台机器上的,倘若我们想通过noVNC访问局域网中的所有机器,难道要给每一台机器都安装配置noVNC,然后用每台机器的IP地址去访问它吗?显然这种做法是繁琐笨拙的。实际上,我们只需要一台机器作为noVNC代理,其他被访问的机器安装VNC server就可以了。如下图:

在上图中,我们用一台机器作为代理,IP:192.168.1.10,另外两台机器PC1:192.168.1.101和PC2:192.168.1.102上面安装vncserver,我们怎么通过代理去访问PC1和PC2呢?这就需要token大显身手了。

我们需要在代理机器上创建一个token配置文件,假设为/home/token/token.conf,文件内容为:

abc123: 192.168.1.101:5900
123abc: 192.168.1.102:5901

首先,在欲访问的机器上启动vncserver,执行命令vncserver即可。

然后,在代理机器上输入命令:./utils/websockify/websockify.py --web ./ --target-config=./token/token.conf 8787

接下来,访问192.168.1.10:8787/vnc.html,输入对应的token即可访问相应的机器了。

使用vnc_auto.html

在vnc_auto.html中写入noVNC代理的配置

host = "192.168.1.10";
port = 8787;
path = "websockify/?token=xxxxxx";

然后直接访问192.168.1.10:8787/vnc_auto.html即可连接。

问题排查

如果输入host地址,port之后,不能访问,查看密码是否正确,如果显示connection refused,查看被访问主机vncserver是否启动,如果未启动,执行vncserver

注意:使用noVNC每个系统桌面或者虚拟机每次只能有一个连接,如果连接时出现错误Server disconnected (code: 1000, reason: Target closed),也有可能是你已经连接了或者在virt-manager里面启动了虚拟机并进入了系统桌面。

vosamo /
Published under (CC) BY-NC-SA in categories Linux  tagged with 虚拟化