HOOOS

榨干显卡直通性能:Proxmox VE (PVE) 虚拟机配置 Looking Glass 极速无延迟串流指南

0 19 Homelab极客 Proxmox VE显卡直通
Apple

在玩转 Homelab 和 PVE 显卡直通时,很多人会遇到一个棘手的问题:如何无延迟地在另一台设备(或宿主机本身)上操作虚拟机?

传统的 RDP(远程桌面)由于协议限制,不仅砍掉了显卡加速,玩游戏还会有明显的音频与画面延迟;VNC 性能更是捉襟见肘;而 Parsec 或 Moonlight 虽然优秀,但它们依赖网络协议栈,在内网高负载下仍有抖动风险,且必须占用一个物理显示卡接口(或依赖虚拟显卡欺骗器)。

Looking Glass 则是终极解决方案。它通过 KVM 的 IVSHMEM(虚拟机间共享内存)技术,直接将虚拟机 GPU 渲染出的帧缓冲区(Frame Buffer)零拷贝导入到宿主机(或同宿主机下的另一个 Linux 虚拟机)中。其延迟几乎为零,帧率完全等同于原生显卡输出。

本文将手把手教你如何在 PVE 环境下配置 Looking Glass 串流。


架构与核心原理

在开始前,需要理清 Looking Glass 的工作路径:

  1. Windows 虚拟机(Host 端):显卡直通正常工作,显卡渲染的画面通过 Looking Glass Host 写入 IVSHMEM 共享内存。
  2. PVE 宿主机(或同宿主机的 Linux 客户端):通过读取 /dev/shm/looking-glass 共享内存,直接在本地窗口中渲染画面。

前提条件

  1. 已成功配置 GPU 直通:Windows 虚拟机(Windows 10/11)已直通独立显卡(NVIDIA / AMD / Intel),且安装了官方显卡驱动。
  2. 虚拟显示器/诱骗器:直通的显卡必须连接了一个物理显示器,或者插上了一个 HDMI/DP 虚拟显卡欺骗器(HDMI Dummy Plug),否则 Windows 显卡不会输出画面信号。
  3. 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 128M256M

2. 创建共享内存设备配置文件

在 PVE 中,我们使用 systemd-tmpfiles 来确保每次开机时自动创建具有正确权限的共享内存文件。

登录 PVE 命令行,新建配置文件:

nano /etc/tmpfiles.d/looking-glass.conf

输入以下内容(将 rootkvm 替换为你实际运行客户端的用户和组。在 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 设备驱动

  1. 进入 Windows 虚拟机,打开“设备管理器”。你会发现一个带有黄色感叹号的未知设备(通常显示为“PCI 标准 RAM 控制器”或“PCI Device”)。
  2. 下载并挂载最新的 VirtIO-win ISO 驱动光盘(下载地址)。
  3. 在黄色感叹号设备上右键,选择“更新驱动程序” -> “浏览我的电脑以查找驱动程序”。
  4. 定位到 VirtIO 虚拟光驱下的 IVSHMEM 目录(例如 D:\ivshmem\w10\amd64),点击确定并完成安装。
  5. 安装成功后,设备名称应显示为 Red Hat VirtIO IVSHMEM Device

2. 安装 Looking Glass Host

  1. 前往 Looking Glass 官网下载与你客户端版本一致的 Host 纯净版安装包(建议使用最新的 Stable Release,例如 B6 版本)。
  2. 运行并安装。安装过程中会提示是否注册为系统服务(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

  1. 下载与 Host 版本严格一致的源码包。
  2. 编译并安装:
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 进行鼠标同步:

  1. 关闭虚拟机,在 PVE 网页端进入该虚拟机设置,点击 硬件 -> 添加 -> 串行端口(Serial Port)(添加一个 0 号串口)。
  2. 再点击 添加 -> Display,将默认的显卡模式改为 SPICE (qxl)(注意:不要删除你的直通物理显卡,SPICE 仅用于传输键盘鼠标控制流)。
  3. 启动虚拟机,在 Windows 内安装 Spice Guest Tools(同样在 VirtIO-win ISO 中可以找到)。
  4. 运行 Looking Glass 客户端时加上 -m 97 参数(使绑定的键为右 Control 键解锁鼠标),或者利用 Spice 连接控制。此时,鼠标指针将完美同步,且支持剪贴板双向共享。

2. 音频低延迟同步(Scream 虚拟声卡)

Looking Glass 本身不传输音频。要获得音画同步的体验,推荐使用 Scream(通过网络或 IVSHMEM 传输音频的虚拟声卡)。

  1. 在 Windows 虚拟机内安装 Scream 虚拟声卡驱动
  2. 在 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 加速的剪辑工作,它都能提供近乎零损耗的本地操作手感。

点评评价

captcha
健康