最终的实现效果是,在无桌面环境的宿主机上运行使用virgl加速的Linux虚拟机,可以通过rdp连接,也可以在virt-manager上看到画面

环境配置
宿主机:Ubuntu Server 24.04 LTS(无桌面环境),CPU为Ryzen 5700G(amd集成显卡)
虚拟机为Debian13,使用Gnome桌面
首先在宿主机上安装qemu和virt-manager,然后安装virgl所需的包:
apt install libvirglrenderer-dev libvirglrenderer1 virgl-server为了在无头环境使用virt-manager,需要安装一个MobaXterm,ssh连接后直接执行”virt-manager”,就可以打开窗口

常规配置步骤——用不了说是
网上常见的配置步骤是,使用virt-manager,把video的Model改成virtio,开启3D Acceleration;Display改成Spice,Listen type设置为None,最后勾选OpenGL——是不是很简单?
然后就黑屏了…在virt-manager上只能看到引导界面,进入系统就会直接黑屏
解决方法
解决方法是配置egl-headless——说实话我也不太清楚是干什么的;(
💡 关于
egl-headless的作用: 简单来说,virgl(VirGL Renderer) 需要一个 OpenGL/EGL 的上下文才能将虚拟机内的 3D 指令渲染出来。在没有桌面环境(Headless)的宿主机上,宿主机无法提供一个可见的显示窗口来承载这个渲染上下文。egl-headless显卡类型的作用就是提供一个“无屏幕”的 EGL 渲染上下文,让virgl可以在宿主机的 GPU 上(通过/dev/dri/renderD128)进行计算和渲染,并将渲染结果传递给 Spice 或 VNC 等显示协议,从而解决黑屏问题。
*此方案来自Gemini3
由于virt-manager的Graphics上没有egl-headless这个选项,只能用virsh手动编辑
搜索<graphics>块,将原来的块全部删除,然后改为如下配置
<graphics type='spice' port='5910' autoport='no' listen='192.168.1.114'>
<listen type='address' address='192.168.1.114'/>
<image compression='off'/>
</graphics>
<graphics type='egl-headless'>
<gl rendernode='/dev/dri/renderD128'/>
</graphics>
address和port为spice监听地址,按需修改;注意/dev/dri/renderD128改成你实际的显卡路径;video配置不要改,还是virtio
最后启动虚拟机即可,此时virt-manager上已经可以看到画面;进入系统可以看到显卡这项已经是virgl

开启rdp
打开设置-系统-远程桌面-远程登陆,设置后即可用Windows自带的远程桌面连接(mstsc)进行连接
如果安装了xrdp,记得卸载

连接后会提示连接不安全:

如果只在局域网环境可以忽略,否则建议按如下操作配置:
打开mstsc,输入IP:端口后先不要连接,打开下面的显示选项,点击连接设置-另存为
找到刚才保存的.rdp文件,用记事本编辑,把第一行的use redirection server name:i:0替换为(没有的话就添加)
use redirection server name:i:1最后双击.rdp文件连接即可
连接后打开chromium,访问chrome://gpu,应该能看到很多Hardware accelerated字样
(完)
啊什么,你还没配置内网穿透?那快去看看这篇超级棒的内网穿透方案介绍()
