- 一、平台目标
随着大数据和人工智能的热潮,计算机专业学生平常做实验的环境要求也越来越复杂。考虑到硬件和成本的约束,为了充分利用现有的资源和方便进行管理,需要不同的环境进行实验的时候,建立各种不同的虚拟机进行相关的实验。特别是一些大数据方面的集群实验、区块链多节点的实验、人工智能的分布式计算等等都需要多种不同的虚拟机来进行实验和操作。
虽然不同的虚拟机解决了不同系统和环境的需求问题,但是随着同学的增加和实验的不断扩展,大量虚拟机的管理也是一个需要解决的问题。现有的远程软件虽然可以进行登录和操作,但是当大量实验课进行的时候,太多的远程连接会消耗太多的系统资源或者难以方便快捷地进行管理,故Web虚拟机管理平台的开发势在必行。
通过Web虚拟机管理平台,不仅可以在学校的内网进行相关的操作,把平台部署在公网服务器上,不论在何时何地,只要有网有浏览器我们就可以进行相关的学习和实验。同时,通过系统化的规划,每个相关的实验可以包含特定的虚拟机,让做实验的人单独管理,降低了管理的复杂度,同时也提高虚拟机操作的灵活性,如果不出现特殊的情况,基本可以实现自主操作和管理虚拟机。
为了实现Web网页方式,远程Windows桌面和Linux桌面,经过一些调研和比较,选用了轻量级的开源的noVNC(http://novnc.com/info.html或者https://github.com/novnc/noVNC)技术来实现。noVNC是一个HTML5 VNC客户端,采用HTML5 websockets、Canvas和JavaScript实现,noVNC被普遍应用于各大云计算、虚拟机控制面板中,比如OpenStack, OpenNebula, LibVNCServer和 ThinLinc都用的是 noVNC。noVNC既是HTML VNC客户端、JavaScript库,也是构建在该库之上的应用程序。noVNC在任何现代浏览器中运行良好,包括移动浏览器(iOS和Android)。其特点有:
特征
- 支持所有现代浏览器,包括移动(iOS,Android)
- 支持的VNC编码:raw,copyrect,rre,hextile,tight,tightPNG
- 支持缩放,剪裁和调整桌面大小
- 本地光标渲染
- 剪贴板复制/粘贴
- 主要根据MPL 2.0 获得许可,请参阅 许可文档以获取详细信息
浏览器要求
noVNC使用许多现代Web技术,因此无法获得正式的需求列表。但是,这些是我们目前了解的最低版本:
Chrome 49,Firefox 44,Safari 10,Opera 36,IE 11,Edge 12
服务器要求
noVNC遵循标准的VNC协议,但与其他VNC客户端不同,它确实需要WebSockets支持。许多服务器都包含支持(例如 x11vnc / libvncserver, QEMU和 MobileVNC),但对于其他服务器,您需要使用WebSockets到TCP套接字代理。noVNC有一个姐妹项目websockify,它提供了一个简单的代理。noVNC提供一种在网页上通过html5的Canvas,访问机器上vncserver提供的vnc服务,需要做tcp到websocket的转化,才能在html5中显示出来。网页就是一个客户端,类似win下面的vncviewer,只是此时填的不是裸露的vnc服务的ip+port,而是由noVNC提供的websockets的代理,在noVNC代理服务器上要配置每个vnc服务,noVNC提供一个标识,去反向代理所配置的vnc服务。
快速开始
- 使用启动脚本自动下载并启动websockify,其中包括一个迷你Web服务器和WebSockets代理。该--vnc选项用于指定正在运行的VNC服务器的位置:
./utils/launch.sh --vnc localhost:5901
- 将浏览器指向启动脚本输出的URL。点击“链接”按钮,如果VNC服务器配置了密码,请输入密码,然后享受!
集成和部署
有关如何将noVNC集成到您自己的软件中,或在生产环境中部署noVNC应用程序,请参阅我们的其他文档:
- 二、开发环境
- 主机环境:Windows10专业版、VMware14专业版、Myeclipse10、JDK1.6、Tomcat7、Chrome68浏览器
- 虚拟机系统:Ubuntu16.04LTS、CentOS7、WindowsServer2016数据中心桌面版
- UltraVNC:http://www.uvnc.com/(Windows环境下的VNC Server,当然还有TightVNC、TigerVNC、RealVNC等,其中RealVNC不能通过noVNC)
- Node.js:https://nodejs.org/en/download/(用于执行Websockify.js。Websockify还有Python版本的,不过在Windows下没有成功)
- noVNC:http://github.com/kanaka/noVNC/zipball/master(浏览器不支持vnc,通过noVnc代理使用Websocket建立连接,用于建立网页方式的远程桌面访问)
- Websockify(用作WebSocket和TCPSocket之间的转换):https://github.com/novnc/websockify/archive/master.zip
- TigerVNC:在CentOS7中当做VNCserver用:http://tigervnc.org/ (GitHub:https://github.com/TigerVNC/tigervnc)
- Vnc4server:在Ubuntu16.04中当做vncserver进行使用:https://packages.ubuntu.com/trusty/x11/vnc4server
- 供选择的vnc:x11vnc:http://www.karlrunge.com/x11vnc/
Realvnc:https://www.realvnc.com/en/ 等等
- 三、开发步骤
- 基本环境搭建
在主机windows10下的VMware14中安装虚拟机Windoserver2016、Ubuntu16.04、CentOS7,且Ubuntu和Cent OS都要安装图形界面,并且保证主机Windows10(192.168.1.33)、Windowsserver2016(192.168.57.129)、Ubuntu14.04(192.168.57.128)、Centos7(192.168.57.131)的网络畅通
- 在Windows下搭建VNC服务器
- 安装UltraVNC Server 并开启服务(安装后设置密码,最好三个虚拟机中的vncserver的服务密码都设置为一样:a1236540)
- 安装Node.js
安装时选择npm package manager
安装ws、optimist、mime-types模块(执行websockify.js文件所需)
C:\Users\Administrator>npm install ws
C:\Users\Administrator>npm install optimist
C:\Users\Administrator>npm install mime-types
安装完ws、optimist、mime-types后会在C:\Users\Administrator\下生成node_modules目录(如果登录的用户是Administrator,换做其他用户的话就是:C:\Users\Jiao\node_modules)
3.把noVNC.zip解压到node_modules目录下,再把websockify-master.zip解压到noVNC目录下,形成这样的目录结构:
4.执行websockify.js:转发9000端口的http链接到5900端口(UltraVNC Server的默认端口为5900)C:\Users\Administrator\node_modules\noVNC\websockify-master\other\js>node websockify.js --web C:\Users\Administrator\node_modules\noVNC 9000 10.1.0.112:5900
5.在浏览器地址栏输入http://192.168.57.129:9000/(服务器端IP:192.168.57.129)可能会提示:
这时候只要在websockify.js中搜索filename += ‘/index.html’改成filename += ‘/vnc.html’,再重复第4、5步,出现下面的情况,证明成功连接了:
点击“链接”输入UltraVNC设置的密码(a1236540) 完成,即可见到winserver2016的远程桌面:
6. 在做win下相关的实验的时候我们需要输入相应的密码,不方便,可以按照以下步骤,设置win用户的自动登录:
Win + R(运行相关的命令):control userpasswords2
这时就会弹出一个用户帐户设置的窗口,在这里找到“要使用本计算机,用户必须输入用户我和密码”的设置项。
我们把该设置项前面的勾选去掉,最后点击确定按钮。
这时会弹出一个自动登录的默认账户设置窗口,在这里设置好用户名,然后下面输入对应的登录密码(注意必须保证和登录密码一样),最后点击确定按钮。这样以后Windows系统启动的时候,就会自动登录该账户,而不会再出现登录选择窗口了。
7. 如果想不输入服务器密码和自动点击自动远程,可以添加两个参数在url中,password=a1236540(服务器密码参数) autoconnect=true(自动登录参数) ,则新的url应该为:http://192.168.57.129:9000/?password=a1236540&&autoconnect=true 可以直接远程到相应的系统桌面:
3、在Ubuntu中建立vncserver的服务器
- 先更新Ubuntu的软件包:sudo apt-get update
- 安装vnc4server:sudo apt-get install vnc4server
- 启动vnc4server服务:vnc4server //这里会提示输入密码,就是服务器的访问密码:a1236540
- 安装并配置noVNC:sudo apt-get install git
git clone https://github.com/kanaka/noVNC
cd noVNC
./utils/launch.sh --vnc 127.0.0.1:5901
//127.0.0.1:为ubuntu本机的IP地址。
//5901:为目标机启动vnc4server时启动的1号服务
vi vnc_token //新建一个文件,写入要访问的目标机的相关内容
//最后启动的命令如下
./utils/websockify/websockify.py --web ./ 8844 --target-config=/home/jiao/noVNC/test.conf
执行上述最后一条命令后结果(要切换到noVNC目录下执行,要提前关闭防火墙):
5. 测试连接Ubuntu上的网站URL为:http://192.168.57.128:8844/vnc.html?path=?token=abc789&&password=a1236540&&autoconnect=true
说明:
192.168.57.128:8844 :为主机Ubuntu的ip和vnc服务器的端口
path=?token=abc789 :为vnc_token文件中写入的目标机的名称
password=a1236540 :为Ubuntu的vncserver服务器的密码,有了这个参数,可以不用手动输入服务器的密码
autoconnect=true : 为自动点击“链接”自动登录的参数
测试结果为:
4、Centos7中建立VNCserver服务器
1.(如果防火墙未关闭)关闭防火墙:service firewalld.service stop
2. 查看本机ip地址,将ip+端口,写入Ubuntu代理服务器的配置中:
3. 安装git(以便下载novnc源码):yum install –y git
4. 安装配tigervnc: yum install tigervnc-server
输入 vncserver :1 启动服务,并输入密码=a1236540(注意密码长度不小于6位,1代表的是默认端口5900+1=5901):
5. 将winserver2016、centos7、ubuntu16.04都配置到代理服务器的最后的配置文件为:test.conf
6. 因为虚拟机启动的时候,最好可以自动登录,方便做实验,所以要设置CentOS7启动的时候,自动登录相关的用户:
首先,在 CentOS 7 桌面右击鼠标,选择“设置”。
在设置界面中点击进入“用户”。
随后,在用户窗口中,先选中你要自动登录的用户名,再点击右上角的“解锁”。
这时,会弹出一个认证窗口,要求你输入当前用户的登录密码。密码输入完成后,点击“认证”。
认证之后,我们再打开“自动登录”的开关。
现在,我们在下次开机时就可以无需手动输入密码自动登录到 CentOS 7 系统了。
7. 当不同的同学的开启不同的虚拟机做实验的时候,不能再手动去启动每个虚拟机的vncserver服务,需要在win和linux系统下,都设置为随系统启动而启动。在win下直接将Utrlvnc直接设置为自启动就可以。而在Centos下需要进行相应的设置:
(1)创建一个新的配置文件,以开启1号窗口为例(也可以同时开启多个窗口,修改数字即可),方法如下:
cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service
或者再增加一个窗口:
cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:2.service
(2)编辑/lib/systemd/system/vncserver@:1.service,设置用户root相关参数,最终内容如下:
上述内容中最好设置为root用户,否则可能会看到以下报错:
(3)更新systemctl以使其生效:systemctl daemon-reload
(4)设置vncserver的密码: vncpasswd root
按提示输入密码以及确认密码
(5)启动该服务用来启用vnc的1号窗口;
systemctl start vncserver@:1.service 或者 vncserver :1
关闭1号窗口:
systemctl stop vncserver@:1.service 或者 vncserver -kill :1
(6)设置为开机自动启动;
systemctl enable vncserver@:1.service
5、利用Ubuntu代理服务器访问:
配置完三个虚拟机以后,启动三个虚拟机,winserver和centos的vncserver会直接启动,不需要特殊的处理。而Ubuntu需要启动vncserver:vncserver :1 ,然后进入noVNC目录,启动novnc:./utils/websockify/websockify.py --web ./ 8844 --target-config=/home/jiao/noVNC/test.conf ,在浏览器中可以分别通过以下url直接访问三个虚拟机的远程桌面:
WindowsServer2016:http://192.168.57.128:8844/vnc.html?path=?token=abc789&&password=a1236540&&autoconnect=true
Ubuntu16.04:http://192.168.57.128:8844/vnc.html?path=?token=abc123&&password=a1236540&&autoconnect=true
CentOS7:http://192.168.57.128:8844/vnc.html?path=?token=abc456&&password=a1236540&&autoconnect=true
四、集成到JavaWeb平台
1. 在MyEclipse10中创建JavaWeb项目——WebVMware
- JDK用的是Myeclipse10默认的JDK1.6.0_13
- Tomcat用的是apache-tomcat-7.0.42
- 利用ajax技术,实现页面的局部刷新,也就是切换和管理虚拟机
- 前端的布局直接用的bootstrap框架和js进行相关的功能控制
- 项目的目录结构和具体的相关设置为:
2. 集成noVNC功能的关键点
- 为了通过网页来控制做实验所需要的虚拟机,就需要通过Tomcat服务器来调用VMware的命令管理方式,直接通过Java调用Win先命令的接口Runtime来直接开启和关闭相应的虚拟机,关键的代码为:
- 为了随时切换不同的虚拟机进行相关的实验操作,需要对网页的内容进行局部刷新,所以需要通过不同的点击事件,来通过ajax去对服务器的虚拟机进行相应的操作,关键的代码为:
3. 待解决的地方
- 在win和linux的网页远程桌面操作的时候,剪贴板的功能不稳定,而且不支持文件的传输操作,需要解决
- 在本平台的情况下,只是建立了简单的三台虚拟机进行实验。其中实用阶段的网络延迟、细节操作、权限的限制、链接的安全性和高效性都是需要我们考虑和解决的
- 本平台在实验的过程中,参考了很多网友的博客或者帖子,再次表示感谢,参考文献中也列出了一些地址,如有错误或者不足的地方,欢迎大家讨论~
五、参考文献:
- noVNC在Windows下的安装配置: http://www.zhumeng.org/thread-292491-1-1.html
- win 设定 默认登录的用户名和密码:https://jingyan.baidu.com/article/fc07f989b561cd12ffe519cf.html
- noVNC+VNCserver实现远程访问Docker容器桌面:https://blog.csdn.net/u012829611/article/details/72576493
- CentOS 7 怎样自动登录:https://jingyan.baidu.com/article/a3761b2bc3c3771577f9aa6f.html
- CentOS7下安装配置vncserver/vncviewer:http://blog.51cto.com/hsuehwee/1632211
- vnc与Windows、linux远程桌面实现复制和粘贴:https://blog.csdn.net/u014505990/article/details/72628243
- vmrun命令行的使用(VMWare虚拟机):https://blog.csdn.net/devper/article/details/54089342
- Java——调用Linux和Windows下命令行执行程序:https://blog.csdn.net/u013507760/article/details/51899723
- JavaWeb 之 AJAX和其json数据的处理:https://www.cnblogs.com/jiangwz/p/7450570.html