在玩转 Homelab 和 PVE 显卡直通时,很多人会遇到一个棘手的问题:如何无延迟地在另一台设备(或宿主机本身)上操作虚拟机?
传统的 RDP(远程桌面)由于协议限制,不仅砍掉了显卡加速,玩游戏还会有明显的音频与画面延迟;VNC 性能更是捉襟见肘;而 Parsec 或 Moonlight 虽然优秀,但它们依赖网络协议栈,在内网高负载下仍有抖动风险,且必须占用一个物理显示卡接口(或依赖虚拟显卡欺骗器)。
Looking Glass 则是终极解决方案。它通过 KVM 的 IVSHMEM(虚拟机间共享内存)技术,直接将虚拟机 GPU 渲染出的帧缓冲区(Frame Buffer)零拷贝导入到宿主机(或同宿主机下的另一个 Linux 虚拟机)中。其延迟几乎为零,帧率完全等同于原生显卡输出。
本文将手把手教你如何在 PVE 环境下配置 Looking Glass 串流。
架构与核心原理
在开始前,需要理清 Looking Glass 的工作路径:
- Windows 虚拟机(Host 端):显卡直通正常工作,显卡渲染的画面通过 Looking Glass Host 写入
IVSHMEM共享内存。 - PVE 宿主机(或同宿主机的 Linux 客户端):通过读取
/dev/shm/looking-glass共享内存,直接在本地窗口中渲染画面。
前提条件
- 已成功配置 GPU 直通:Windows 虚拟机(Windows 10/11)已直通独立显卡(NVIDIA / AMD / Intel),且安装了官方显卡驱动。
- 虚拟显示器/诱骗器:直通的显卡必须连接了一个物理显示器,或者插上了一个 HDMI/DP 虚拟显卡欺骗器(HDMI Dummy Plug),否则 Windows 显卡不会输出画面信号。
- PVE 宿主机环境:如果是单台电脑做“All in One”或“双人一机”,PVE 宿主机需要安装桌面环境(如 XFCE、KDE);如果是跨设备,则需要客户端设备也是 Linux 且与 PVE 宿主机存在共享内存映射(通常 Looking Glass 最适合在单台物理机上进行高带宽共享)。
第一步:在 PVE 宿主机配置共享内存(IVSHMEM)
由于 PVE 的 Web 界面(GUI)没有提供配置 IVSHMEM 的选项,我们必须通过命令行修改虚拟机的配置文件。
1. 计算所需的共享内存大小
共享内存的大小取决于你的目标分辨率,公式为:
$$\text{Width} \times \text{Height} \times 4 \times 2 = \text{Bytes}$$
计算后转换成 MB 并向上取 2 的幂次方:
| 目标分辨率 | 像素点数量 | 理论所需内存 | 建议配置值 |
|---|---|---|---|
| 1080P (1920x1080) | 2,073,600 | ~16.5 MB | 32M |
| 2K (2560x1440) | 3,686,400 | ~29.4 MB | 64M |
| 4K (3840x2160) | 8,294,400 | ~66.3 MB | 128M 或 256M |
2. 创建共享内存设备配置文件
在 PVE 中,我们使用 systemd-tmpfiles 来确保每次开机时自动创建具有正确权限的共享内存文件。
登录 PVE 命令行,新建配置文件:
nano /etc/tmpfiles.d/looking-glass.conf
输入以下内容(将 root 和 kvm 替换为你实际运行客户端的用户和组。在 PVE 默认环境下,QEMU 进程以 root 运行):
# Type Path Mode User Group Age Argument
f /dev/shm/looking-glass 0660 root kvm -
保存并退出。手动触发使其立即生效:
systemd-tmpfiles --create /etc/tmpfiles.d/looking-glass.conf
3. 修改虚拟机配置文件
假设你的 Windows 虚拟机 ID 是 101。编辑其配置文件:
nano /etc/pve/qemu-server/101.conf
在文件最顶部或底部,添加 args 参数(注意:如果已有 args 行,请用空格隔开追加到末尾):
args: -device ivshmem-plain,id=ivshmem,master=on,memdev=ivshmem-mem -object memory-backend-file,id=ivshmem-mem,share=on,mem-path=/dev/shm/looking-glass,size=64M
(注意:请将 size=64M 替换为你上一步计算出的合适大小。)
第二步:在 Windows 虚拟机中安装驱动与 Host 端
完成宿主机配置后,启动 Windows 虚拟机。
1. 安装 IVSHMEM 设备驱动
- 进入 Windows 虚拟机,打开“设备管理器”。你会发现一个带有黄色感叹号的未知设备(通常显示为“PCI 标准 RAM 控制器”或“PCI Device”)。
- 下载并挂载最新的 VirtIO-win ISO 驱动光盘(下载地址)。
- 在黄色感叹号设备上右键,选择“更新驱动程序” -> “浏览我的电脑以查找驱动程序”。
- 定位到 VirtIO 虚拟光驱下的
IVSHMEM目录(例如D:\ivshmem\w10\amd64),点击确定并完成安装。 - 安装成功后,设备名称应显示为 Red Hat VirtIO IVSHMEM Device。
2. 安装 Looking Glass Host
- 前往 Looking Glass 官网下载与你客户端版本一致的 Host 纯净版安装包(建议使用最新的 Stable Release,例如 B6 版本)。
- 运行并安装。安装过程中会提示是否注册为系统服务(Windows Service),建议勾选,这样虚拟机开机后无需登录即可自动运行后台串流。
第三步:运行 Linux 客户端(Client)
现在,我们需要在展示画面的 Linux 环境(通常是 PVE 本身,或通过其他技术共享了 /dev/shm/looking-glass 的 Linux 桌面)中编译/安装客户端。
1. 安装依赖(以 Debian/Ubuntu 架构为例)
在运行客户端的 Linux 系统中安装编译所需的依赖:
sudo apt update
sudo apt install -y binutils-dev cmake fonts-freefont-ttf libsdl2-dev \
libsdl2-ttf-dev libspice-client-glib-2.0-dev libpixman-1-dev \
libegl1-mesa-dev libgl1-mesa-dev libglu1-mesa-dev libx11-dev \
libxss-dev libxext-dev libxpresent-dev libxcb1-dev libxcb-shm0-dev \
libxcb-xfixes0-dev libxcb-randr0-dev libasound2-dev libpulse-dev \
libsamplerate0-dev libwayland-dev wayland-protocols libxkbcommon-dev
2. 下载并编译 Client
- 下载与 Host 版本严格一致的源码包。
- 编译并安装:
tar -zxvf looking-glass-B6.tar.gz
cd looking-glass-B6
mkdir build
cd build
cmake ../
make -j$(nproc)
编译完成后,会在当前目录下生成 looking-glass-client 二进制文件。
3. 启动 Looking Glass 客户端
直接在有桌面环境的终端中运行:
./looking-glass-client -f /dev/shm/looking-glass
如果一切顺利,一个丝滑、无延迟的 Windows 虚拟机桌面窗口就会瞬间呈现在你面前。
第四步:进阶配置与体验优化
为了达到“物理机”级别的无缝体验,以下两项优化非常关键。
1. 解决鼠标不同步/双鼠标问题(配置 Spice 指针)
如果发现客户端窗口内有两个鼠标(一个是 Linux 宿主机的,一个是 Windows 内的且移动速度不一致),请通过 Spice 进行鼠标同步:
- 关闭虚拟机,在 PVE 网页端进入该虚拟机设置,点击 硬件 -> 添加 -> 串行端口(Serial Port)(添加一个
0号串口)。 - 再点击 添加 -> Display,将默认的显卡模式改为 SPICE (qxl)(注意:不要删除你的直通物理显卡,SPICE 仅用于传输键盘鼠标控制流)。
- 启动虚拟机,在 Windows 内安装 Spice Guest Tools(同样在 VirtIO-win ISO 中可以找到)。
- 运行 Looking Glass 客户端时加上
-m 97参数(使绑定的键为右 Control 键解锁鼠标),或者利用 Spice 连接控制。此时,鼠标指针将完美同步,且支持剪贴板双向共享。
2. 音频低延迟同步(Scream 虚拟声卡)
Looking Glass 本身不传输音频。要获得音画同步的体验,推荐使用 Scream(通过网络或 IVSHMEM 传输音频的虚拟声卡)。
- 在 Windows 虚拟机内安装 Scream 虚拟声卡驱动。
- 在 Linux 客户端宿主机运行 Scream 接收端,声音即可通过 PulseAudio/PipeWire 完美输出,延迟在 10ms 以内,肉眼完全无法察觉。
# 启动接收端
scream -u -p 4010
常见故障排查
- 错误:
Failed to map physical memory- 检查
/dev/shm/looking-glass的权限是否正确。运行chmod 666 /dev/shm/looking-glass测试是否为权限问题。 - 确认 PVE 配置文件中
size字段(如64M)与你实际物理分辨率所需的大小是否匹配。如果 Windows 的分辨率设置过高,超过了共享内存容量,Host 端会崩溃。
- 检查
- 画面黑屏但有声音
- 检查直通的显卡是否正确识别。
- 检查物理显卡上是否插了虚拟 HDMI 诱骗器。Windows 在检测不到显示设备时会关闭桌面渲染输出。
通过 Looking Glass,你的 PVE 显卡直通虚拟机在体验上将彻底脱胎换骨。无论是进行高画质 3A 游戏,还是需要 GPU 加速的剪辑工作,它都能提供近乎零损耗的本地操作手感。