HOOOS

Looking Glass 提示 ivshmem 协议版本不匹配或客户端闪退?排查与修复指南

0 15 孤单的网线 显卡直通KVM 虚拟机
Apple

在搞 KVM 显卡直通(VFIO)的折腾党里,Looking Glass 绝对是提升体验的神器。但只要你升级过系统、更新过软件包,或者刚开始配置,大概率会遇到两个最让人崩溃的坑:ivshmem 协议版本不匹配(Protocol version mismatch) 以及 客户端启动直接闪退

这两个问题本质上都是由于主机(Linux Host)、虚拟机(Windows Guest)和共享内存(shm)三者之间的信息不对等导致的。

下面我们不废话,直接进入保姆级的排查和解决流程。


一、 核心痛点:协议版本不匹配(Protocol version mismatch)

当你运行 looking-glass-client 时,终端报错类似:

Remote protocol version (e.g. 17) does not match local protocol version (e.g. 16)

1. 为什么会这样?

Looking Glass 的架构分为两部分:

  • Host 客户端:运行在你的 Linux 宿主机上(负责渲染画面)。
  • Guest 服务端:运行在 Windows 虚拟机里的 looking-glass-host.exe(负责抓取画面)。

Looking Glass 升级非常频繁,且不保证向后兼容。只要两端版本差了一个小版本,其定义的共享内存协议格式(ivshmem)就会发生变化,导致直接拒绝连接。

2. 彻底解决方法:版本对齐

千万不要在 Windows 里用着旧版的安装包,却在 Linux 上用包管理器(如 AUR、Apt)直接更新 client。

  • 步骤 1:确认 Linux 端的版本
    在 Linux 终端运行:

    looking-glass-client -V
    

    记下输出的版本号(例如 B6B7-rc1 或某个特定的 Git commit 节点)。

  • 步骤 2:下载并安装完全一致的 Windows 端
    前往 Looking Glass 官网的 Downloads 页面

    • 如果你在 Linux 上使用的是稳定版(如 B6),请在 Windows 中也下载安装对应的 B6 Windows Host Installer
    • 如果你在 Linux 上用的是编译版(Master 分支),你必须在 Windows 中也使用对应编译节点的 looking-glass-host.exe
    • 提示:如果版本实在对不上,最稳妥的方法是在 Linux 端也下载对应发布版本的源码手动编译。

二、 核心痛点:客户端启动闪退(Crash)

如果运行客户端时没有任何明显提示,或者终端一闪而过就退出了,通常是共享内存(ivshmem)配置权限的问题。按以下三个步骤逐一排查。

1. 权限问题:客户端无权读取 /dev/shm/looking-glass

这是最常见的闪退原因。QEMU 进程(通常以 qemulibvirt-qemu 用户运行)创建了共享内存文件,但你的普通 Linux 用户没有权限去读取它。

  • 排查命令:

    ls -l /dev/shm/looking-glass
    

    如果该文件的所有者是 rootkvm,且你的当前用户不在对应的组里,客户端就会闪退。

  • 临时解决:

    sudo chown 你的用户名:kvm /dev/shm/looking-glass
    chmod 660 /dev/shm/looking-glass
    
  • 永久解决(推荐配置 systemd-tmpfiles):
    新建文件 /etc/tmpfiles.d/looking-glass.conf,写入以下内容(将 yourusername 替换为你的 Linux 登录用户名):

    f /dev/shm/looking-glass 0660 yourusername kvm -
    

    这样每次开机,系统都会自动为你创建好权限正确的共享内存文件。

2. 内存大小不匹配(Size Mismatch)

Looking Glass 启动时,会根据你的虚拟机分辨率和帧率计算所需的内存大小。如果你的 XML 里配置的 shmem 尺寸小于实际所需,客户端就会直接崩溃。

  • 如何计算正确的尺寸?
    公式:宽度 * 高度 * 4 * 2 字节,然后向上取整到最近的 2 的幂次方。

    • 1080p (1920x1080): 1920 * 1080 * 4 * 2 = 16.58 MB -> 需分配 32MB
    • 2K (2560x1440): 2560 * 1440 * 4 * 2 = 29.49 MB -> 需分配 64MB
    • 4K (3840x2160): 3840 * 2160 * 4 * 2 = 66.35 MB -> 需分配 128MB (高刷/HDR 建议分 256MB)
  • 修改 XML 配置:
    使用 virsh edit 你的虚拟机名,找到 <devices> 标签,确保 shmem 配置正确。例如 2K 分辨率:

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

    注意:修改 XML 后,必须**完全关闭虚拟机(Shut Down)**再启动,热重启(Reboot)可能不会生效。同时,记得在 Linux 端删掉旧的 shm 文件让其重建:

    rm /dev/shm/looking-glass
    

3. Windows 端 IVSHMEM 驱动未正确安装

在 Windows 虚拟机里,打开“设备管理器”。

  • 检查“系统设备”下是否存在 "IVSHMEM Device"
  • 如果它显示为黄色感叹号(未知设备),或者使用的是微软默认的驱动,Looking Glass 就会闪退。
  • 解决方法
    1. 下载最新的 VirtIO Win ISO 驱动镜像
    2. 在设备管理器中右键该设备 -> 更新驱动程序 -> 浏览计算机以查找驱动,定位到 VirtIO 镜像中的 IVSHMEM 文件夹(选择对应的 Win10/Win11 目录)进行安装。

三、 终极排查工作流

如果上面方法都试了还是闪退,请按以下顺序抓取日志:

  1. 在 Linux 终端带参数启动客户端:

    looking-glass-client -d -v
    

    -d 开启调试模式,-v 输出详细日志。仔细观察最后几行停在什么地方。

    • 如果提示 Failed to map memory -> 绝对是 /dev/shm 权限或大小问题。
    • 如果提示 Scream initialization failed -> 尝试暂时禁用音频,在启动命令后加上 -a n
  2. 查看 Windows 端日志:
    打开 Windows 虚拟机内的 C:\Users\你的用户名\AppData\Local\LookingGlass\looking-glass-host.txt(路径可能因版本而异,或直接在控制面板查看 Looking Glass 服务日志),确认抓取端(DXGI 或 NvFBC)是否正常初始化。

只要保持**“版本绝对一致”“权限配置正确”“内存宁大勿小”**这三条铁律,Looking Glass 基本上都能完美秒开。

点评评价

captcha
健康