HOOOS

拒绝黑屏与切源:用 Looking Glass 实现 KVM 虚拟机超低延迟无感画面回传

0 15 硬核终端 LinuxKVM
Apple

在搞定 KVM 显卡直通(VFIO)后,很多人面临的下一个痛点就是显示输出

传统的物理双线接单显示器需要频繁切换信号源,而使用物理采集卡又存在额外的延迟和成本。RDP 或 VNC 这类网络串流方案对于游戏或高刷场景来说,高压缩率带来的画质损失和输入延迟更是无法接受。

Looking Glass 彻底解决了这个问题。它利用 KVM 的 ivshmem(VM 间共享内存)技术,直接在宿主机(Host)与虚拟机(Guest)之间开辟一块共享内存区域。虚拟机里的 Looking Glass Host 服务将显卡帧缓冲区(FrameBuffer)直接拷贝到这块内存中,宿主机的 Client 端再以极高的速度读取并渲染出来。

这种方式绕过了任何网络协议栈与视频压缩编码,延迟通常在 2ms 左右,几乎等同于原生物理显示。

下面是实现这一方案的完整配置流程。


准备工作

在开始之前,请确保你已经满足以下前置条件:

  1. 宿主机已成功配置 GPU 直通(Passthrough),且 Windows 虚拟机(Guest)已经能够通过直通的显卡正常输出信号。
  2. 虚拟机中已连接了一个物理显示器或HDMI/DP 虚拟显示插头(欺骗器)。因为显卡必须有物理输出目标,才会正常初始化并渲染帧。
  3. 宿主机与虚拟机的 Looking Glass 软件版本必须严格一致(例如同为 B6 版本)。

第一步:计算并创建宿主机共享内存(IVSHMEM)

Looking Glass 需要在宿主机的 /dev/shm(共享内存空间)中申请一块特定大小的区域。这个区域的大小取决于你的目标分辨率。

1. 计算内存大小

计算公式如下:
宽度 × 高度 × 4 × 2 字节,然后转换为兆字节(MB),并向上取整到最接近的 2 的幂次方(16, 32, 64, 128, 256...)。

常见的配置推荐:

  • 1080p (1920x1080):1920 * 1080 * 4 * 2 = 16,588,800 字节 ≈ 15.82 MB -> 分配 32 MB
  • 2K (2560x1440):2560 * 1440 * 4 * 2 = 29,491,200 字节 ≈ 28.12 MB -> 分配 32 MB(建议给 64 MB 留余裕)
  • 4K (3840x2160):3840 * 2160 * 4 * 2 = 66,355,200 字节 ≈ 63.28 MB -> 分配 128 MB

2. 配置 Systemd 临时文件管理(持久化权限)

因为 /dev/shm 属于内存文件系统,每次宿主机重启后其内容和权限都会丢失。我们需要使用 tmpfiles.d 来自动创建并授权。

在宿主机上创建配置文件:

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

写入以下内容(注意:将 your_username 替换为你登录宿主机的实际用户名):

# Type Path Mode UID GID Age Argument
f /dev/shm/looking-glass 0660 your_username kvm -

保存后,立即应用此配置:

sudo systemd-tmpfiles --create /etc/tmpfiles.d/looking-glass.conf

检查是否创建成功及权限是否正确:

ls -l /dev/shm/looking-glass

输出应类似于:
-rw-rw---- 1 your_username kvm 0 10月 24 12:00 /dev/shm/looking-glass


第二步:配置虚拟机 XML 选项(Libvirt)

我们需要编辑虚拟机的 XML 配置文件,将刚刚创建的共享内存挂载进虚拟机,并配置 Spice 协议以实现无缝的鼠标键盘对齐与剪贴板共享。

1. 编辑虚拟机配置

在终端执行(win10 替换为你的虚拟机名称):

virsh edit win10

2. 添加 ivshmem 共享内存设备

<devices> 标签内,添加以下配置(大小必须与前面计算的保持一致,这里以 64MB 为例):

<shmem name='looking-glass'>
  <model type='ivshmem-plain'/>
  <size unit='M'>64</size>
</shmem>

3. 配置 Spice 输入辅助

为了让鼠标在宿主机和虚拟机画面之间移动时能够自动捕获/释放,且无缝对齐,需要启用 Spice 代理。

<devices> 标签内找到或添加以下设备:

<!-- 启用 Spice 协议支持 -->
<graphics type='spice' autoport='yes'>
  <listen type='address'/>
  <image compression='off'/>
</graphics>

<!-- 键盘鼠标重定向 -->
<input type='tablet' bus='usb'/>

<!-- 启用通道用于 guest agent 通信 -->
<channel type='spicevmc'>
  <target type='virtio' name='com.redhat.spice.0'/>
  <address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>

(注意:如果你不希望在屏幕上看到虚拟显卡的冗余输出,保留 <video> 节点并将其类型设为 none,只保留直通的 PCIe 显卡作为主显示设备。)

