红帽Spice 入门

来源:互联网 发布:徐州seo 编辑:程序博客网 时间:2024/04/30 09:06

1. Introduction

SPICE(独立计算环境的简单协议)- Simple Protocol for independent Computing Environment

Spice 是一个开放的远程计算解决方案,使得客户端可以访问远程机器桌面和设备(比如键盘,鼠标,audio和USB)。通过Spice我们可以像使用本地计算机一样访问远程机器,这样可以把CPU GPU密集工作从客户端移交给远程高性能机器。Spice适用于LAN和WAN,并且不会损害用户体验

Spice项目提供了和虚拟桌面进行交互的解决方案,并且是完全开源的。Spice项目可以处理虚拟设备(后端back-end)和前端 front-end。在前端和后端间通过VDI(Virtual Device Interfaces)进行交互。


2. Basic Architecture

Spice由三个基本部分组成:Spice 协议,Spice server和Spice client。

2.1 Graphic Commands Flow


上图显示Spice的基本架构,以及guest到client之间传送的graphic命令数据流

当Guest OS上一个user应用请求OS图形引擎执行一个渲染操作。图形引擎传送命令给QXL驱动,QXL驱动会把OS命令转换为QXL命令然后推送到QXL设备的commands RIng缓冲中。commands Ring是QXL Device中的一个队列。Libspice会从这个commands Ring取得命令数据,然后加到graphics命令树上。显示树上包含一组操作命令,这些命令的执行会产生显示内容。这棵树可以优化掉那些会被覆盖掉的命令,命令树还用来检测video数据流。当命令从libspice的发送队列发送给客户端时,发送命令被转换为Spice协议消息,同时这个命令从发送队列和树上移除。

当libspice 不再需要一个命令时,它被推送到release ring。驱动使用这个队列来释放相应的命令资源

当客户端从libspice接收到一个命令时,客户端使用这个命令来更新显示。


2.2 Agent Commands Flow


Spice 代理是guest中的一个软件模块。Spice server和Spice client使用代理来执行在guest上下文中的工作,比如配置guest display设置。上图显示了spice client和server通过VDI 驱动和设备进行通信的过程。Message包括client的guest显示配置信息,server的鼠标移动信息以及代理的配置应答。驱动使用Input/Output Rings和VDI Port Device通信。客户端和server生成的信息都写入到服务其中相同的写队列中,然后再写入VDI Port Device的output buffer ring。Message port决定是否messages被server处理还是推送给客户端。


2.3 Spice Client

Spice跨平台客户端是终端用户的接口

2.3.1 Client Basic Structure

2.3.2 Client Classes

下面是Spice Client关键类的简介。为了有一个清晰的跨平台结构,Spice定义了一个通用的接口,而把平台相关的实现放在了一个并行的目录中。这个通用的接口就是Platform class,定义了许多低级服务,比如timer和cursor操作。

Application

是一个主要的类,包含Clients, monitos和screens,这个类实现了通用的应用功能:命令行解析,主循环,时间处理,鼠标事件重定向,全屏切换等等。

2.3.2.1 Channels

client和服务断通过channels进行通信,每一个channel类型对应着特定的数据类型。每个channel使用专门的TCP 端口,这个端口可以是安全的或者不安全的。在客户端,每一个channel会有一个专门的线程来处理,所以我们可以为每一个channel设置单独的优先级来达到不同的QoS

RedClient

是主channel。它拥有所有其他的实例化通道,并且可以控制他们(创建,连接,断开等),并且处理控制,配置和迁徙。


可用channel包括

Main - 由RedClient实现

DisplayChannel - 处理图形化命令,图像和数据流

InputsChannel - 键盘和鼠标事件

CursorChannel - 指针设备位置,显示和光标形状。

PlaybackChannel - 从服务器接受audio,然后在client进行播放

RecordChannel - 在client端进行录音


2.3.2.2 Screens和Windows

ScreenLayer - screen layer绑定到特定的screen,用来提供矩形区域的操作。layer是z-order

