探索基于SPICE协议的VDI云桌面
spice介绍
spice是由Qumranet开发的开源网络协议,2008年红帽收购了Qumranet获得了这个协议。SPICE是红帽在虚拟化领域除了KVM的又一“新兴技术”,它提供与虚拟桌面设备的远程交互实现. 目前,spice主要目标是为qemu虚拟机提供高质量的远程桌面访问,它致力于克服传统虚拟桌面的一些弊端,并且强调用户体验
spice包含有3个组件
- SPICE Driver:SPICE驱动器 存在于每个虚拟桌面内的组件
- SPICE server:SPICE服务器 存在于红帽企业虚拟化Hypervisor内的组件
- SPICE Client: SPICE客户端 存在于终端设备上的组件,可以是瘦客户机或专用的PC,用于接入每个虚拟桌面。 这三个组件协作运行,确定处理图形的最高效位置,以能够最大程度改善用户体验并降低系统负荷。如果客户机足够强大,SPICE向客户机发送图形命令,并在客户机中对图形进行处理,显著减轻服务器的负荷。另一方面,如果客户机不够强大,SPICE在主机处理图形,从CPU的角度讲,图形处理并不需要太多费用
spice架构
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软件,则如图配置
客户端连接
linux
装了libvirt view可以直接像这样连接
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 服务转到公网上了所以端口发生了变化,测试也能用)
双击这个文件
效果如图
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 不过测试过显示会花屏
将项目下载下来后,移入你的web服务器,比如nginx中,访问它的index.html页面
访问http://10.249.2.100/index.html?host=10.249.2.100&port=5959
最终效果如下
不过这个项目的屏幕设置有问题,是镜像倒置的,不过我找到了一个修改办法,需要将它的分支flexVDI项目中的spice-web-client/lib/images/bitmap.js at master · flexVDI/spice-web-client (github.com)这个文件覆盖到相应位置
其他系统的客户端
pve中spice实现
linux
将硬件中显示的属性改为SPICE实现的
选项中,启用spice增强
- all: 任何快速刷新区域都编码到视频流中
- filter: SPICE服务器添加了额外的过滤器来决定是否应该激活视频流(目前,只跳过小窗口表面)
- off: 不执行视频检测
- 文件夹共享目前仅在Linux版本的Virt-Viewer中有效。
然后点击控制台中SPICE项目下载一份vv后缀的配置文件,打开即可使用
win
除上面的配置,windows的特别需要在虚拟机内安装VirtIO 驱动程序
打开后安装最下面的 virtio-win-guest-tools.exe 程序
其他配置如图,也可以增加音频、usb设备的spice设备
最终效果如图
总结
基于spice的vdi云桌面,相比于xrdp,它通过半虚拟化的方式介入虚拟机的显示、鼠标键盘、usb、音频等“外设”,不受虚拟机内部网络和性能限制,举个例子,将虚拟机网卡移除或者停止,vdi云桌面依然能正常连接,又因为它是半虚拟化的硬件,所以它不吃虚拟机内部的资源,占用宿主机资源也是很少,不过缺点也显而易见,它不是真正的gpu,所以处理3D效果时性能拉跨,无法去做视频硬解码等工作