保存并退出 XML 编辑器。


第三步:配置虚拟机内部(Guest 侧)

现在启动你的 Windows 虚拟机。此时你仍然需要通过第二屏幕(或临时通过物理切换输入源)登录到 Windows 中进行配置。

1. 安装 IVSHMEM 驱动

打开设备管理器,你会在“系统设备”或“其他设备”下看到一个带有黄色感叹号的设备,名称通常为 PCI 标准 RAM 控制器

  1. 下载最新的 Red Hat VirtIO Drivers (ISO) 并挂载到虚拟机中。
  2. 在该黄色感叹号设备上右键,选择“更新驱动程序”。
  3. 选择“浏览我的电脑以查找驱动程序”,指向 VirtIO 驱动光盘中的 IVSHMEM\w10\amd64 目录。
  4. 安装完成后,设备名称会变为 IVSHMEM Device

2. 安装并运行 Looking Glass Host

  1. Looking Glass 官网下载页面 下载与你客户端匹配的 Windows Host 应用程序(例如 looking-glass-host.exe)。
  2. 在虚拟机中运行该安装包。安装完成后,它会在系统服务中注册并自动运行。
  3. 状态栏会显示 Looking Glass 的图标,如果是绿色的,说明运行正常,正在等待客户端连接。

3. 安装 VirtIO Guest Tool (可选但推荐)

为了让鼠标在 Looking Glass 窗口里定位精准不漂移,运行 VirtIO 驱动光盘中的 virtio-win-guest-tools.exe,安装 Spice Agent,保证虚拟机内外的鼠标无缝切换。


第四步:宿主机编译与运行客户端(Host 侧)

回到 Linux 宿主机。我们将获取并启动 Looking Glass Client。

1. 简易安装方式(Arch/Ubuntu 等)

目前大多数主流发行版在其社区源或官方源中已经集成了 Looking Glass 客户端。

  • Arch Linux (AUR):
    yay -S looking-glass-git # 或 looking-glass
    
  • Fedora:
    sudo dnf copr enable rany/looking-glass
    sudo dnf install looking-glass-client
    

2. 手动编译(如果你需要特定版本或追求极致性能)

如果源内的版本与你 Windows 里运行的 Host 版本不匹配,你需要自己编译:

安装编译依赖(以 Ubuntu/Debian 为例):

sudo apt install cmake binutils-dev libsdl2-dev libsdl2-ttf-dev libspice-client-glib-2.0-dev libpixman-1-dev libglu1-mesa-dev libx11-dev libxss-dev libxkbcommon-dev libegl1-mesa-dev libwayland-dev

获取源码并编译:

git clone --recursive https://github.com/gnif/LookingGlass.git
cd LookingGlass
mkdir build
cd build
cmake ../
make -j$(nproc)

编译产物 looking-glass-client 会生成在 client 目录下。

3. 运行客户端

运行命令非常简单:

looking-glass-client

如果你的配置正确,一个流畅度极高、延迟极低的 Windows 虚拟机画面窗口会瞬间呈现在你的 Linux 桌面上!


进阶配置与体验优化

为了达到最完美的日常使用状态,建议进行以下微调:

1. 鼠标定位漂移修复

如果发现鼠标移入 Looking Glass 窗口后定位不准、有双指针或者严重漂移,请在运行时加入 -m 键(通常是 Scroll Lock 键)来捕获鼠标:

looking-glass-client -m 125

(提示:125 是默认的 Scroll Lock 键扫码值,按该键可以让鼠标完全接管虚拟机。你也可以通过配置文件更改此热键。)

2. 宿主机配置文件

频繁输入命令行参数比较繁琐,你可以在宿主机创建配置文件 ~/.config/looking-glass/client.ini

[app]
# 开启帧率显示 (可选)
showFPS=true

[win]
# 默认无边框窗口启动
borderless=false
# 启动时保持全屏
# fullscreen=true

[input]
# 捕获鼠标的快捷键配置 (默认为 ScrollLock)
escapeKey=KEY_SCROLLLOCK

3. 低延迟音频回传

Looking Glass 本身不处理音频。想要音频也实现极低延迟的回传,最完美方案是使用 PipeWire
在虚拟机的 XML 配置文件中添加一个虚拟音频设备:

<sound model='ich9'>
  <audio id='1'/>
</sound>
<audio id='1' type='pipewire'/>

这样虚拟机的声音会通过 Libvirt 直接送入宿主机的 PipeWire 混音器中,同样达到接近零延迟的听觉体验。

通过这一整套配置,你的 KVM 虚拟机已经可以像一个原生 Linux 应用一样,以高帧率、无延迟的姿态完美融入你的工作流了。无论是高强度的 3D 游戏还是专业图形工作,Looking Glass 都能提供最极致的画质与响应性能。

点评评价

captcha
健康