“”
云桌面在最近几年是一个非常热门的话题,越来越多的企业为了降低运营成本,正在抛弃传统电脑,开始将办公环境向云上迁移。在正常情况下,我们通过 OpenStack 创建出的虚拟机只有一个桌面可以使用,而在一些特殊的行业中(比如设计行业),一块屏显然满足不了用户的需求。所以这就需要 OpenStack 从底层提供创建支持多屏虚拟机的能力。
SPICE 协议的目标是为 QEMU 虚拟机提供高质量的远程桌面访问,在 OpenStack 中相比 VNC 而言,SPICE 协议能够提供更加完美的用户体验,本文以 SPICE 协议为例,分享一下相关的心得。
这个问题的突破点在于 QXL,通过 /nova/virt/libvirt/driver.py
中的源码可得,当用户设置 OpenStack 采用 SPICE 协议后,video 的类型为 qxl
通过查阅 QEMU 和 SPICE 的官方文档,我们发现如果通过 QEMU 命令行创建一台相关的虚机时,需要指定一个类型为 qxl 的设备,也就是说,如果想要添加多块屏幕,只需要重复添加这样的设备就可以了。
To get a second QXL device in your virtual machine, you need to append -device qxl to your QEMU command line in addition to the -vga qxl that is already there:
在 libvirt 的 driver 中,官方已经为我们封装好了添加 video 设备的方法,即guest.add_device(video)
,所以我们只需要根据业务需求,依次添加设备即可。需要注意的是,QXL 最多支持同时添加 4 块屏幕。
所以,我们只需要在 libvirt 的 _add_video_driver 的末尾,加上下面这段代码即可。
try:
extra_display = flavor.get('extra_specs', {}).get("display_number")
if video.type == 'qxl' and extra_display:
extra_diplay_number = int(flavor.get('extra_specs', {}).get("display_number")) - 1
if 1 <= extra_diplay_number <= 3:
for _ in range(extra_diplay_number):
guest.add_device(video)
except Exception as e:
LOG.error("Failed to attach display,%s", e)
只需要在 flavor 中添加 extra_spec 并指定屏幕的数量,即可创建出符合需求的虚拟机。
到了这一步还没有完事大吉,我创建出虚拟机后发现在系统设置中还是只有一块屏幕,然而 XML 文件中的配置是正确的,所以一直以为是代码哪里出了问题。后来才发现需要在虚拟机内部安装 spice-guest-tools,安装完成后再去设置中看一看,便大功告成了。