在搞定 KVM 显卡直通(VFIO)后,很多人面临的下一个痛点就是显示输出。
传统的物理双线接单显示器需要频繁切换信号源,而使用物理采集卡又存在额外的延迟和成本。RDP 或 VNC 这类网络串流方案对于游戏或高刷场景来说,高压缩率带来的画质损失和输入延迟更是无法接受。
Looking Glass 彻底解决了这个问题。它利用 KVM 的 ivshmem(VM 间共享内存)技术,直接在宿主机(Host)与虚拟机(Guest)之间开辟一块共享内存区域。虚拟机里的 Looking Glass Host 服务将显卡帧缓冲区(FrameBuffer)直接拷贝到这块内存中,宿主机的 Client 端再以极高的速度读取并渲染出来。
这种方式绕过了任何网络协议栈与视频压缩编码,延迟通常在 2ms 左右,几乎等同于原生物理显示。
下面是实现这一方案的完整配置流程。
准备工作
在开始之前,请确保你已经满足以下前置条件:
- 宿主机已成功配置 GPU 直通(Passthrough),且 Windows 虚拟机(Guest)已经能够通过直通的显卡正常输出信号。
- 虚拟机中已连接了一个物理显示器或HDMI/DP 虚拟显示插头(欺骗器)。因为显卡必须有物理输出目标,才会正常初始化并渲染帧。
- 宿主机与虚拟机的 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 控制器。
- 下载最新的 Red Hat VirtIO Drivers (ISO) 并挂载到虚拟机中。
- 在该黄色感叹号设备上右键,选择“更新驱动程序”。
- 选择“浏览我的电脑以查找驱动程序”,指向 VirtIO 驱动光盘中的
IVSHMEM\w10\amd64目录。 - 安装完成后,设备名称会变为 IVSHMEM Device。
2. 安装并运行 Looking Glass Host
- 从 Looking Glass 官网下载页面 下载与你客户端匹配的 Windows Host 应用程序(例如
looking-glass-host.exe)。 - 在虚拟机中运行该安装包。安装完成后,它会在系统服务中注册并自动运行。
- 状态栏会显示 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 都能提供最极致的画质与响应性能。