外观
带显卡的远程桌面虚拟机
普通的远程桌面(RDP、noVNC)用的是软件渲染,跑办公软件、写代码没问题,但视频、3D、游戏这类需要真实显卡加速的场景会很卡。解决办法是把一块物理显卡整个直通给虚拟机,让虚拟机里的系统直接用上真实的 GPU 驱动和硬件编码器,再配合低延迟的远程协议把画面传出来。
这是分类导读里提到的「最难的一类场景」——同时依赖具体硬件、IOMMU 分组和网络条件。开始之前请先确认硬件条件,再决定值不值得投入。
适合谁
| 你的情况 | 合不合适 |
|---|---|
| 只是偶尔远程处理文档、终端操作 | 不需要,普通 RDP/noVNC 就够,见SPICE、RDP 与 noVNC 的取舍 |
| 需要远程做视频剪辑、3D 建模、跑需要 GPU 加速的软件 | 合适,这正是本文要解决的场景 |
| 想远程玩游戏(自建云游戏) | 合适,也是这套方案最常见的用途之一 |
| 机器只有一块核显,还要给宿主机或其他容器用 | 不合适整卡直通,考虑核显共享给 LXC 容器转码(见媒体服务器),或者加一块独立显卡专门用于直通 |
| 硬件不支持 IOMMU,或独显所在的 IOMMU 分组不干净 | 先解决这个前提,见硬件直通 |
前提条件
在动手之前,确认以下几点都成立,否则先去把前提条件解决掉:
- CPU/主板支持并开启了 VT-d / AMD-Vi(IOMMU),见硬件直通。
- 目标显卡在一个干净的 IOMMU 分组里,能整组直通而不牵连宿主机需要的其他设备。
- 虚拟机用 q35 机型(PCIe 直通的前提)。
- 想清楚这块显卡直通之后宿主机和其他客户机都不能用它了,且这台虚拟机不能再打快照、不能在线迁移。
具体的直通操作步骤见显卡直通,本文假设直通已经做好,重点在客户机侧的配置和远程协议选择。
资源规划
| 项 | 建议 | 说明 |
|---|---|---|
| vCPU | 4 起 | 编码、游戏逻辑或渲染任务通常比普通桌面用更多核心 |
| 内存 | 固定分配,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 容器这类私有组网方案访问,安全性和体验都更好。
检查结果
- 客户机内的设备管理器(Windows)或
lspci/ 驱动工具(Linux)能看到直通进来的显卡,型号正确,驱动状态正常(Windows 下不是「代码 43」这类报错)。 - 跑一个简单的 GPU 占用测试(比如显卡厂商自带的监控面板,或者一段视频硬件解码),确认负载确实由这块显卡处理,而不是回退到软件渲染。
- Moonlight(或选定的客户端)能连接并显示画面,操作有响应,帧率符合预期。
- 在局域网内测试一次完整场景(打开一个真实会用到 GPU 加速的应用),确认端到端可用,而不只是能看到桌面。
备份与维护
直通显卡后,这台虚拟机不能打快照
备份只能靠 vzdump 的完整备份(关机或挂起状态),或者客户机内部自带的备份/镜像工具。做重大改动(驱动升级、系统更新)前,先做一次完整备份,而不是依赖「打个快照回滚」这个通常的做法。
升级显卡驱动或宿主机内核前,确认 IOMMU 分组和直通配置没有因为硬件变化受影响(换槽位、加装新设备都可能改变分组)。
常见问题
Windows 里显卡报「代码 43」或直接不显示。 这是消费级显卡在虚拟机环境里常见的驱动检测问题,详细成因和处理方式见直通常见问题,不要一上来就尝试来源不明的「绕过检测」脚本。
串流端画面全黑,但虚拟机本身运行正常。 检查显卡是否接了实体显示器或 HDMI 假负载头;也检查串流软件是否选中了正确的显卡(有集显和独显同时存在时,容易被自动选到错误的一块)。
远程操作延迟明显、卡顿。 先在局域网内测试排除网络因素;确认串流分辨率/帧率设置没有超出显卡编码器和网络带宽的承受范围。
只是想偶尔用一下,值得这么折腾吗? 大概率不值得。直通的代价(不能快照迁移、独占一张显卡)对低频使用场景不划算,先用 RDP 试试,见SPICE、RDP 与 noVNC 的取舍。