|
|
在Linux主机上使用QEMU/KVM创建Windows虚拟机的方案已经十分完善了,但唯独在虚拟机内实现半虚拟化3D显卡加速这个问题一直都不好解决,需要很多复杂的方案,有的甚至还需要付费。下面介绍一些实现方案:
1. 显卡直通
将显卡直接分配到虚拟机内,虚拟机直接控制物理显卡硬件,这个方案已经很成熟了,网上也有很多教程,这里不再过多赘述。
参见:ArchWiki PCI GPU passthrough
优点:能发挥显卡的几乎全部性能,并且配置相对简单。
缺点:显卡硬件利用率低,一张显卡只能供一个虚拟机使用,若虚拟机里负载较低,那么空余的显卡资源就白白浪费了。
2. GPU虚拟化
将一张物理显卡划分成多张虚拟显卡,再将虚拟显卡分配给虚拟机,这个方案网上也有很多教程,不再赘述。
参见:ArchWiki GPU virtualization
优点:能发挥显卡的大部分性能,资源利用率比显卡直通高。
缺点:需要显卡支持,并且有的厂商(例如NVIDIA)需要特定型号的专用显卡,还要付授权费用才能使用。
3. 半虚拟化显卡(virtio-gpu)
得益于最近AI编程的发展,virtio-gpu开源显卡驱动已经有了很大的进步,甚至开源VMware SVGA 3D虚拟设备代码也有了进展。
参见:ArchWiki Virgil3d virtio-gpu paravirtualized device driver(过时历史信息)
优点:能发挥显卡大部分性能,并且不依赖厂商的闭源实现。
缺点:实现较为困难,因为缺乏微软WDDM和DirectX的文档,并且需要程序员具有极高的编程水平和显卡驱动开发经验。
3.1 【已弃用,不推荐】max8rr8的virtio-gpu驱动实现
- 链接:virtio-win/kvm-guest-drivers-windows#943
- 较早期的virtio-gpu实现,功能较为缺乏
- 仅支持OpenGL(通过virgl协议传输指令)和Direct3D 10(在mesa gallium内部通过virgl协议传输指令)
- 有许多bug,经常蓝屏崩溃、图形渲染错误,并且已经很久没有更新了,在最新的virglrenderer上已经无法运行
- 仅作为一个参考实现,几乎不能实际使用
3.2 【已弃用,不推荐】anonymix007的旧virtio-gpu驱动实现(max8rr8的一个fork)
3.3 arehnman的virtio-gpu实现:Yttrium(max8rr8的一个fork)
3.4 anonymix的virtio-gpu实现(KMD从零开始用Rust重写)
3.5 osy的virtio-gpu实现:Neptune(基于anonymix007/kvm-guest-drivers-windows-venus实现)
3.6 winboat的virtio-gpu实现:Helios(Rust全新开发)
- 链接:winboat-org/helios
- 实现Vulkan、Direct3D 9-12(通过DXVK翻译成Vulkan执行)、OpenGL、OpenCL
- 目标支持Win10/11,项目积极维护,在WinBoat社区中内测,预计2026年底发布
- 不提供说明文档,但在winboat-devenv中能找到由github workflow自动编译的驱动包
- 开发过程以AI开发为主
3.7 qemu-vmvga:VMware SVGA 3D在QEMU下的实现
- 链接:qemus/qemu-vmvga
- 为QEMU实现VMware SVGA虚拟设备代码,将SVGA3D指令通过DXVK执行
- 项目积极维护,作为桌面加速已经基本可用
- 兼容VMware官方显卡驱动,支持WinXP以上的所有系统
|
|