SPICE (二)
spice项目,一种远程访问虚拟机的开源解决方案,客户端可以访问远程虚拟机的显示和设备(例如键盘、鼠标、音频和usb等设备)。
- spice将CPU密集型和GPU密集型任务尽可能放到客户端运行,用户就可以获得与本地类似的用户体验;
- 无论是客户端和远程虚拟机之间是跨局域网还是跨广域网,spice都能提供良好的用户体验。
1. 图像命令流
spice基本组件包括:
- spice协议
主要是定义了spice服务端与客户端之间的数据传输协议- spice服务端
- spice客户端
与spice相关的组件:
- QXL设备, QEMU提供
- QXL驱动,虚拟机OS的显示驱动包括两部分,内核态驱动和Xorg驱动
需要注意:ARMv8当前遇到的问题
- QXL设备,需要手动修改,将其纳入编译
- 内核态QXL驱动,需要修改代码。(详细介绍敬请期待)
- 在虚拟机客户OS中,用户应用程序向显示引擎(GDI/X引擎,例如Xorg)发送图像渲染操作命令(X级);
- 显示引擎通过QXL驱动将图像渲染操作命令(X级)转换成QXL命令,并将QXL命令推送到QXL设备的命令环缓冲中;
- libspice(spice服务端)从QXL设备的命令环中获取QXL命令,并将其添加到显示命令树。显示命令树其实就是一组QXL命令,这组命令的运行结果就是屏幕显示数据(帧);命令树主要是用于优化命令传输(有些QXL命令对帧数据没有作用,可以直接抛弃)和视频流检测。
- libspice还维护了一个向客户端发送命令的发送队列。这些命令在发送给客户端之前需要翻译成spice协议消息。
- QXL命令传送给客户端之后,就会从命令树和发送队列中将该命令删除。libspice将发送完成的QXL命令推回给QXL释放环。QXL驱动负责回收。