使用 noVNC 开发 Web 虚拟机控制台

本文详细介绍了如何将noVNC集成到OpenNebula私有云中,实现VNC访问控制。通过使用websockify作为代理,可以轻松地将VNC客户端与VNC服务器连接起来,无需额外下载安装VNC客户端。文章还深入探讨了OpenNebula如何自动化管理noVNC集成,以及如何通过改变token参数切换连接到不同的虚拟机VNC。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenNebula 的控制面板 Sunstone 对 OpenNebula 私有云的管理员来说很方便实用,不用敲命令,但是对云计算、虚拟机不熟悉的用户来说有点复杂。所以,我们打算开发一个内部使用的 OpenNebula 控制面板,并和我们的其他内部服务集成起来。从不同 VPS 服务商那里用过 VPS 的用户都知道 VPS 控制面板的几个基本功能,创建、删除、重装、控制台访问。其中控制台访问功能的实现就是我们今天要讨论的主题。

我们知道不管是 VMware, Xen 还是 KVM,都可以配置 VNC 访问,然后通过 VNC 客户端访问这些虚拟机的控制台,这些 VNC 客户端往往需要下载安装,如果要开发虚拟机的 web 控制面板的话当然最好能配一个 web 的 VNC 客户端。

noVNC 正是我们需要的 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算、虚拟机控制面板中,比如 OpenStack Dashboard 和 OpenNebula Sunstone 都用的是 noVNC. 前面说了 noVNC 采用 WebSockets 实现,但是目前大多数 VNC 服务器都不支持 WebSockets,所以 noVNC 是不能直接连接 VNC 服务器的,怎么办呢?需要一个代理来做 WebSockets 和 TCP sockets 之间的转换,理解这一点很重要。这个代理也已经有了,在 noVNC 的目录里,叫做 websockify.

基本

下载 noVNC 代码后然后运行 noVNC/utils/websockify.py,把本机 VNC 服务(localhost)的端口(5900)和 noVNC 的代理端口(8000)连接起来,这样通过 noVNC/vnc.html 访问 8000 端口就自动转换到 5900 端口上(事实上 vnc.html 你可以放在任何机器上用浏览器直接打开用):

$ git clone https://github.com/kanaka/noVNC

$ cd utils
$ ./websockify.py 8000 localhost:5900
WARNING: no 'numpy' module, HyBi protocol is slower or disabled
WebSocket server settings:
  - Listen on :8000
  - Flash security policy server
  - No SSL/TLS support (no cert file)
  - proxying from :8000 to localhost:5900

流程大概是这样:

vnc.html -> 192.168.2.20:8000 -> websockify.py -> localhost:5900

当然代理和 VNC 服务可以不在同一机器上,比如代理在 192.168.2.20, VNC 服务在 192.168.2.21:

$ ./websockify.py 8000 192.168.2.21:5900

流程大概是这样:

vnc.html -> 192.168.2.20:8000 -> websockify.py -> 192.168.2.21:5900

理解了上面的过程,应该有想法如何集成 noVNC 到自己的程序了,很简单,先用 websockify 架一个代理,然后用 vnc.html 访问这个代理,vnc.html 和 vnc_auto.html 可以当作我们的范例程序参考。集成 noVNC 到自己的程序也没啥难度,按照官方文档修改相应参数就可以了,特别注意 INCLUDE_URI 这个变量。

如果想深入了解 OpenNebula 和 noVNC 请继续 ……

深入

如果给每个运行的 VNC 服务器开一个代理(和端口)是不是很繁琐?如果有成百上千个虚拟机呢?这么多虚拟机这么多端口怎么编程实现一一对应呢,是不是很麻烦?难道这么点东西还要个数据库来记录这些对应关系吗?我们来看一下 OpenNebula 是怎么实现 noVNC 集成的。

