随着大数据和人工智能的热潮,计算机专业学生平常做实验的环境要求也越来越复杂。考虑到硬件和成本的约束,为了充分利用现有的资源和方便进行管理,需要不同的环境进行实验的时候,建立各种不同的虚拟机进行相关的实验。特别是一些大数据方面的集群实验、区块链多节点的实验、人工智能的分布式计算等等都需要多种不同的虚拟机来进行实验和操作。
虽然不同的虚拟机解决了不同系统和环境的需求问题,但是随着同学的增加和实验的不断扩展,大量虚拟机的管理也是一个需要解决的问题。现有的远程软件虽然可以进行登录和操作,但是当大量实验课进行的时候,太多的远程连接会消耗太多的系统资源或者难以方便快捷地进行管理,故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)。其特点有:
特征
浏览器要求
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服务。
快速开始
./utils/launch.sh --vnc localhost:5901
集成和部署
有关如何将noVNC集成到您自己的软件中,或在生产环境中部署noVNC应用程序,请参阅我们的其他文档:
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)的网络畅通
安装时选择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 可以直接远程到相应的系统桌面:
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 : 为自动点击“链接”自动登录的参数
测试结果为:
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/[email protected] /lib/systemd/system/vncserver@:1.service
或者再增加一个窗口:
cp /lib/systemd/system/[email protected] /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