RedScreen - 实现screen的逻辑,控制window,使用 screen layers来显示他的内容

RedDrawable - 基本pixmap的平台特定实现。它支持基本的渲染操作。


2.4 Spice server

spice server是通过libspice和VDI library实现的。VDI提供了一个标准的方法来发布虚拟设别的接口。这使得其他的软件部件可以和这些virtual device交互。

一方面,server使用Spice 协议和远程client通信,另一方面,它和VDI host应用进行交互。

server为了远程显示的目的,server维护了一个命令序列和一棵树来管理当前对象的依赖关系和覆盖关系。QXL命令被处理转换为Spice 协议,然后发送给客户端。


2.4.1 Server structure


Server通过channels和client通信。每一个channel类型对应一种特定类型的数据。每一个channel使用专用的TCP port。服务端的channel和client的channel是对应的,也有Main, Inputs, Display, Cursor Playback和Record

Main 和input channel是用来控制的,display 和cursor channels被每个display的red worker线程控制。audio playback和record channels有他们自己的处理函数。Libspice和VDI host应用和各种功能接口进行通信  如Agent, keryboard, record等等

如上图所示Spice server包括如下主要部件:

2.4.1.1 Red Server

Server自身,用来监听客户端的连接请求,接受连接并使用它们通信。负责如下工作:

1. 管理channels

拥有或者管理channels(注册,注销和关闭)

通知client活动的channels,以便client能够创建他们

Main 和 input channels的管理

链接的建立

socket操作,以及链接管理

处理SSL和票据

2. VDI接口

3. 迁移进程协作

4. 处理用户commands

5. 和guest angent 通信


2.4.1.2 图形子系统

不像Spice中的其他子系统,graphics子系统在server中通过专有的线程并行运行。这种结构使得QEMU流,以及输入的图形命令的处理和渲染保持独立,因此消耗很多的CPU资源。上图显示了Spice server图形子系统的结构。Red server实例化一个dispatcher,并带有QXL interface. dispatcher为这个QXL interface创建red worker. worker处理的命令有三个来源:1. 同步的QXL设备命令,2. red server commands, 3. 异步的QXL设备命令. 1和2 由dispatcher 通过socket分发; 3由worker从QXL设备rings拖下来。


2.5 Spice Protocol

spice protocol 用于client 和server间的通信. 比如传输图形对象, 键盘和鼠标事件, 光标信息, audio playback和录音,以及控制命令。细节文档参见Spice协议

2.6 QXL设备

2.7 QXL GUEST 驱动

2.8 Spice Agent

Spice代理是一个可选部件用来增强用户体验以及执行面向guest的工作。例如,当使用客户端鼠标模式时,agent插入鼠标位置和状态到guest. 此外,它可以用来配置guest显示设置。未来的功能包括从guest复制对象或者粘贴对象到guest.

2.9 VDIPort Device 和 Driver

Spice协议支持client到服务器端代理之间的通信channel。当使用QEMU时,Spice代理驻留在guest上。VDI port是一个QEMU PCI设备用来和agent之间通信,使用一个特定的代理协议进行通信。


3 Features

3.1 Graphic commands

Spice支持2D图形命令的传输和处理(3D图形命令暂时还不支持),而其他的远程桌面解决方案一般使用framebuffer的更新。QXL设备命令是通用的平台独立的,所以Windows和 X drivers都可以使用它。

3.2 硬件加速

基本的Spice client渲染是通过Cario执行的,cario本身又是跨平台的设备独立的库。Cario为二维绘图提供了向量图形原语。硬件加速是一个额外的渲染模式,渲染通过client的GPU而不是软件实现的。硬件加速在linux是通过OpenGL实现,在Windows中为GDI。使用硬件加速有如下有点

  • 高性能渲染 - 使用OpenGL,Spice client能够渲染的更快。使用硬件进行拉伸要比耗费大量软件操作的拉伸高效的多。因此,Spice 能够达到更好的用户体验。
  • 减少客户端CPU使用率 - 客户端可以用节约下来的CPU时间,用来执行其他的工作,比如audio

