spice虚拟桌面基础

谁说胖子不能爱 提交于 2019-12-01 06:07:56

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!