福建升腾资讯有限公司 杨荣尊
虚拟桌面服务是典型的云计算应用,它能够在“云”上为用户提供桌面服务。桌面云服务提供商在数据中心的服务器上运行用户的操作系统以及应用,用户数据全部保存在数据中心,然后通过虚拟桌面显示协议将显示图像实时发送到用户端设备上,同时接收用户端设备的输入,并对其进行实时的响应。
随着桌面云虚拟化技术的不断成熟,微软Windows系统下的虚拟桌面显示协议已经得到了广泛的研究,国内外常见的虚拟桌面显示协议,如思杰的ICA协议、微软的RDP协议、VMWare的PCoIP协议主要支持Windows操作系统,对Linux操作系统支持较差;随着桌面云应用范围的不断扩大以及国内软件自主可控的要求,Linux桌面的需求也逐渐出现。由于Windows操作系统和Linux操作系统图形系统有较大的差异,因此虚拟桌面显示的实现在Linux平台上存在较大的差异。
Linux系统使用最广泛的图形系统是X Window System,最初是由麻省理工于1984年设计,由于其良好的设计以及灵活性,目前已经成为UNIX系的操作系统的主流图形系统。从逻辑上看,X Window System是一个典型的CS结构的设计,X Window System主要由以下三个部分组成:
图1 X Window System逻辑结构图
(1)X Server:图形服务器端,负责位图的显示、输入设备的处理等;目前Linux主流发行版本如Centos、Ubuntu使用X.Org基金会的开源实现;
(2)X Protocol:显示协议,目前使用的是X第11个版本的协议,因此也经常称为X11协议;
(3)X Client:图形客户端,通过X11协议和服务器端交互;为了软件开发的方便,避免封装X11协议的复杂性,应用程序一般调用封装好的xlib库进行X11的请求。
图2 X Window System物理结构图
在X Windows System中X Server是独立运行的进程,这一个进程控制了系统中的屏幕、键盘、鼠标等设备,X Client进程通过X11协议向X Server发送显示指令,并从X Server获取鼠标键盘的输入数据。X11底层通信一般采用TCP或者UNIX本地socket的方式。
X Windows System的设计本身就允许X Server和X Client跨主机运行,因此最简单的虚拟桌面协议的实现是在协议客户端运行一个X Server,然后通过设置环境变量DISPLAY通知X Client服务器的位置,就可以在客户端运行远端服务器上的图像应用。
图3 X11虚拟桌面
这一种实现方式不需要进行开发,只需要进行相应的设置,总体实现比较简单。但是存在以下的问题:
(1)安全性较差:X11协议是一个明文的协议,并没有对数据进行加密;
(2)网络带宽大:X11协议没有对位图数据进行压缩,网络带宽要求比较大;
(3)客户端系统兼容性差:目前只有Linux客户端系统带有X Server,其他的平台如Windows、android、iOS都缺乏成熟的X Server开源实现;
(4)配置复杂:和典型的虚拟桌面协议相比,X11协议有较多的配置在X Server端,比如字体的安装以及配置,因此客户端上的X Server配置比较复杂,用户比较难在不同客户端获取一致的使用体验。
SSH(Secure Shell protocol)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议;SSH不仅仅可以用于远程登录服务器,还可以为其他的应用提供安全通信隧道。
OpenSSH X11 Forward这一种实现方式和直接X11协议类似,只是X11数据包并不直接通过TCP协议发送,而是使用SSH隧道发送。使用SSH隧道可以解决安全性的问题,同时SSH协议支持zlib数据压缩,可以减少带宽占用,不过由于zlib是通用数据压缩算法,没有为图像进行优化,因此无法达到最佳的压缩效果。
X damage extension是X11的扩展协议,通过这一个扩展协议,X Client可以直接从X Server上获取到显示的变化区域,在Windows系统下要实现类似的功能需要通过编写虚拟的显示驱动。
开源项目X11vnc使用这一个机制实现了一个标准的X Client应用,这一个应用通过X11扩展协议x damage extension获取显示变化区域,然后使用XGetImage或者XShmGetImage调用获取变化区域对应的位图;获取变化位图后就可以采用和Windows系统相同的机制处理:选择合适的图像压缩算法压缩数据,将压缩后的数据发送到客户端。
图4 X11vnc虚拟桌面
SPICE(simple protocol for independent computing environment)最初是由Qumranet开发,后面由RedHat收购并完全开源,经过近几年的发展,已经成为了成熟的虚拟桌面协议。
图5 SPICE虚拟桌面
和前面实现相比,SPICE采用了完全不同的方式获取显示数据,它并没有在Linux系统中开发单独的组件,而是在虚拟机(QEMU)的Hyper-V层通过QXL的虚拟显示设备获取显示数据。这一种实现方式和操作系统完全解耦,可以支持任意的操作系统。
SPICE协议最大的特点是在QEMU虚拟化平台中通过软件实现的PCI显示设备QXL获取显示数据,这种架构使得SPICE协议紧密地依赖于服务器虚拟化软/硬件基础设施,SPICE必须与QEMU虚拟化环境绑定。传统的虚拟桌面传输协议工作在虚拟机Guest OS中,而SPICE协议本身运行在虚拟机所在的主机中,可以直接使用服务器的硬件资源。
基于X11协议的虚拟桌面实现难以对位图数据进行针对性的压缩,而且需要在客户端实现X Server,比较难适应各种类型的客户端系统;基于x damage extension扩展的虚拟桌面,可以高效获取屏幕变化区域,但是只能获取到位图数据,无法获取到显示指令,需要一个有效的图像压缩算法,才能达到较好的带宽;SPICE协议的实现方式可以高效的获取显示指令,但是和QEMU完全绑定,无法在其他虚拟机平台上使用。从机制上看,基于x damage extension扩展的实现方式和Windows系统下虚拟桌面实现比较类似,更适合虚拟化厂商扩展自己的虚拟桌面协议以支持Linux系统。