Spice是一个开放的远程计算解决方案,提供客户端访问远程显示和设备(如键盘、鼠标、音频)。
主要的用例是获得对虚拟机的远程访问。
官网:Spice
Qemu-Spice框架
Spice的基本构建模块:
Spice Server: Spice Server是在libspice中实现的,libspice是一个VDI可插拔库。目前,这个库的主要用户是QEMU。 QEMU使用Spice -server通过Spice协议提供对虚拟机的远程访问。虚拟设备接口(Virtual Device Interface, VDI)定义了一组接口, 提供了发布虚拟设备(例如,显示设备、键盘、鼠标)的标准方法,并允许不同的Spice组件与这些设备交互。 一方面,服务器使用Spice协议与远程客户端通信; 另一方面,它与VDI主机应用程序(例如QEMU)交互。 Spice Client: Spice客户端是终端用户通过Spice访问远程系统的程序。推荐的客户端是远程查看器(与virt-viewer一起提供)。 GNOME Boxes也可以用作Spice客户端。spice是一个过时的传统客户机,而spicy只是一个测试应用程序。 QXL Device and Drivers: Spice Server支持QXL VDI接口。当libspice与QEMU一起使用时,可以使用特定的视频PCI设备来提高远程显示性能和增强客户图形系统的图形功能。 这个视频设备称为QXL设备,需要客户QXL驱动程序才能实现完整的功能。但是,当不存在驱动程序时,支持标准VGA。 Spice Agent: Spice代理是一个可选组件,用于增强用户体验和执行面向客户的管理任务。例如,当使用客户端鼠标模式时,代理将鼠标位置和状态注入到客户端。 它还允许您在客户端和客户端之间自由移动光标。代理的其他功能包括共享剪贴板(客户端和主机之间的复制和粘贴)和在进入全屏模式时客户端分辨率与客户端对齐。 VDI Port Device: Spice协议支持客户端和服务器端代理之间的通信通道。当使用QEMU时,Spice代理驻留在客户机上。VDI端口是QEMU PCI设备,用于与代理通信。 Spice Protocol: Spice协议定义了各种Spice组件之间通信的消息和规则。
Spice的功能:
Multiple Channels 多通道;服务器和客户机通过通道进行通信。每个通道都专用于特定类型的数据。可用的渠道如下:
Main: 控制和配置 Display : 图形命令图像和视频流 Inputs : 键盘和鼠标输入 Cursor: 指针设备位置和光标形状 Playback: 从服务器接收到的客户端播放的音频 Record : 客户端捕获的音频 Smartcard : 将智能卡数据从客户端机器传递到客户操作系统 USB : 将插入客户端的USB设备重定向到客户操作系统
Image Compression:图像压缩
Spice提供了几种图像压缩算法,可以在服务器启动时选择,也可以在运行时动态选择。Quic是Spice专有的基于SFALIC算法的图像压缩技术。
Lempel-Ziv (LZ)算法是另一种选择。Quic和LZ都是单独编码每个图像的本地算法。Global LZ (GLZ)是Spice的另一项专有技术,它将LZ与基于历史的全局字典一起使用。
GLZ利用图像之间的重复模式来减少流量和节省带宽,这在广域网环境中是至关重要的。Spice还提供自动售货机
Video Compression:视频压缩
Spice对发送到客户端的图像使用无损压缩。然而,视频流的处理方式不同。Spice服务器启发式地识别视频区域,并将其发送为使用M-JPEG编码的视频流。
这种处理节省了大量通信量,提高了Spice的性能,特别是在WAN环境中。然而,在某些情况下,启发式行为可能会导致低质量的图像(例如,将更新的文本区域识别为视频流)。 视频流可以在服务器启动时选择,也可以在运行时动态选择
Mouse modes:
Spice支持两种鼠标模式:服务器和客户端。该模式可以动态更改,并在客户端和服务器之间协商.
Server mouse:
当用户在Spice客户端窗口内单击时,客户端鼠标将被捕获并设置为不可见。在这种模式下,服务器控制显示的鼠标位置。
但是,在WAN或加载的服务器上可能会出现问题,其中鼠标光标可能有一些延迟或无响应。
Client mouse :
没有被捕获,被用作有效的指向装置。要启用客户端鼠标,VDI主机应用程序必须注册一个绝对指向设备(例如QEMU中的USB平板电脑)。
这种模式适用于WAN或加载的服务器,因为光标具有平滑的移动和响应能力。然而,光标可能会在一段时间内失去同步(位置和形状)。
Other Features:其他功能
Multiple Monitors :支持多屏幕 支持任意数量的屏幕 Arbitrary Resolution :
使用QXL驱动时,客户操作系统的分辨率会自动调整为客户端窗口大小。
USB Redirection :USB重定向;Spice可用于将插入客户端的USB设备重定向到客户操作系统。这种重定向可以是自动的(所有新插入的设备都被重定向),也可以是手动的(用户选择他想重定向的设备)。
Smartcard Redirection :
插入到客户端机器的智能卡中的数据可以传递到客户操作系统。智能卡既可以被客户端操作系统使用,也可以被客户端操作系统使用。
Bidirectional Audio : Spice支持音频回放和录音。回放使用OPUS算法进行压缩。
Migration:可迁移性,交换通道连接以支持服务器迁移
Pixmap and Palette caching:图像数据缓存在客户机上,以避免发送相同的数据;
搭建一个Qemu-Spice云桌面环境:
首先查看是否支持支持CPU虚拟化。如果没有开启,需要开启。VmWare需开启虚拟化Intel VT 虚拟化IO
下载spice-protocol-0.10.1:
http://cgit.freedesktop.org/spice/spice-protocol/commit/?h=0.10
或者
https://www.spice-space.org/download/releases/spice-protocol/spice-protocol-0.12.15.tar.bz2
编译 spice-protocol
解压并进入目录执行命令 ./configure,执行后,会生成Makefile文件,运行 make && make install
下载spice-0.10.1:
http://cgit.freedesktop.org/spice/spice/
或者
https://www.spice-space.org/download/releases/spice-0.14.0.tar.bz2
编译spice-server, 解压并进入目录,配置 PKG_CONFIG_PATH,使得能够找到spice-protocol的安装目录(当前你也可以在编译安装spice-protocol 执行./configure 时加上–prefix=/usr)
export PKG_CONFIG_PATH=/usr/local/share/pkgconfig
安装依赖:
apt-get install build-essential
apt-get install autoconf
apt-get install libjpeg62-dev
apt-get install libogg-dev
apt-get install libssl-dev
apt-get install libasound2-dev
apt-get install libxrandr-dev
apt-get install libxfixes-dev
apt-get install pkg-config
yum install pixman-devel.x86_64 celt051-devel.x86_64 openssl-devel.x86_64 libjpeg-turbo-devel.x86_64 -y
执行./configure,成功后执行make && make install
成功编译后的库显示如下:
下载qemu:
https://download.qemu.org/qemu-3.1.0.tar.xz
编译qemu-kvm
配置变量PKG_CONFIG_PATH,使qemu可以找到spice和spice-protocol的安装目录
export PKG_CONFIG_PATH=/usr/local/share/pkgconfig/:/usr/local/lib/pkgconfig/
执行./configure 配置生成makefile文件
./configure --enable-spice --enable-kvm --enable-vnc t--arget-list=x86_64-softmmu --prefix=/usr
参数介绍:
–enable-spice 表示加载spice模块
–enable-kvm 编译KVM模块,使QEMU可以利用KVM来访问硬件提供的虚拟化服务。
–enable-vnc 表示支持vnc
–target-list=x86_64-softmmu 选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可
–prefix=/usr 安装到/usr目录下
成功生成MakeFile后执行make && make install;
执行which qemu-system-x86_64,查看Qemu安装情况,
执行which qemu-img,查看qemu-img
执行qemu-system-x86_64 --version,查看版本号
如果找不到libspice-server.so.1,需要将/usr/local/lib添加到/etc/ld.so.conf里面,前提是没有指定–prefix,因为默认通过源码装会将库安装在/usr/local/lib目录下
echo /usr/local/lib >> /etc/ld.so.conf
通过Qemu创建虚拟云桌面:
创建虚拟机镜像:
qemu-img create -f qcow2 fedora.img 10G
参数介绍:
fedora.img 镜像名称
-f 选项用于指定镜像的格式,
qcow2 格式是QEMU最常用的镜像格式,采用来写时复制技术来优化性能。
10G 是镜像文件大小。最好创建更大点,128G起步建议;
镜像文件创建完成后,可使用qemu-system-x86来启动x86架构的虚拟机
启动Qemu命令:
./qemu-kvm -name guest=nsd1,debug-threads=on -cpu host -m 8192
-realtime mlock=off -smp 16,sockets=4,cores=2,threads=2 -uuid \ bb3cbb7e-6e26-4481-b36d-edb3b9c193ab -no-user-config -nodefaults
-device sga -rtc base=localtime -no-shutdown -boot d
-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x3 -drive file=/home/tom/Server/qemuImgOS/tomOS.img,format=qcow2,
if=none,id=drive-ide0-0-0 -device
ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1
-chardev spicevmc,id=charchannel0,\ name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=2,chardev=charchannel0,id=channel0,name=com.redhat.spice.0
-usbdevice tablet
-spice port=6915,addr=0.0.0.0,disable-ticketing,seamless-migration=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,\ vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x8 -device
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -msg timestamp=on
-netdev user,id=network0 -device e1000,netdev=network0 -cdrom /home/tom/Server/qemuImgOS/ztWin10.iso
-cdrom参数为外部文件输入,即类似windows的光驱,iso文件可以输入,安装上系统后,再次打开可以关闭,后续开发通过spice-vdagent可以实现文件的传输。spice-vdagent主要为消息传递的媒介。
下载libvirt:
https://libvirt.org/sources/libvirt-5.2.0.tar.xz,./configure,make && make install安装;
启动libvirtd服务,即执行systemctl start libvirtd
将该服务设置开机自启动:systemctl enable libvirtd
问题:
vdagent安装有问题:(在虚拟windows上安装了virtoi接口驱动,但是无法启动)
./qemu-kvm -m 8192 -cpu host -realtime mlock=off -smp
16,sockets=4,cores=2,threads=2 -enable-kvm -vga qxl -boot d -hda
/home/tom/Server/qemuImgOS/zhongtaoOS.img
-chardev spicevmc,id=charchannel0,name=vdagent -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 -device
virtserialport,bus=virtio-serial0.0,nr=1,
chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -usbdevice
tablet -spice port=6915,disable-ticketing,streaming-video=all -vga qxl
-cdrom /home/tom/Server/qemuImgOS/vdagent-linux.iso
-spice port=6915 使用的端口,
-m 8192 使用的运行内存;
注:镜像iso文件可以通过cdrom参数加入
安装spice-vdagent
安装spice-vdagent.msi,必须安装virtoi驱动,之后在windows切换到虚拟机中执行 KSVD Guest Tools1/64目录下,执行./vdservice install ,如果出现Service already exist,
执行./cdservice uninstall ,在执行./vdservice install即可安装成功;
通过spice windows客户端进行连接:
安装软件virt-viewer-x86-3.0.msi 下载
安装启动后输入:
spice://ip:port ,ip为服务器的ip
linux 连接:
下载spice 源码,源码链接:https://www.spice-space.org/download/releases/spice-0.12.5.tar.bz2
./configure 生成Makefile 文件
./configure --enable-client 生成客户端,
进入client 目录进行编译客户端(之前要先编译spice-common),或者直接执行make 连同spice-common,spice server 一起编译;就不会报错
打开客户端后输入 spice://192.168.40.20:6915,即可连接到云桌面;
参考:https://blog.csdn.net/zhaihaibo168/article/details/90183577