简单介绍SPICE中的VDI接口工作方式及实现方式

2013 年 5 月 17 日2,7450

本站主要内容均为原创,转帖需注明出处www.alexclouds.net

      红帽曾经于2011年宣布将重新引进一套建立在被称为“独立计算环境初级协议(Simple Protocol for Independent Computing Environments,简称SPICE)之上的虚拟桌面基础架构(简称VDI)。从此红帽开源的VDI这事就算靠谱了。。。。 简单的说:这一修订版的桌面系统采用SPICE机制,正如微软的远程桌面协议(简称RDP)及Citrix的独立计算架构(ICA)那样,这是一套桌面显示服务协议。这类方案的重点是相同的将繁重的运算任务交给服务器完成,而为使用者提供一款小巧低耗的客户机,如此一来,用户会发现自己小巧的客户机在处理问题方面同过往那些庞大的系统一样高效。

      红帽虚拟化战略曾经也是从Xen向KVM转移。红帽曾宣布以1.07亿美金收购了Qumranet。Qumranet是一家位于加州Sunnyvale,只有60人的初创公司。而它的所有团队成员也将加入红帽公司。Qumranet提供虚拟桌面架构(VDI)平台以及SolidICE桌面虚拟化解决方案,业界领先的独立计算环境简单协议(SPICE),更为重要的是,Qumranet领导着KVM项目,这一自2006年就被纳入Linux内核的新兴的下一代虚拟化技术。

     在服务器端,SPICE依靠内核虚拟机(简称KVM)来为大量的任务需求提供强劲的运算能力。而红帽企业虚拟化管理器 (简称RHVM)就是VDI的产品。

     博主只能从技术方面简要介绍SPICE的VDI接口:

     Spice中的VDI(Virtual Device Interfaces)是一个经过专门设计的接口规范,其设计可以推广到很多需要做功能扩展的软件项目中。此类接口设计的主要目标是在尽量不改变原有代码的情况下,通过动态库的方式来为原有软件提供全新的功能组件。这种设计哲学在以开源代码为基础的商业软件开发中,其价值尤为明显,动态库的代码是完全私有的,因此可以不公开代码。

     SPICE VDI设计目标是提供一个标准方法,能够将虚拟设备的接口通过软件组件直接开放给其他软件组件使用。这里提到了两次“软件组件”,是VDI接口标准的两大组成部分,前者被称作back-end,后者被称作front-end。在Spice中,虚拟设备即为back-end,如虚拟显卡、虚拟声卡等,libspice则充当front-end角色:
     VDI接口规范本身非常简单,它仅为开发人员提供一种标准的开发方式,具体的VDI接口功能则由程序员自己负责。

Spice实现的VDI接口主要有:

SpiceCoreInterface:    Spice与Qemu内部交互用的接口
QXLInterface:          显示数据交互接口
SpiceKbdInstance:      键盘输入交互接口
SpiceMouseInterface:   鼠标输入交互接口
SpicePlaybackInterface:音频播放交互接口
SpiceRecordInterface:  音频录制交互接口

       虚拟设备需要实现对应的物理设备所支持的所有基本功能,以虚拟显卡为例,虚拟设备必须实现标准VGA支持的所有I/0端口、显存、ROM等,所有这些工作都必须在init中完成,以保证设备能正常工作。VDI的Back-end是虚拟设备,因此有必要先简要介绍Qemu的虚拟设备实现方法。Qemu实现了非常多的设备类型,常见的有PCI、ISA、IDE、I2C等,每种设备类型都以一个struct来表示,如:struct PCIDeviceInfo定义了一个PCI设备的具体内容。尽管每种设备的功能接口各不相同,但所有设备类型都必须实现一个init函数,该函数供Qemu来初始化此设备。Qemu内部维护了一个全局的设备列表,所有Qemu内部实现的虚拟设备结构对象如显卡、声卡等都注册到该全局设备列表中。Qemu的main函数执行以前,该全局设备列表已经初始化完成。Qemu的main函数负责所有注册到全局设备列表中的设备的初始化工作,即调用这些设备对象的init函数。
 
一、SpiceCoreInterface,Spice与Qemu内部交互用的接口

    CoreInterface实现的是一个假的虚拟设备,即:它以虚拟设备的形式实现,以使Qemu在初始化时可以以统一的方式调用init函数来初始化VDI的Back-end,但不往全      设备列表中注册设备,不具备任何设备功能。
 
    BaseInterface只定义了最基本的几个信息字段,用以描述此VDI接口的基本信息。另外代码中有很多地方直接将BaseInterface类型的指针指针转换为具体的VDI类型,其依据就是每个VDI的第一个数据成员为BaseInterface对象,类似这种转换非常多。
 
    CoreInterface最主要的工作是定义了2组函数:Timer和Watch,其具体功能由Qemu实现,供libspice调用。这两组函数的作用分别是用来在Qemu中设置定时器和维护网络事件。下面以Watch函数组来详细介绍CoreInterface的工作方式。Qemu中针对Spice的网络处理是移植的关键,因此CoreInterface中Watch函数组的工作机制相对来说是一个框架性的东西,且具有分非常好的灵活性。
 
二、QXLInterface,显示数据交互接口
 
      QXLInterface是最主要也是最复杂的一个VDI,并且与其他VDI不同的是,Front-end有一个单独的网络处理模型, QXLInterface在Front-end有自己单独的处理线程。Back-end端需要实现Qxldevice,同时需要Guest OS的Driver配合工作。另外,Qemu需要Spice为其提供相关的接口来完成一些交互工作。
     当libspice收到Qemu的QXLInterface接口增加消息后,需要回填此结构给Qemu。显示处理在libspice中是以单独的线程进行工作的,因此上面的接口中有一部分就是用来控制线程运转的命令,另一部分则是内存数据交互、图像处理相关的控制接口。
 
三、SpiceKbdInstance键盘输入交互接口、SpiceMouseInterface鼠标输入交互接口

      这两个接口非常简单。

四、SpicePlaybackInterface、SpiceRecordInterface声音处理的两个VDI接口
 
      声音处理的两个VDI接口实现方式则自成体系,代码处理风格上与上面略有不同,先看这两个VDI接口的声明:
      虚拟显卡产生视频数据后,libspice需要主动调用get_command函数去获取数据,然后在libspice中进行相关的处理后发送到client。而音频处理则是在虚拟声卡的实现中直接调用libspice导出的api,将音频数据发送到client。

0 0