和Cario不同,Cario是一个完全独立的软件库,而OpenGL则是一个硬件库,依赖于驱动和硬件实现。因此Spice可能会碰到不正确的渲染,或者client host崩溃。此外,尽管OpenGL是标准的,但是各个厂商的硬件和驱动实现可能有所差别。因此,在不同的GPUs上,Spice可能显示不同的渲染输出,已经不同的性能表现。此外,还有一些设备并不支持OpenGL

3.3 Image Compression

Spice提供了几个image压缩算法,可以在初始化时选择,并能在运行时动态更改。Quic是Spice专有的image压缩工具,基于SFALIC算法。LZ算法是另外一个选择。Quic和LZ都是本地算法。Global LZ是另外一个Spice专有算法,使用LZ以及一个基于历史的全局字典。GLZ利用图像中的重复模式来减少网络流量,这对于运行于WAN环境下的远程桌面是重要的。Spice提供了针对每副图片压缩的自动选择模式,针对图片的属性启发性的选择LZ/GLZ和Quic压缩算法。一般来说,人造图片使用LZ/GLZ更好,而真实图片则使用Quic

3.4 video压缩

Spice对于图片使用的是无损压缩算法,这是为了避免关键显示对象信息的丢失。但是,由于video流可能是带宽的主要消耗者,因为video中的每一帧都是一个单独的图像。此外这些图像并不是关键数据。因此,Spice对这些视频流采用有损压缩,Spice server启发性的识别视频区域更新频率搞得区域,这些区域的更新采用Motion JPEG算法编码,编码后发送给client。这种机制节省了很多带宽,改善了Spice性能,尤其是在WAN网络上。当然,在某些情况下,启发行为可能会导致低质量的图像。

3.5 Caching

Spice实现client 图像高速缓存,以便避免冗余的传输。Caching可以应用到任何发送给client的数据,包括pixmaps, pallettes和cursors。每一个图片都有一个唯一的id和cache提示。不一致的images有不同的ids,而相同的图片则共享同样的id. Pixmap cache在所有的display中共享。Cache是每链接定义的,服务端和client是完全同步的,也就是说在每一个时刻

3.6 鼠标模式

Spice支持两种鼠标模式,server端和client端。鼠标模式可以动态改变,并且可以在client和server之间协商。

  • 服务端模式 - 使用QEMU ps/2鼠标模拟器在guest使能鼠标。一旦user在Spice client窗口中点击鼠标,client鼠标被捕捉并被设置为不可见。client发送鼠标移动变化值给服务端。因此,client鼠标在每次移动后都会返回到窗口中心。在这种模式下,server控制鼠标在屏幕上的位置,所以它一直同步client和guest上的位置。然而,在WAN或者负载较重的服务器上可能会造成问题,鼠标光标看起来有些迟钝或者没有响应。
  • Client模式 - client鼠标不被捕获并且guest 光标也不会显示。client发送鼠标移动的绝对坐标给server。Guest agent按guest桌面比例缩放坐标位置并且插入相应的坐标位置。对于单显示器,通过VDI host应用注册一个绝对定位设备,就可以在没有agent的情况下使用client 鼠标。在这种情况下,Spice server 负责缩放坐标。Client模式很适合WAN和高负载服务器,因为光标运动很平滑并且响应好。然而,光标可能会偶尔失去同步(位置和形状不一致). client鼠标光标由guest mouse光标更行的。

3.7 多显示器

Spice支持任意数目的监视器,仅受限于guest, client和server. 监视器数目和他们的ram大小是在加载VM时设置的。Spice支持根据client机器参数自动配置guest监视器分辨率和显示设置,通过一个客户端到guest agent的命令实现。


3.10 活动迁移

服务器间的VM迁移对于已经连接的client来说是无缝的. 完整的连接状态,包括打开的channel和cursor,到会从source恢复到目标机器