首先 OpenNebula 使用 websocketproxy.py 带 –target-config 参数的办法启动了代理,所有代理都在一个端口(29876)下,并会在指定的目录下(/var/lib/one/sunstone_vnc_tokens)生成一个对应的文件(one-96),打开这个文件就会看到前面的一串代码和后面的 VNC 服务(主机名:端口)对应起来。这样一个(启动了 VNC 服务的)虚拟机就对应在 sunstone_vnc_tokens 这个目录生成一个文件,文件内容能识别这个代理对应到哪个主机上的 VNC 服务。

# ps aux | grep websockify
oneadmin 13661  0.0  0.2 197576  8388 ?        S    Jul04   0:07 python /usr/share/one/websockify/websocketproxy.py --target-config=/var/lib/one/sunstone_vnc_tokens 29876

# cat /var/lib/one/sunstone_vnc_tokens/one-96
cirjhccnthfinxpdlig: cloud32:5900

修改 noVNC/vnc_auto.html 文件的 host, port, path 部分,注意 path 是带 token 的,token 的参数要和上面的那串奇怪的代码一致:

...
      host = "192.168.2.20";
      port = "29876";
...
      path = "websockify/?token=cirjhccnthfinxpdlig";
...

我们编程时只要改变上面的 token 参数就可以切换连接到不同的虚拟机 VNC,这样编程就方便多了。

### 配置允许访问所有虚拟机控制台 为了使管理员能够更便捷地访问所有虚拟机控制台,可以考虑采用VMware自带的VNC功能来简化这一过程[^1]。然而,在某些情况下,比如使用NoVNC连接Proxmox VE(PVE)中的虚拟机时可能会遇到特定的安全协议错误,如`Unsupported security types (types: 262)`这样的提示信息[^2]。 针对上述提到的问题以及实现方便快捷地访问多个虚拟机的需求,建议采取以下措施: #### 解决方案概述 对于希望利用VNC服务作为替代方法的情况来说,确保所使用的VNC客户端版本兼容于服务器端所提供的安全模式非常重要。当面对类似于“不支持的安全类型”的问题时,可以通过调整VNC服务器配置或更新至最新版的NoVNC客户端尝试解决问题。 另外一种更为通用的做法是在创建KVM类型的虚拟机时指定图形界面选项为无(`--graphics none`)并启用串行控制台输出(`console=ttyS0`),这使得即使没有GUI也能通过SSH或其他远程终端工具轻松获取到虚拟机的日志和交互式输入输出环境[^3]。 ```bash virt-install \ --virt-type=kvm \ --name=centos_vm0 \ --vcpus=2 \ --memory=1024 \ --location=/var/iso/CentOS-7-x86_64-DVD-1708.iso \ --disk path=/var/vms/centos_vm0/vm0.qcow2,size=64,format=qcow2 \ --network bridge=br0 \ --graphics none \ --extra-args='console=ttyS0' \ --force ``` 此命令不仅定义了一个新的基于KVM架构运行CentOS镜像的新虚拟机实例,还特别指定了启动时不加载任何图形化组件而是直接进入字符模式下的TTY设备(console=ttyS0),从而绕过了可能存在的显示驱动程序冲突等问题,并且大大减少了因缺少必要的X Window System库而导致无法正常工作的可能性。 #### 进一步优化网络设置 考虑到实际应用场景中往往还需要让外部网络内的其他计算机也能够顺利连入这些内部部署好的虚拟资源,因此合理的网络规划同样不可或缺。例如,确保每台主机都加入了同一物理交换机上的相同VLAN标签划分出来的逻辑分组里;或者是借助路由器NAT转换机制将来自公网IP的数据包转发给对应的私网地址段成员等等[^4]。 最后值得注意的是,无论选择哪种途径去达成目的——无论是改进现有的基础设施还是引入全新的技术手段,安全性始终应当放在首位考量的位置之上。这意味着要仔细审查每一个新增加的服务接口是否存在潜在漏洞风险,并及时应用官方发布的补丁修复已知缺陷之处[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值