QEMU virtio-gpu 设备配置指南:从 2D 显示到 virgl/3D 加速与 Wayland 透传
虚拟化硬件仿真【免费下载链接】qemuOfficial QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are disabled. Please only use release tarballs from the QEMU website.项目地址https://gitcode.com/gh_mirrors/qe/qemu点击查看免费下载virtio-gpu 是 QEMU 中基于 VirtIO 协议半虚拟化的 GPU 与显示控制器设备它让客户机无需真实显卡驱动即可获得从简单 2D 帧缓冲到完全硬件加速 3D 图形的显示能力。本文以 docs/system/devices/virtio/virtio-gpu.rst 为骨架结合 QEMU 仓库中 hw/display 下的实际实现源码系统讲解 virtio-gpu 的设备变体、各后端2D / virglrenderer / rutabaga_gfx / vhost-user的选型与启动参数、内核与 Mesa 版本要求帮助你为虚拟机正确配置图形子系统。virtio-gpu 是什么virtio-gpu 是使用 VirtIO 总线实现半虚拟化的 GPU 和显示控制器。与传统设备模拟如 VGA、bochs-display不同virtio-gpu 通过 virtqueue 传递控制命令与资源数据客户机与 QEMU 之间以共享内存方式交换帧缓冲与渲染资源。它支持多种工作模式从只做简单 2D 帧缓冲到借助宿主 GPU 完成完全加速的 3D 图形渲染。从源码结构看virtio-gpu 的实现分布在 hw/display 目录下的多个文件中形成清晰的层次virtio-gpu.c基础 2D 设备实现负责资源创建、scanout 管理、EDID 生成、迁移状态等virtio_gpu_properties中定义了max_hostmem默认 256 MiB、blob、hostmem等属性virtio-gpu-virgl.cvirglrenderer 集成层把 guest 的 3D 命令转发给宿主上的 virglrenderer 库virtio-gpu-gl.cvirgl 后端设备virtio-gpu-gl的属性与 realize 逻辑定义了venus、drm_native_context、stats等属性virtio-gpu-rutabaga.crutabaga_gfx 后端virtio-gpu-rutabaga提供 gfxstream 渲染与 Wayland 显示透传virtio-gpu-base.c设备公共基类负责 max_outputs、EDID、blob 能力协商等。客户机内核要求要让 Linux 客户机识别并使用 virtio-gpu其内核必须以CONFIG_DRM_VIRTIO_GPU选项构建启用 virtio-gpu 的 DRM 驱动。绝大多数现代发行版内核默认已开启该选项一般无需重新编译内核。QEMU virtio-gpu 设备变体QEMU 提供了一系列 virtio-gpu 设备变体命名遵循如下形式virtio-vga[-BACKEND]virtio-gpu[-BACKEND][-INTERFACE]vhost-user-vgavhost-user-pci可以从两个维度理解这些变体后端Backend与接口Interface。Backend2D 与加速后端2D 后端默认只做 2D 操作virglrenderer 后端设备名带gl后缀如virtio-gpu-gl、virtio-vga-glrutabaga_gfx 后端设备名带rutabaga后缀如virtio-gpu-rutabagavhost-user 后端图形栈运行在独立进程中提升隔离性。对应地仓库 hw/display 下有 virtio-gpu-gl.c、virtio-gpu-rutabaga.c、virtio-gpu-virgl.c、vhost-user-gpu.c 等实现文件每个后端都通过TypeInfo注册为独立的 QEMU 设备类型。InterfaceVGA 与非 VGAVGA 变体以virtio-vga或vhost-user-vga为前缀始终使用 PCI 接口兼容传统 VGA 显示方案适合引导阶段或未安装 virtio-gpu 驱动的场景非 VGA 变体以virtio-gpu或vhost-user-gpu为前缀用户可以在 MMIO 与 PCI 之间选择使用 MMIO设备名加-device后缀注意vhost-user-gpu不支持 MMIO使用 PCI设备名加-pci后缀不加任何后缀时采用平台默认接口。2D 模式virtio-gpu 2d默认的 2D 后端只执行 2D 操作客户机内的 3D 图形需要由软件渲染器完成。典型的软件渲染器是 Mesa 或 SwiftShaderMesa 的实现LLVMpipe、Lavapipe以及后文将介绍的 virgl在常见现代 Linux 发行版上开箱即用。启用 2D 模式最简单-device virtio-gpu从源码看2D 后端对应 hw/display/virtio-gpu.c 中的virtio_gpu_simple_process_cmd命令处理路径它直接管理 pixman 图像资源与 scanout不依赖任何宿主 GPU。virglrenderer 加速模式virtio-gpu-gl当客户机使用 virgl 加速图形模式时guest 内的 OpenGL API 调用会被翻译成一种中间表示见 Mesa 的 Gallium3D 设计该中间表示通过 virtqueue 传给宿主由宿主上的 virglrenderer 库翻译回 OpenGL API 调用借助宿主 GPU 完成真实渲染。源码 hw/display/virtio-gpu-virgl.c 中的virgl_renderer_resource_create、virgl_renderer_submit_cmd、virgl_renderer_transfer_write_iov等调用正是这条转发链路的关键节点。基础 3D 加速-device virtio-gpu-glOpenGL 4.6hostmem blob默认情况下客户机内可用的 OpenGL 版本被限制在 4.3。要启用 OpenGL 4.6 支持需要开启 virtio-gpu 的 host blob 特性即设置hostmem与blob两个字段。其中hostmem指定 virtio-gpu 宿主内存窗口host memory window的大小通常在 256M 到 8G 之间-device virtio-gpu-gl,hostmem8G,blobtrue从源码看virtio-gpu.c 中virtio_gpu_properties定义了blobVIRTIO_GPU_FLAG_BLOB_ENABLED与hostmem属性virtio-gpu-gl.c 的virtio_gpu_gl_device_realize会在hostmem启用时通过qemu_ram_mmap预留该窗口并注册为hostmem-background内存区域供 blob 资源映射使用。Vulkan 透传Venusvirglrenderer v1.0.0 起通过 venus 协议支持 Vulkan API 调用的翻译。Venus 对应的 virtio-gpu 能力集capset同样要求宿主 blob 支持hostmem与blob并通过venus字段启用-device virtio-gpu-gl,hostmem8G,blobtrue,venustrue源码中venus属性定义在 virtio-gpu-gl.c 的virtio_gpu_gl_properties中VIRTIO_GPU_FLAG_VENUS_ENABLED。DRM 原生上下文drm_native_contextvirglrenderer v1.0.0 起通过 drm 协议支持 DRM 原生上下文。该能力同样要求宿主 blob 支持并用drm_native_context字段启用-device virtio-gpu-gl,hostmem8G,blobon,drm_native_contexton源码中drm_native_context属性VIRTIO_GPU_FLAG_DRM_ENABLED同样位于 virtio-gpu-gl.c 的属性表中。宿主与客户机版本要求以下为 virglrenderer 模式下官方文档给出的版本要求。宿主侧需要相应版本的 Linux 内核与 libvirglrenderer能力内核版本libvirglrenderer 版本OpenGL 透传不使用 host blob 时任意兼容版本使用 host blob 需要 Linux 6.130.8.2Vulkan 透传Linux 6.131.0.0AMDGPU DRM 原生上下文Linux 6.131.1.0Freedreno DRM 原生上下文Linux 6.41.0.0Intel i915 DRM 原生上下文Linux 6.131.3.0Asahi DRM 原生上下文Asahi Linux 下游版本内核1.2.0Panfrost 原生上下文Linux 6.131.3.0客户机侧需要相应版本的 Linux 内核与 Mesa能力内核版本Mesa 版本OpenGL 透传任意支持 virtio-gpu 的 Linux 版本16.0.0Vulkan 透传Linux 5.1624.2.0AMDGPU DRM 原生上下文Linux 6.1425.0.0Freedreno DRM 原生上下文Linux 6.1423.1.0Intel i915 DRM 原生上下文Linux 6.1426.1.0Asahi DRM 原生上下文Linux 6.1424.2.0Panfrost 原生上下文Linux 6.14Mesa MR 36814 中的对应版本使用前提显示后端需启用 OpenGL使用virtio-gpu-gl时QEMU 的显示后端必须支持 OpenGL。virtio-gpu-gl.c 的 realize 逻辑中若display_opengl未开启会直接报错并提示用-display BACKEND,glon启用例如-display gtk,glon或-display egl-headless。此外 virgl 不支持大端平台也不支持同时创建多个virtio-gpu-gl设备。rutabaga_gfx 模式virtio-gpu-rutabagavirtio-gpu 还可以借助 rutabaga_gfx 提供 gfxstream 渲染与 Wayland 显示透传。gfxstream 渲染模式下GLES 与 Vulkan 调用以最小修改量转发到宿主执行。构建 gfxstream 版 rutabaga 以及启动客户机 Wayland 代理的步骤可参考 crosvm 文档本文不展开外部链接可按 crosvm 官方手册中的 rutabaga_gfx 与 Wayland 章节操作。能力集capset与关键参数该设备同样要求宿主 blob 支持hostmem字段含义与 virgl 模式一致宿主内存窗口通常 256M8G。启动设备时必须至少指定一个 capset。当前 Linux 客户机支持的能力集为gfxstream-vulkangfxstream 的 Vulkan 透传cross-domain跨域通道用于 Wayland 显示透传等。对于 Android 客户机还支持实验性的x-gfxstream-glesx-gfxstream-composer源码中这些 capset 定义于 virtio-gpu-rutabaga.c 的属性表对应DEFINE_PROP_BIT64(gfxstream-vulkan, ...)、DEFINE_PROP_BIT64(cross-domain, ...)等条目以位掩码形式保存在capset_mask中。其他参数wayland-socket-path若设置了cross-domaincapset设备会尝试自动探测 Wayland socket 路径对于非标准路径可通过该参数显式指定wsi可设为surfaceless或headless。surfaceless不创建原生窗口表面但会在收到 virtio-gpu 2D hypercall 时把渲染目标拷贝到 Pixman 缓冲区headless与 surfaceless 类似但不拷贝到 Pixman 缓冲区。未指定时默认surfaceless。完整的启动示例-device virtio-gpu-rutabaga,gfxstream-vulkanon,cross-domainon, hostmem8G,wayland-socket-path/tmp/nonstandard/mock_wayland.sock, wsiheadless从源码实现看virtio-gpu-rutabaga.c 中 rutabaga 的初始化逻辑会按wsi字符串映射到RUTABAGA_WSI_SURFACELESS等枚举未指定wayland-socket-path时会参照 libwayland 的方式依次尝试$WAYLAND_DISPLAY环境变量指定的 socket、$XDG_RUNTIME_DIR/wayland-0均失败则不向 rutabaga 传递 socket此时客户机 Wayland 代理将无法工作。宿主与客户机版本要求能力宿主内核版本客户机内核版本客户机 Mesa 版本VulkanWayland 透传Linux 6.13Linux 5.1624.3.0vhost-user 后端隔离运行的图形栈除上述设备内联后端外QEMU 还提供 vhost-user 后端把整个图形栈放进独立进程运行以获得更好的隔离性。对应设备为vhost-user-vgaVGA 接口与vhost-user-gpu非 VGA仅 PCI不支持 MMIO。相关实现位于 vhost-user-gpu.c、vhost-user-gpu-pci.c、vhost-user-vga.c它们通过 vhost-user 协议与后端进程通信QEMU 侧通过chardev属性连接后端 socket。使用方式通常需要先启动一个提供 vhost-user-gpu 服务的后端进程如基于 virtio-gpu 的独立守护进程再在 QEMU 命令行中挂载对应的 vhost-user 设备。小结场景推荐设备参数关键前提纯 2D 显示-device virtio-gpu无特殊要求OpenGL 3D 加速-device virtio-gpu-gl显示后端glonvirglrenderer 0.8.2OpenGL 4.6-device virtio-gpu-gl,hostmem8G,blobtrue宿主 blob 支持Vulkan 透传-device virtio-gpu-gl,hostmem8G,blobtrue,venustruevirglrenderer 1.0.0DRM 原生上下文-device virtio-gpu-gl,hostmem8G,blobon,drm_native_contextonvirglrenderer 1.0.0gfxstream / Wayland 透传-device virtio-gpu-rutabaga,gfxstream-vulkanon,cross-domainon,hostmem8Grutabaga_gfxLinux 6.13 宿主以上所有设备参数均以当前 QEMU 仓库源码为准。启动前请按表格核对宿主内核、libvirglrenderer/rutabaga_gfx 与客户机内核、Mesa 的版本组合hostmem值建议在 256M8G 区间内按需调整。需要进一步了解实现细节的读者可深入阅读 hw/display/virtio-gpu.c、hw/display/virtio-gpu-gl.c、hw/display/virtio-gpu-virgl.c 与 hw/display/virtio-gpu-rutabaga.c 的源码。赞分享虚拟化硬件仿真【免费下载链接】qemuOfficial QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are disabled. Please only use release tarballs from the QEMU website.项目地址https://gitcode.com/gh_mirrors/qe/qemu点击查看免费下载相关推荐QEMU VirtIO 设备全景指南从 virtio-gpu 图形加速到 vhost-user 进程外卸载QEMU VirtIO 设备全景指南从 virtio gpu 图形加速到 vhost user 进程外卸载 VirtIO 是 QEMU 中半虚拟化设备的核心实虚拟化硬件仿真QEMU VirtIO Sound 设备完全指南配置、使用与源码实现剖析QEMU VirtIO Sound 设备完全指南配置、使用与源码实现剖析 VirtIO Soundvirtio snd是 QEMU 提供的一种半虚拟化p虚拟化硬件仿真QEMU VFIO 显示子系统测试指南用内核 mdpy mdev 设备验证虚拟显卡透传与热插拔QEMU VFIO 显示子系统测试指南用内核 mdpy mdev 设备验证虚拟显卡透传与热插拔 本文以 docs/devel/vfio mdpy.rst ht虚拟化硬件仿真上一篇终极指南如何实现Airbyte监控集成与Prometheus、Grafana配置下一篇Cisco-Images-for-GNS3-and-EVE-NG企业网络安全实验环境搭建全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考