我创建了一个 Qemu VM,主机和来宾都是 Ubuntu 20.04。然后我使用命令启动 Qemu VM
qemu-system-x86_64 ubuntu-desktop.qcow2 -m 2G -smp 2 -device virtio-vga-gl -display gtk,gl=on -nic user,hostfwd=tcp::5555-:22
如果我可以打开来宾 Ubuntu 的桌面并在其终端中输入
glxinfo -B
输出显示 OpenGL 渲染器是“virgl”。-X
但是,如果我使用option 和 type SSH 进入来宾 Ubuntu glxinfo -B
,输出会显示 OpenGL 渲染器是“llvmpipe (LLVM 13.0.0, 128 bits)”,它是一个软件 OpenGL 渲染器。
那么,为什么 ssh 将 virgl OpenGL 渲染器改回 llvmpipe 软件渲染器呢?正如我在 Qemu 窗口中看到的那样,有什么方法可以将原始的“virgl”OpenGL 渲染器保留在 ssh 会话中?
因为该
-X
选项使 glxinfo 与主机的X 服务器而不是来宾的 X 服务器通信。由于 GLX 是“GL over X11”,这意味着 glxinfo 将显示主机 Xorg 提供的功能——受限于它通过网络进行通信的事实,因此没有直接的 SHM 或 DRI 访问。(例如,现代 X11 程序在很大程度上依赖于能够通过 MIT-SHM 直接与 X 服务器交换位图。)如果您想使用来宾的 X 服务器,请不要使用
-X
nor-Y
而是定义DISPLAY
(并且可能还定义XAUTHORITY
)指向已在来宾内部运行的 X 服务器。(通常是 display :0,但 Xauth 路径可能会改变,所以你真的应该通过来宾中的“本地”终端检查 DISPLAY 和 XAUTHORITY 值。在最近的版本中,你可能还会在其中找到此信息
systemctl --user show-environment
——这是可靠的资源。)但是,如果您想使用来宾的虚拟 GPU,同时仍通过 SSH 在主机上显示 X 窗口,我怀疑您可能无法使用 GLX,但可能需要基于 EGL 的软件(查看是否
eglinfo
能够访问 virgl GPU)。或者在客户机上运行应用程序,但通过 VNC (x0vncserver) 或通过 Qemu 的 SPICE 远程协议(可以像 VNC/RDP 一样通过网络使用)来控制它们。