Virt-Manager 无法连接到图形控制台。

自从昨天开始,我无法再通过我的virt-manager GUI查看任何正在运行的虚拟机(QEMU/KVM)。当我尝试在虚拟机的内置查看器中查看屏幕时,却收到了以下错误信息:
错误连接到图形控制台: 内部错误:无法执行QEMU命令'getfd': 未通过SCM_RIGHTS提供文件描述符
这适用于我所有的虚拟机。
不过,我仍然可以正确地在virt-viewer中查看和交互我的虚拟机,只是virt-manager的内置查看器无法使用。
出了什么问题?我该如何修复?
编辑:我刚刚发现我正在使用来自archive.getdeb.net仓库的virt-manager版本1:1.4.0-1~getdeb1。

使用调料,速度更快,并提交错误报告。 - Panther
@bodhi.zazen 默认已经配置为使用Spice显示服务器,但是无论是Spice还是VNC都无法正常工作。 - Byte Commander
4个回答

在尝试将最新的virt-manager 1.4.0合并到Ubuntu时,我遇到了同样的问题。这似乎不是virt-manager的一个bug,而是它发送显示数据给虚拟机的方式发生了变化。
我已经提交了一个bug,以添加必要的权限到libvirt中,这是定义apparmor配置文件的地方- https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/1668681 为了修复这个问题而不禁用安全性,请追加以下内容:
# allow connect with openGraphicsFD to work
unix (send, receive) type=stream addr=none peer=(label=/usr/sbin/libvirtd),

将内容添加到文件/etc/apparmor.d/abstractions/libvirt-qemu中,但不要添加到qemu-bridge-helper部分。(即在"owner @{PROC}/0-9*/fd/ r,"之后添加)。
然后使用sudo systemctl reload apparmor重新加载配置文件。
话虽如此,我仍然建议您使用我们存档中的软件包以获得最佳支持。

你需要在libvirt-qemu文件的哪个位置添加规则?我将其追加在最后一个}之前,重新加载了apparmor,但是仍然出现同样的错误。我昨天刚刚安装了Ubuntu的更新,4月20日发布的版本。我使用的virt-manager版本是1.4.1。现在每当我创建一个虚拟机时,无法像之前创建的那些虚拟机一样访问Splice,而是出现了这个错误提示... - firepol
1编辑以更好地解释在16.04上要做什么。16.04在文件末尾有一个额外的qemu-bridge-helper子配置文件-您不希望将其添加到其中。 - gQuigs
我不得不删除当前的虚拟机实例并重新启动我的电脑,但之后这个问题解决了!谢谢 :) - paddotk

在我的情况下,是Apparmour阻止了访问。Apparmour的魔术配置文件生成器似乎没有正常工作。我的解决方法如下。
在启动KVM实例并收到错误后,我进行了以下操作:
$sudo apparmour_status

列出了导致问题的配置文件。
libvirt-<some long key> 

然后我将AppArmor配置文件设置为投诉模式而不是强制执行模式,使用以下命令:
$sudo aa-complain /etc/apparmor.d/libvirt/libvirt-<some long key>

现在我不再收到错误信息了。希望这个冲突能够解决。

我无法重现这个问题,但是在10月5日有关于libvirt的更新: libvirt-bin-1.3.1-1ubuntu10.2 升级到 libvirt-bin-1.3.1-1ubuntu10.3
libvirt0-1.3.1-1ubuntu10.2 升级到 libvirt01.3.1-1ubuntu10.3 如果您没有更改任何设置或其他内容,很可能在升级过程中出了问题。请完全删除所有与virt-manager相关的软件包,并重新安装它们。
sudo apt purge libvirt-bin libvirt-glib libvirt0 virt-manager virt-viewer virtinst  
sudo apt install libvirt-bin libvirt-glib libvirt0 virt-manager virt-viewer virtinst  

重启主机操作系统 - 现在一切应该像以前一样正常工作。

没有libvirt-glib这个软件包... - Byte Commander
1并且,不好意思,清除和重新安装其他软件包也没有起到帮助的作用。 :-( - Byte Commander
解决了,看起来是我安装的GetDeb版本中的一个错误。降级到官方仓库版本后问题得到解决(请参见我的答案)。 - Byte Commander
@ByteCommander:在你的问题中提供你使用第三方解决方案的信息是个好主意,这样我就有机会给出更准确的答案了!不管怎样,基本上你通过按照我的建议,移除当前安装的软件包并重新安装官方仓库中的软件包来解决了问题。 - cl-netbox
你是对的,但实际上我不知道或考虑到那个可能性。很久以前我添加了GetDeb仓库来安装另一个软件包,并没有记得从那里获取virt-manager的更新。v(°_°)v - Byte Commander

似乎是在http://getdeb.netvirt-manager版本1:1.4.0-1~getdeb1中出现了一个错误。
将软件包降级到官方仓库中最新可用的版本(xenial-updates中的1:1.3.2-3ubuntu1.16.04.2)可以解决这个问题。
更新:版本1:1.4.0-1~getdeb2尚未修复此问题。

请注意,不需要降级了:gQuigs的回答解释了如何配置apparmor,以便使virt-manager的最新版本(在我的情况下是1.4.1)正常工作。我刚刚在我的Ubuntu 16.04上测试了gQuigs的解决方案,它运行良好。 - firepol