跳转到内容

带显卡的远程桌面虚拟机 ​

普通的远程桌面(RDP、noVNC)用的是软件渲染,跑办公软件、写代码没问题,但视频、3D、游戏这类需要真实显卡加速的场景会很卡。解决办法是把一块物理显卡整个直通给虚拟机,让虚拟机里的系统直接用上真实的 GPU 驱动和硬件编码器,再配合低延迟的远程协议把画面传出来。

这是分类导读里提到的「最难的一类场景」——同时依赖具体硬件、IOMMU 分组和网络条件。开始之前请先确认硬件条件,再决定值不值得投入。

适合谁 ​

你的情况合不合适
只是偶尔远程处理文档、终端操作不需要,普通 RDP/noVNC 就够,见SPICE、RDP 与 noVNC 的取舍
需要远程做视频剪辑、3D 建模、跑需要 GPU 加速的软件合适,这正是本文要解决的场景
想远程玩游戏(自建云游戏)合适,也是这套方案最常见的用途之一
机器只有一块核显,还要给宿主机或其他容器用不合适整卡直通,考虑核显共享给 LXC 容器转码(见媒体服务器),或者加一块独立显卡专门用于直通
硬件不支持 IOMMU,或独显所在的 IOMMU 分组不干净先解决这个前提,见硬件直通

前提条件 ​

在动手之前,确认以下几点都成立,否则先去把前提条件解决掉:

  1. CPU/主板支持并开启了 VT-d / AMD-Vi(IOMMU),见硬件直通。
  2. 目标显卡在一个干净的 IOMMU 分组里,能整组直通而不牵连宿主机需要的其他设备。
  3. 虚拟机用 q35 机型(PCIe 直通的前提)。
  4. 想清楚这块显卡直通之后宿主机和其他客户机都不能用它了,且这台虚拟机不能再打快照、不能在线迁移。

具体的直通操作步骤见显卡直通,本文假设直通已经做好,重点在客户机侧的配置和远程协议选择。

资源规划 ​

项建议说明
vCPU4 起编码、游戏逻辑或渲染任务通常比普通桌面用更多核心
内存固定分配,8 GB 起直通设备的虚拟机不能用气球驱动,内存要在创建时定好上限
系统盘64 GB 起(Windows 更大)用 VirtIO SCSI,开 Discard 和 IO thread
CPU 类型host需要客户机拿到完整指令集,尤其是做视频编码时
显卡一块独立 GPU(直通)或支持 SR-IOV/vGPU 分片的型号消费级显卡通常只能整卡直通;部分专业卡支持切分给多台虚拟机,见SR-IOV 与 vGPU

选客户机系统 ​

系统许可适合
Windows需要正版许可(付费)游戏、大多数专业创作软件(视频剪辑、3D 建模)只在 Windows 上有完整生态
Linux开源、免费命令行/开发场景为主,游戏和专业软件的兼容性视具体发行版和应用而定

两种系统的直通步骤和驱动安装方式不同,具体差异见显卡直通。

创建与安装 ​

按创建第一个虚拟机的通用流程建虚拟机,装好操作系统之后再按显卡直通把显卡加进去,然后在客户机内部安装显卡厂商的官方驱动(NVIDIA/AMD/Intel 官网),和物理机上装驱动的方式一样。

显卡没接显示器,驱动可能不初始化输出

被直通的显卡如果没有接实体显示器,某些驱动或远程串流软件可能拿不到可渲染的画面(表现为黑屏或串流端看不到画面)。常见解决办法是接一个 HDMI 假负载头(dummy plug),或者用支持虚拟显示器的串流方案(见下文的 Sunshine)。

选远程协议:把画面传出来 ​

显卡直通只解决了「渲染」,画面还得传到你正在用的设备上。三种常见方案:

方案延迟/画质许可说明
Sunshine + Moonlight低延迟、支持硬件编码(NVENC/AMD AMF/Quick Sync)开源、免费Sunshine 装在客户机里作为串流服务端,Moonlight 是客户端,几乎所有平台都有。本文推荐的默认方案
Parsec低延迟,易用性好免费增值,个人版免费,团队功能付费配置比 Sunshine 简单,多人协作场景更方便
RDP/SPICE延迟和画质一般,办公够用视具体实现而定不专门利用直通显卡的硬件编码器,适合非实时画面场景,见SPICE、RDP 与 noVNC 的取舍

以 Sunshine 官方文档 和 Moonlight 官方文档为准安装:在客户机内部安装 Sunshine,配置好要串流的显示器/应用,在另一台设备装 Moonlight 客户端,输入这台虚拟机的地址配对。

局域网内体验最好,跨公网要先解决访问方式

Sunshine/Moonlight 默认按局域网设计。要从外面连回来,不要直接把串流端口暴露到公网,配合 Tailscale 容器这类私有组网方案访问,安全性和体验都更好。

检查结果 ​

  1. 客户机内的设备管理器(Windows)或 lspci / 驱动工具(Linux)能看到直通进来的显卡,型号正确,驱动状态正常(Windows 下不是「代码 43」这类报错)。
  2. 跑一个简单的 GPU 占用测试(比如显卡厂商自带的监控面板,或者一段视频硬件解码),确认负载确实由这块显卡处理,而不是回退到软件渲染。
  3. Moonlight(或选定的客户端)能连接并显示画面,操作有响应,帧率符合预期。
  4. 在局域网内测试一次完整场景(打开一个真实会用到 GPU 加速的应用),确认端到端可用,而不只是能看到桌面。

备份与维护 ​

直通显卡后,这台虚拟机不能打快照

备份只能靠 vzdump 的完整备份(关机或挂起状态),或者客户机内部自带的备份/镜像工具。做重大改动(驱动升级、系统更新)前,先做一次完整备份,而不是依赖「打个快照回滚」这个通常的做法。

升级显卡驱动或宿主机内核前,确认 IOMMU 分组和直通配置没有因为硬件变化受影响(换槽位、加装新设备都可能改变分组)。

常见问题 ​

Windows 里显卡报「代码 43」或直接不显示。 这是消费级显卡在虚拟机环境里常见的驱动检测问题,详细成因和处理方式见直通常见问题,不要一上来就尝试来源不明的「绕过检测」脚本。

串流端画面全黑,但虚拟机本身运行正常。 检查显卡是否接了实体显示器或 HDMI 假负载头;也检查串流软件是否选中了正确的显卡(有集显和独显同时存在时,容易被自动选到错误的一块)。

远程操作延迟明显、卡顿。 先在局域网内测试排除网络因素;确认串流分辨率/帧率设置没有超出显卡编码器和网络带宽的承受范围。

只是想偶尔用一下,值得这么折腾吗? 大概率不值得。直通的代价(不能快照迁移、独占一张显卡)对低频使用场景不划算,先用 RDP 试试,见SPICE、RDP 与 noVNC 的取舍。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。