探索基于SPICE协议的VDI云桌面

2024-01-15
1分钟阅读时长

spice介绍

spice是由Qumranet开发的开源网络协议,2008年红帽收购了Qumranet获得了这个协议。SPICE是红帽在虚拟化领域除了KVM的又一“新兴技术”,它提供与虚拟桌面设备的远程交互实现. 目前,spice主要目标是为qemu虚拟机提供高质量的远程桌面访问,它致力于克服传统虚拟桌面的一些弊端,并且强调用户体验

image-20241115151718698

spice包含有3个组件

  • SPICE Driver:SPICE驱动器 存在于每个虚拟桌面内的组件
  • SPICE server:SPICE服务器 存在于红帽企业虚拟化Hypervisor内的组件
  • SPICE Client: SPICE客户端 存在于终端设备上的组件,可以是瘦客户机或专用的PC,用于接入每个虚拟桌面。 这三个组件协作运行,确定处理图形的最高效位置,以能够最大程度改善用户体验并降低系统负荷。如果客户机足够强大,SPICE向客户机发送图形命令,并在客户机中对图形进行处理,显著减轻服务器的负荷。另一方面,如果客户机不够强大,SPICE在主机处理图形,从CPU的角度讲,图形处理并不需要太多费用

spice架构

image-20241115151723818

Spice agent运行在客户机(虚拟机)操作系统中。Spice server和Spice client利用spice agent来执行一些需要在虚拟机里执行的任务,如配置分辨率,另外还有通过剪贴板来拷贝文件等。从上图可以看出,Spice client与server与Spice Agent的通信需要借助一些其他的软件模块,如在客户机里面,Spice Agent需要通过VDIPort Driver与主机上 QEMU的VDIPort Device进行交互,他们的交互通过一种叫做输入/输出的环进行。Spice Client和Server产生的消息被写入到设备的输出环中,由VDI Port Driver读取;而Spice Agent发出的消息则通过VDI Port Driver先写入到VDI Port Device输入环中,被QEMU读入到Spice server的缓冲区中,然后再根据消息决定由Spice Server直接处理,还是被发往Spice Client中

部署spice server

spice软件包安装

yum -y install spice-protocol spice-server xorg-x11-drv-qxl spice-gli

修改虚拟机配置文件

一般在/etc/libvirt/qemu/ 下

在graphics上面添加如下内容

<channel type='spicevmc'>
    <target type='virtio' name='com.redhat.spice.0'/>
    <address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>

graphics定义修改成如下内容

<graphics type='spice' autoport='yes' listen='0.0.0.0' keymap='en-us'>
  <listen type='address' address='0.0.0.0'/>
  <image compression='off'/>
</graphics>

这里第一行也可以指定port 如下

<graphics type='spice' port='5902' tlsPort='5903' autoport='yes' listen='0.0.0.0'>

其中 5902是未加密端口,5903是加密端口

如果使用图形化的libvirt mangaer软件,则如图配置

image-20241115151731835

客户端连接

linux

装了libvirt view可以直接像这样连接

image-20241115151742732

windows

下载安装http://virt-manager.org/download

新建test.vv

[virt-viewer]
type=spice
host=43.249.192.204
port=13618
fullscreen=0 
title=vmtest %d
enable-smartcard=0
enable-usb-autoshare=1
delete-this-file=0
toggle-fullscreen=shift+f11
release-cursor=shift+f12

(这里用frp将spice 服务转到公网上了所以端口发生了变化,测试也能用)

双击这个文件

效果如图

image-20241115151752715

web

1.需要用到[websockify](novnc/websockify: Websockify is a WebSocket to TCP proxy/bridge. This allows a browser to connect to any application/server/service. (github.com))工具,这是一个将websocket流转化成tcp流的工具,可使用pip直接安装(python版本尽量高点,低的会报错)

pip install websockify

启动websockify服务

websockify 5959 10.249.2.100:5900

下面的前端服务访问5959端口即可获得tcp流的spcie数据

2.部署spice web客户端前端

这里有两个项目,一个是spice组织出的 https://gitlab.freedesktop.org/spice/spice-html5 不过测试过显示会花屏

另一个项目是 eyeos/spice-web-client: A full featured and high performance SPICE web client written in Javascript and HTML5 (github.com)

将项目下载下来后,移入你的web服务器,比如nginx中,访问它的index.html页面

访问http://10.249.2.100/index.html?host=10.249.2.100&port=5959

最终效果如下

image-20241115151800350

不过这个项目的屏幕设置有问题,是镜像倒置的,不过我找到了一个修改办法,需要将它的分支flexVDI项目中的spice-web-client/lib/images/bitmap.js at master · flexVDI/spice-web-client (github.com)这个文件覆盖到相应位置

其他系统的客户端

下载 (spice-space.org)

pve中spice实现

linux

将硬件中显示的属性改为SPICE实现的

image-20241115151807855

选项中,启用spice增强

image-20241115151812717

  • all: 任何快速刷新区域都编码到视频流中
  • filter: SPICE服务器添加了额外的过滤器来决定是否应该激活视频流(目前,只跳过小窗口表面)
  • off: 不执行视频检测
  • 文件夹共享目前仅在Linux版本的Virt-Viewer中有效。

然后点击控制台中SPICE项目下载一份vv后缀的配置文件,打开即可使用

image-20241115151817761

win

除上面的配置,windows的特别需要在虚拟机内安装VirtIO 驱动程序

找个最新的 目前是 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.240-1/virtio-win.iso

打开后安装最下面的 virtio-win-guest-tools.exe 程序

其他配置如图,也可以增加音频、usb设备的spice设备

最终效果如图

image-20241115151826183

总结

基于spice的vdi云桌面,相比于xrdp,它通过半虚拟化的方式介入虚拟机的显示、鼠标键盘、usb、音频等“外设”,不受虚拟机内部网络和性能限制,举个例子,将虚拟机网卡移除或者停止,vdi云桌面依然能正常连接,又因为它是半虚拟化的硬件,所以它不吃虚拟机内部的资源,占用宿主机资源也是很少,不过缺点也显而易见,它不是真正的gpu,所以处理3D效果时性能拉跨,无法去做视频硬解码等工作