我目前在 Ubuntu 20.04 上作为主机和客户机,遵循http://ryan.himmelwright.net/post/virtio-3d-vms/并在视频上激活了 3D 加速,在显示器上激活了 OpenGL,但在 VM 启动时我得到了
SPICE GL 支持目前仅限于本地,与 -spice port/tls-port 不兼容
我怎样才能让它工作?
更新:
我禁用了“监听类型”为“无”
但我得到了一个非常错误的图像:
答案1
如果您的主板 + 处理器支持 VT-d,OpenGL + 3D 渲染可以与 iommu 完美配合。首先查看您的硬件是否支持 VT-d。如果支持,请执行以下操作:
/etc/default/grub
以 root 身份(使用)编辑该文件sudo
,在以 开头的行中添加以下内容GRUB_CMDLINE_LINUX_DEFAULT
:
对于 Intel,.intel_iommu=on iommu=pt
对于 AMD,.amd_iommu=on
例如:
sudo nano /etc/default/grub
保存并关闭后,grep CMDLINE_LINUX_DEFAULT /etc/default/grub
在终端中输入。如果一切正确,您将看到使用新代码编辑的行。例如:
$ grep CMDLINE_LINUX_DEFAULT /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt"
然后,运行sudo update-grub
以应用更改并重新启动。
(update-grub
是 Debian 衍生发行版中该命令的快捷方式grub2-mkconfig -o /boot/grub/grub.cfg
)
对此的一些观察:
- 应该注意的是,这是一种“弱”直通(共享)模式,不会接管整个设备。“真正的”直通会完全将设备从主机的控制中移除。这需要
vfio-pci=vendId:devId
在 grub 或(以及重建 initramfs)中有一个存根/etc/modprobe.d
。有关直通的更多信息,这是一个很好的起点:https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF - 共享图形的方式甚至更加复杂,每个供应商都有自己的版本。例如,英特尔 iGD 的 Intel-GVT-g: https://wiki.archlinux.org/title/Intel_GVT-g
以下是我xml
对相关设备的看法:
显示 Spice - 注意:使用直通时您无法启用远程服务器:
<graphics type="spice">
<listen type="none"/>
<image compression="off"/>
<gl enable="yes"/>
</graphics>
视频 Virtio(从 QXL 更改):
<video>
<model type="virtio" heads="1" primary="yes">
<acceleration accel3d="yes"/>
</model>
<address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
</video>
无关,我在 Ubuntu 的 ZFS 安装程序配置中使用 zvol 块设备。这是仅在 Ubuntu 桌面版中可用的选项:
zvols 真的很酷,因为您可以在使用它们之间切换kvm-qemu
([systemd-container][5]
显然仅限于 Linux) - 加上快照并发送/接收它们。
但是由于 zvols 模拟了常规磁盘,它们表明如果您有空间安装专用磁盘,您也可以为您的虚拟机使用专用磁盘。
创建 zvol 后,使用fdisk/sgdisk/{g}parted
etc 为其指定 gpt 分区结构,就像对任何其他磁盘进行分区一样。创建 gpt 分区后,我使用 Windows ISO 进行实际分区。
btrfs
有类似的东西,应该能得到更好的支持systemd-nspawn
,但我不知道你是否可以像块设备一样操作它们qemu
。
最后一条提示:我需要将一些文件从主机复制到虚拟机。您实际上无法从 Linux --> Windows 挂载文件夹,但我可以将 Windows 在主机上的 zvol 上创建的分区 (#3) 挂载为常规 NTFS 分区。
因此,当虚拟机关闭时,我安装了分区 3 /mnt
,复制了我需要的文件夹和umount /mnt
分区,然后重新启动虚拟机。
有时在这种情况下要弄清楚该怎么做有点棘手,所以我想把它放进去。我读过的指南中也建议设置 Samba 共享,如果你需要更频繁地使用,或者我也使用 OpenSSH-Server 和 PSRemoting 远程访问 Windows VM,所以有很多选择(Windows 现在甚至有 SSHFS,如果你看看巧克力味)。
答案2
我在基于软件的硬件加速上工作时也遇到了同样的问题,具体如下:http://ryan.himmelwright.net/post/virtio-3d-vms/。我稍微修改了一下,找到了一个简单的解决方案,对我有用。但我不能保证它也对你有用:
我假设您已将“型号”从“QXL”更改为“Virtio”,并在“视频设备”部分启用了“3D 加速”,以及您上面指定的设置。我还假设您在“OpenGL”下拉菜单中选择的渲染器是您的专用 GPU。
现在,只需关闭 virt-manager 实例并从终端重新启动它,方法是DRI_PRIME=1
在它前面添加 ie run DRI_PRIME=1 virt-manager
in terminal。现在启动您的 VM。最初,我看到一些屏幕故障,但在打开登录屏幕后,一切运行顺利。我通过它监控了我的 AMD DGPU 使用情况radeontop
,它运行良好。
笔记:
当 VirtualBox 不使用我的 DGPU 时,即使启用了 3D 加速,同样的解决方案也适用于它。我还注意到,与 Virt-manager 相比,VirtualBox 中的 3D 加速更稳定。
即使成功启用 3D 加速,您也无法获得完整的 GPU 性能,并且可能会在各个地方遇到驱动程序问题。您可能希望通过 GPU 直通将 GPU 直接用于 VM 以克服这些问题。
编辑1:
在对虚拟机硬件加速进行更多调整后,我发现还需要完成一个步骤才能使用 DGPU 运行虚拟机。我们需要首先在“视频设备”部分的“QXL 型号”中将 VRAM 增加到至少 512MB,单击“应用”,将“型号”从“QXL”更改为“Virtio”,并启用“3D 加速”,然后使用 运行 virt-manager DRI_PRIME=1
。
当我尝试此操作时,Manjaro 运行良好,但 Windows 10 VM 的性能非常不稳定。
答案3
从最初的问题开始
SPICE GL 支持目前仅限于本地,与 -spice port/tls-port 不兼容
我怎样才能让它工作?
作者已经回答了
我禁用了“监听类型”为“无”
值得注意的是,剩余的问题很可能与显卡和主机上安装的驱动程序有关。人们特别报告了 nvidia 卡的问题: