最近在进行一个KVM虚拟桌面项目,我在负责SPICE协议部分。但是不幸的是在使用SPICE协议时,我们只有特别少的资料(国内),只有去国外找官方网站来获取使用手册。网站将在接下来的文章中写出。
译文因博主水平有限略有生硬,但是尽量保持原文的风格和词句。
一、FreeBuf 百科
Spice 是一个开源的远程计算机解决方案,并且提供了客户端入口来远程遥控展示区域和设备(eg:键盘鼠标音响设备)Spice 提供了一个桌面,这个桌面就像通常的用户的桌面一样,并且同时尝试向客户端装载了大多数经过优化加强的GPU与CPU任务。
基础模块:
1.spice协议 2.spice服务器 3.spice客户端
接下来的部分,我们提供了spice组件、特性、获取、编译、安装和用法的基础信息
1.1 Spice与spice相关组件介绍
Spice服务器
Spice服务器是一个libspice(一个VDI可插入的库)的实现。VDI是virtual device interface的简称,VDI定义了一个接口集合,这个接口提供了一个开放虚拟设备(比如显示设备,键盘,鼠标)的方法并且让不同的spice组件与其他的设备进行交互。。在一方面,这个服务器与远程的客户端使用spice协议交流,在另一方面,服务器与VDI主机应用进行交流(例如QEMU)。
Spice客户端
Spice跨平台(linux&windows)客户端是面向终端用户的接口
QXL 设备和驱动
Spice服务器支持QXL VDI接口,当libspice库被QEMU使用时,一个特殊的QEMU QXL PCI设备被使用,这个设备是为了改善远端的展示行为和优化客户系统的图形功能,QXL设备要求客户的QXL驱动功能完备。然而,标准的VGA是支持没有驱动存在的。
VDI端口设备
Spice协议支持在客户端和服务器代理端的交流,当使用QEMU时spice代理存在在客户端中,VDI端口是一个QEMU PCI设备,这个QEMU PCI设备作为交流所用的代理被使用。
Spice代理
Spice代理是一个为了增强用户体验和执行客户管理任务可选择的组件。例如:当使用了客户端的鼠标模块时候,一个代理注入了鼠标位置并且声明了客户的状态。另外,它也被用作一种展示客户设置的结构。
1.2 特性
1.2.1 多通道(multi-channel)
服务器和客户端通过channel来信息交互,每个channel是专用的一种特殊的数据类型,这个可用的channel是:
Main-控制和配置 Display-图形命令,图像和流媒体 Input-键盘和鼠标输入 Cursor-指针设备位置和鼠标的形状 Playback-同服务器音频接受从客户端播放 Record-客户端音频捕获(录音)
1.2.2 图像压缩
Spice 提供了几个图像压缩的算法,这些算法在服务器初始化的时候被选择并且在运行时候是动态平衡的。Quic是一个spice持有的SFALIC算法的图像压缩技术。Lempel-Ziv(lz)算法是另一个选择。Quic和LZ是本地的算法,对每个图像进行分别的编码。Global LZ(GLZ)是另一种spice持有的技术并且有lz历史同时使用了Globle dictionary。GLZ充分利用了图形的重构,收缩了图像减少了在传输中的物理带宽,这在WAN环境中是特别关键的。Spice也提供了自适应的模式压缩每一张图片,这基于LZ/GLZ和quic是由图像的特性而决定的。抽象来讲,合成图像用LZ和GLZ压缩更好,而真正的图像用quic压缩更好。
1.2.3 音频压缩
Spice为了图像发送客户端使用loss-less压缩。然而,视频流被不同的处理,spice服务器自发式的定义video区域并且作为视频编码使用M-JPEG传送。这样的处理节省了传输带宽,改善了spice的表现,尤其是在广域网(wan)环境下。但是,在某些环境下,这种自发式的行为可能造成一些低质量的图像(例如定义了不断被更新的文档区域所谓一个视频流)。视频流可能在服务器初始化时被选择并且动态运行。
1.2.4 鼠标模块
Spice支持两种鼠标模块:客户端和服务器鼠标(server mouse&client mouse)。这种模式可以动态的改变,并且可以在客户端和服务器之间协调。
Server mouse-当一个用户在spice客户端点击窗口时,客户端的鼠标被捕获并且设置为可见状态,在这个模式中,服务器端控制鼠标的位置并且展示出来。然而,在WAN上或者是loaded服务器上这可能是不确定,在这种情况下,鼠标指针可能会有一点延迟或者是没有响应。
Client mouse-不被捕获并且被用作是一个高效的指针设备。为了使用这种客户端鼠标,VDI host application 必须注册了一个明确的指针设备(例如在qemu中的usb区域)。这种模式对于WAN和loaded服务器是适当的,因此指针有了平滑的移动和响应。然而,这个指针也许会出现暂时性的丢失同步(同步性比较弱)。
1.2.5 其他特性
· Multiple Monitors-多重检测特性,多个检测器启动。
· Bidirectional Audio-双向音频技术,spice支持音频的重放和录音,重放使用了CELT算法压缩。
· Lip-sync-边缘同步化(在音频和视频之间),只有当视频流被使用时才可以使用。
· Migration-移植,为了服务器移植切换频道的连接。
· Pixmap caching-图像缓存。
二、安装SPICE协议
2.1 先决条件
下面的程序包是在linux安装spice的必须的,在fedora11上通过测试。
2.1.1 qpixman
Pixman 是一个生成像素图像常用的库,包含了低级别(底层)的像素图像操作规则并且被Cairo使用,QPixman是一个Pixman的轻型的扩展版本。
如何得到并且安装qpixman?
从spice官方网站可以下载@www.spice-space.org
cd <qpixman_dir> ./autogen.sh -includedir=/usr/include --libdir=/usr/lib64 make sudo make install
2.1.2 qcairo
Cairo是一个矢量图形,独立于设备的库,qcairo是一个Cairo的轻型的扩展版本。
如何得到qcairo?
从spice官方网站可以下载@www.spice-space.org
安装步骤:
cd <qcairo_dir> ./autogen.sh --disable-xlib --disable-ps --disable-pdf ► --disable-svg --includedir=/usr/include/ --libdir=/usr/lib64 make sudo make install
2.1.3 celt_0_5_1
CELT codec 是一个音频压缩算法-高质量传输音乐并且使用短的延迟,并且使用特别低的延迟
如何得到CELT包?
从spice官方网站可以下载@www.spice-space.org
安装方法:
cd <celt_dir> ./configure -includedir=/usr/include --libdir=/usr/lib64 make sudo make install
2.1.4 FFmpeg
FFmpeg是一个音频视频的录音转换和流处理的库。包含了libavcodec audio/video codec library。
万一你的系统没有包含这个库,可以中这里下载 http://ffmpeg.org/
安装步骤:
cd <ffmpeg_dir> ./configure --libdir=/usr/lib64 --incdir=/usr/include ► --shlibdir=/usr/lib64 --disable-demuxers --disable-ffmpeg ► --disable-ffserver --disable-ffplay --disable-bsfs ► --disable-parsers --disable-devices --disable-protocols ► --disable-muxers --disable-decoders --disable-encoders ► --enable-encoder=mjpeg --enable-decoder=mjpeg ► --disable-static --enable-shared --enable-gpl ► --disable-stripping make sudo make install
2.1.5 log4cpp
Log4cpp是专门为了灵活记录日志成文件或者syslog等的库,它模仿log4j library。
万一你的部署中没有这个库,可以从这里下载http://log4cpp.sourceforge.net/
安装方法:
cd <log4cpp_dir> ./configure -includedir=/usr/include --libdir=/usr/lib64 make sudo make install
如果失败了,应用下面的解决方案再试一遍:
diff -ru log4cpp-1.0.orig/src/BasicLayout.cpp log4cpp-1.0/src/BasicLayout.cpp --- log4cpp-1.0.orig/src/BasicLayout.cpp 2006-09-30 02:03:20.000000000 -0400 +++ log4cpp-1.0/src/BasicLayout.cpp 2008-12-12 12:01:16.000000000 -0500 @@ -8,6 +8,8 @@ */ #include "PortabilityImpl.hh" +#include <cstdlib> +#include <memory> #include <log4cpp/BasicLayout.hh> #include <log4cpp/Priority.hh> #include <log4cpp/FactoryParams.hh> diff -ru log4cpp-1.0.orig/src/PatternLayout.cpp log4cpp-1.0/src/PatternLayout.cpp --- log4cpp-1.0.orig/src/PatternLayout.cpp 2007-08-28 03:54:12.000000000 -0400 +++ log4cpp-1.0/src/PatternLayout.cpp 2008-12-12 11:57:59.000000000 -0500 @@ -8,6 +8,7 @@ #include "PortabilityImpl.hh" +#include <cstdlib> #include <log4cpp/PatternLayout.hh> #include <log4cpp/Priority.hh> #include <log4cpp/NDC.hh>
2.2 windows 准备工作
编译windows组件是可选择的你可以下载二进制文件从Spice网站 @http://www.spice-space.org
下载windows_libraries解压包 Spice官网:@http://www.spice-space.org
提取出它
设置SPICE_LIBS环境变量到<windows_libraries_dir>文件夹
下载并安装openssl从http://www.slproweb.com/products/Win32OpenSSL.html
添加OpenSSL头文件和静态lib directories(<OpenSSL_dir>\include and <OpenSSL_dir>\lib\VC\static)到VC的默认库。在Tools->Option->Projects and Solutions->VC++ Directories->Include Files and library files。
Note:这个静态库和结构是MSVC++ 2005版本的。
2.3 获得源
我们假设SPICE和qemu/kvm都在同一个文件夹<spice_root>下,那么:mkdir <spice_root>
下载spice和vdesktop源代码:www.spice-space.org 并且把他们放置到<spice_root>文件目录下。
2.4 编译源文件
2.4.1 libspice和linux客户端:
编译libspice和linux客户端:
cd <spice_root>/spice ./autogen.sh -includedir=/usr/include --libdir=/usr/lib64 make sudo make install
分别编译可以从libspice和red/x11文件夹完成。
2.4.2 QEMU/KVM
如果内核版本低于2.6.30,请如下操作。
使用如下方法得到内核源并编译:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.30.y.git cd <spice_root>/vdesktop/kernel ./configure ln -s <linux-2.6.30 source dir> linux-2.6 make sync make
In both cases:
cd <spice_root>/vdesktop ./configure --enable-spice
以验证spice,kvm和QXL 是否由配置脚本成功地配置。
cd libkvm make cd ../qemu make ln -s x86_64-softmmu/qemu-system-x86_64 qem
下载bios源代码:www.spice-space.org 并把文件放在<spice_root>/vdesktop/qemu/pc-bios 文件夹。以防你突然想从源中编译bios。
使用方法:
cd <spice_root>/vdesktop/bios make ln -s BIOS-bochs-latest ../qemu/pc-bios/bios.bin cd ../vgabios make ln -s VGABIOS-lgpl-latest.bin ../qemu/pc-bios/vgabios.bin
2.4.3 windows客户端
编译windows组件不是必须的,你可以直接下载可执行文件:spice site:www.spice-space.org.
如果你想要输入在你自己指定的文件夹下,请设置REDC_BUILD_DIR环境变量以指向那个文件夹。
打开<spice_root>\spice\red\windows\redc.sln然后就可以编译了。
以上是关于SPICE用户手册的介绍和安装的译文,请尊重博主的劳动成果。下一篇将介绍Running spice【译】,欢迎大家交流。
最近在学习KVM的过程中会记下自己在KVM的使用的一系列问题供大家参考。
*参考来源:spice-space,VillanCh编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)