
我建立了一個 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 位元)”,這是一個軟體 OpenGL 渲染器。
那麼,為什麼 ssh 會將 virgl OpenGL 渲染器改回 llvmpipe 軟體渲染器呢?有什麼方法可以將原始的“virgl”OpenGL 渲染器保留在 ssh 會話中,正如我在 Qemu 視窗中看到的那樣?
答案1
輸出顯示 OpenGL 渲染器是「virgl」。但是,如果我使用 -X 選項 ssh 進入 guest Ubuntu 並輸入 glxinfo -B,則輸出顯示 OpenGL 渲染器是“llvmpipe(LLVM 13.0.0,128 位元)”,這是軟體 OpenGL 渲染器。
那麼,為什麼 ssh 會將 virgl OpenGL 渲染器改回 llvmpipe 軟體渲染器呢?有什麼方法可以將原始的“virgl”OpenGL 渲染器保留在 ssh 會話中,正如我在 Qemu 視窗中看到的那樣?
因為該-X
選項使 glxinfo 與主人的X 伺服器,而不是訪客的。由於 GLX 是“GL over X11”,這意味著 glxinfo 將顯示主機 Xorg 可用的功能 – 受限於它正在通訊的事實透過網絡,因此無法直接存取 SHM 或 DRI。 (例如,現代 X11 程式很大程度上依賴能夠透過 MIT-SHM 直接與 X 伺服器交換點陣圖。)
如果你想使用訪客的X伺服器,不使用-X
也不-Y
而是定義DISPLAY
(也可能XAUTHORITY
)指向已在來賓內部運行的 X 伺服器。
(最常見的是顯示:0,但 Xauth 路徑可能會更改,因此您確實應該通過來賓中的“本地”終端檢查 DISPLAY 和 XAUTHORITY 值。在最近的版本中,您可能還可以在中找到此資訊systemctl --user show-environment
-這是一個可靠的資訊來源。
但是,如果您想使用來賓的虛擬 GPU,同時仍透過 SSH 在主機上顯示 X 窗口,我懷疑您可能無法使用 GLX,但可能需要基於 EGL 的軟體(看看是否eglinfo
能夠存取 virgl GPU)。
或在來賓上運行應用程序,但透過 VNC (x0vncserver) 或透過 Qemu 的 SPICE 遠端協定(可以像 VNC/RDP 一樣透過網路使用)來控制它們。