通过 noVNC 实现数千台自助机的实时可视化

背景很简单,目前我们运营维护着北京市属三甲医院数千台的自助机,这里面包含挂号取号机、检查报告机以及其他若干衍生出来的自助机种类,数量已经超过一千多台,不同的院区通过密密麻麻的专线跟我们的机房源源不断的进行着各种协议的数据传输与交互。

由于各方面技术以及非技术层面的限制,只能使用微软的系统,为了管理这部分的机器,一方面我们通过 saltstack 来进行日常的产品升级以及变更,对于桌面的可视,比如我们需要知道当前这台自助机前患者的操作,就需要 VNC 来帮助了。

一年前自助机刚上线时候,没有很详细的考虑过自助机的大规模运维问题,当时每台自助机都在 Clonezilla 打包阶段打包进了 realVNC,通过一台 Win 跳板机的 realVNC 客户端去连接,realVNC 有书签的功能,所以当时需要查看每台自助机界面的运行情况相对比较方便,随着数量的增加,这种先登录一台 win 的跳板机,在使用 realVNC 书签查看的传统 CS 架构就捉襟见肘了。迁移到 web 上势在必行,本着可小动不大动的原则,调研了 realVNC 的各种 SDK,遗憾的是都不支持,加上 realVNC
有版权问题,放弃。相比之下,TightVNC 则不存在这类问题。

后来我们组的同学调研了几个基于 web 的 VNC 客户端,peer-vncnoVNCguacamole ,peer-vnc 活跃量太低,底层用的是 noVNC,guacamole 还处在孵化期(功能相当强大)并且比较重,放弃。最终选择在 noVNC 的基础上做一些工作。

由于 TightVNC 默认不支持 WebSockets, noVNC 提供了 websockify 这个工具来做 TCP socket 的代理,接受 WebSockets 的握手,转化解析成 TCP socket 流量,然后在 CS 两端传递。由于我们涉及到较多的机器信息需要维护管理,我们将所有的机器信息,比如自助机的编码,机器名,IP/MAC 相关的信息预先存储到 MySQL 里面,接着按照 token: host:port 既定格式生成每家院区的连接信息配置文件,这一步可以在 jenkins/rundeck 上建个 job 方便每次增删改查。接着就可以启动了转发了。

在浏览器中打开本地的 6080 端口即可。下图是集成到我们内部管理平台上的截图,可以快速定位到自助机的健康状况并通过 VNC 进入确诊当前的状态:

noVNC 默认情况下会以交互式的方式连接,在这个过程中会做身份权限校验(账号连接、读写控制),是否是 true color 等,这个对于生产不是很适用,我们后来将授权这块做在 Django 上,结合 LDAP 做登录认证。考虑到专线带宽的限制,默认关闭了 true color 开启了压缩。VNC 对带宽的消耗还是比较厉害的,平均下来,每开一个新链接,会消耗 1Mbps 左右的带宽,所以如果需要做实时的展示大屏,需要考虑这块的瓶颈。

下图是 noVNC 实时图像,由此我们可以看到当前这台自助机的实时状态并对问题的自助机采取一定的操作:

最后将其挂在 haproxy/Nginx 后面,Nginx 1.3 之后支持 websocket,一个快速搭建并可投入使用的自助机可视化平台就算完成了。该平台我们内部命名为 bangkok。

以上思想可以移植到 *nix 平台上,目前不少主流的云 OpenStack/OpenNebula/Digital Ocean 也集成进了 noVNC。

How Many Ports Will VNC Open?

# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:5801                0.0.0.0:*                   LISTEN      8047/Xvnc
tcp        0      0 0.0.0.0:5901                0.0.0.0:*                   LISTEN      8047/Xvnc
tcp        0      0 0.0.0.0:6001                0.0.0.0:*                   LISTEN      8047/Xvnc

这三个端口分别代表什么?

“For each session number, VNC will listen on three different network sockets. If N is the session number, VNC server will listen on 5800 + N for HTTP connections, on 5900 + N for VNC RFB connections and on 6000 + N. This last port allows X applications to connect to the VNC server. So in our case, the ports that VNC uses are 5801, 5901 and 6001.”

5801 是由 java applet 使用,也就是网页版 b/s 模型;5901 是使用 RFB 协议实现的 c/s 模型;二者选择一个即可。6001 让 X 应用连接 server。

一个 VNC 默认开了 3 个端口,个人认为即使认证跟连接都用 RSA 加密,也是很不安全的,ftp 这种不过才开了 2 个端口。

参考:
http://www.linuxjournal.com/article/5560

昨日小结

1) 之前一直以为 reboot 以后 , ssh 会自动断开连接 , 也就是说再也连接不上了 , 但事实不是这样的 , 昨天得知 , 作为一个多用户操作系统  . reboot 以后 , 那台 CentOS 5.5 的是不能进入 init 5 了 , 但是我们远程的用户还是可以通过 ssh 来连接的 , 此时就是进入到 init 3 下了 .

2) 其实在使用 KVM 的时候还是有办法进入图形界面的 , 通过 vnc 就可以了 . 先通过 ssh 来 restart vnc , 分配好用户密码什么的就可以了.
Continue reading

VNC 黑屏解决办法

前天在那台 CentOS 5.5 的机子上装上了 VNC . 启动时在我 10.04 上发现是黑屏 .
解决办法如下:

注释掉 ~/.vnc/xstartup 中的如下两行
# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

修改 xstartup 文件的权限
# chmod 755 ~/.vnc/xstartup

断开正在连接的客户端
# vncserver -kill :1

重启服务
# service vncserver restart
Continue reading