spice虚拟桌面基础

发布时间:2016-12-9 14:02:55 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"spice虚拟桌面基础",主要涉及到spice虚拟桌面基础方面的内容,对于spice虚拟桌面基础感兴趣的同学可以参考一下。

1. VDI架构     VDI架构提供了一种可以通过软件组件发布虚拟设备的方法,其它软件组件可以与这些设备进行交互。后端暴露了像display port、mouse input等接口,前端插入display output并根据特定实现进行渲染,以及插入mouse input并发送鼠标事件给后端处理。     此外很多其它接口可以通过后端(back-end)暴露出来,另一个例子就是物理机上的远程显示系统:后端使用现有的技术与原生os交互,来接收显示跟新和推送输入消息。后端暴露了像显示输出、鼠标输入一样的接口。前端(front-end)的作用就像之前的例子。使用VDI后端可以不用做任何代码改动就可以使用很多类型的前端。     后端与前端的交互是由后端来初始化的。后端使用VDI_init将核心接口传给前端,通过核心接口,后端也将选项参数传给前端。核心接口与其它VDI接口一样,就是一个包含数据成员和成员函数的数据结构。核心接口提供了接收变化事件的方法。通过这些,前端可以找到并与后端暴露的接口交互。     spice server实现了VDI前端,qemu提供了后端接口。 2. 基本架构     Spice基本模块包括spice protocol, spice server, spice client。另外还包括Qxl设备和guest qxl驱动。 2.1 Graphic Commands Flow            上图显示了spice的基本架构和guest-to-client的图形绘制流程。server,即libspice在qemu中是作为一个动态库提供的。图形命令数据流开始于用户程序向os图形引擎(X或GDI)发起渲染请求。图形引擎将命令传给qxl驱动,后者将os命令翻译为qxl命令,并将它们推送进command ring。Command ring是qxl驱动中的一个队列,libspice从command ring中取出命令,将其加入到图形命令树中。图形命令树包含了命令的集合,执行这些命令会产生显示内容。libspice用这个树来优化到client的命令传递,方法是丢弃那些会被隐藏的命令。这个命令树另一个用途是探测视频流。libspice保存了发送到客户端的命令队列来更新显示。当一条命令从队列中取出时,转成spice protocol message。当一个命令不再使用时,libspice将其放入驱动release ring,qxl驱动释放掉命令资源。client收到图形命令后用其来更新显示。 2.2 Agent commands Flow         Spice agent模块是在guest os中执行的模块。Spice server和client用agent来完成需要在guest os中执行的任务,例如配置guest os显示设置。上图显示了Spice client和server利用VDIPort设备和驱动来通信的过程。VirtIo驱动通过Input/Output rings与guest os通信,Client和server产生的消息写入同一个server中的队列,稍后写入到设备的output ring,然后从设备input ring中读取消息到server的read buffer。消息端口决定了是由server处理还是传给client。 2.3 Spice client     Spice client是终端用户直接使用,来连接spice虚拟机的。 2.4 Spice server     Spice server作为VDI动态库实现的。VDI提供了一种以软件组件形式发布虚拟设备接口的标准,其它软件组件可以与这些设备交互。 3 Features 3.1 Graphic commands     spice支持2d(3d还不支持)图形命令的传输和处理,而其它的远程桌面协议方案都是使用帧缓存更新。qxl设备命令是通用的、不依赖平台的,Windows和X驱动都可以原生支持。 3.2 硬件加速     基本的spice client渲染是Cairo实现的。Cairo是个跨平台、不依赖设备的库。Cairo为二维绘制提供了矢量图形原语。硬件加速是另外的渲染模式,渲染可以通过client所在终端的GPU实现,而不是依靠软件。硬件加速是通过OpenGL(Linux)或GDI(Windows)实现的。硬件加速的优点:     1)高的渲染性能---spice client使用OpenGL渲染速度更快。像视频流中使用的stretching操作使用硬件加速会快很多,带来更流畅的用户体验;     2)减小终端的CPU使用。 3.3 图像压缩     Spice提供了几种图像压缩算法,可以在server初始化的时候进行选择,运行时动态调整。Quic压缩是基于SFALIC算法的spice专用图像压缩工具。LZ压缩算法会根据图像调整。Quic和LZ都是本地算法,它们独立地分别对每幅图像进行编码。Global LZ(GLZ)是基于历史的全局字典、使用了LZ压缩算法的spice专有压缩算法。GLZ利用图像间的重复模式来减少带宽占用。Spice还提供了根据每张图片的质量来自动选择的压缩算法。 3.4 视频压缩     Spice使用了有损压缩和无损压缩。无损是为了避免重要的显示对象的破坏。既然视频流是主要的带宽占用因素、每个视频帧是独立的,并且内容又常是不重要的,因此spice为这样的视频流使用了有损压缩:spice server通过辨识变化较快的区域来启发式辨识视频区域。这些区域更新使用了有损的Motion JPEG(M-JPEG)压缩以视频流方式发送到client。这种机制减少了带宽占用,提高了spice性能。 3.5 缓存     Spice实现了client图像缓存以避免冗余的传输数据。缓存适用于任何发送到client的图像数据,包括pixman、调色板和光标。每张图像从驱动里面带有一个唯一的id和缓存hint。不同的图像id不同,相同的图像id相同。server根据缓存hint进行图像缓存。Pixman缓存在所有display中是共享的。缓存是根据连接来定义的,在server和client间保持同步,即,在每个时刻server都知道client缓存中的图像。server来决定缓存中的某个项目是加入还是移除。client的缓存大小是由client设置的,通过显示初始化消息传给server。server监视当前的缓存容量,当缺少空间时则移除最不常使用的缓存项,直到有足够的缓存。server发送invalidate命令,client移除这些项。 3.6 鼠标模式     分为server鼠标和client鼠标两种模式,通过client和server协商可以动态改变。 参考:     1. http://spice-space.org/docs/vd_interfaces.pdf     2. http://spice-space.org/docs/spice_for_newbies.pdf

上一篇:linux 路由表 配置
下一篇:信息时代,我们需要改变观念了

相关文章

相关评论