VirtualGL

2018/11 02 16:11

VirtualGL

VirtualGL将应用程序的OpenGL / GLX命令重定向到单独的X服务器(可以访问3D图形卡),捕获渲染的图像,然后将它们流式传输到实际处理应用程序的X服务器。

主要用例是为远程桌面设置启用服务器端硬件加速3D渲染,其中处理应用程序的X服务器位于网络的另一端(在X11转发的情况下),或者无法访问图形硬件的“虚拟”X服务器(在VNC的情况下)

安装和设置

探戈 - 视图 -  fullscreen.png本文或部分需要扩展。探戈 - 视图 -  fullscreen.png

原因: 请使用模板的第一个参数提供简要说明。(在讨论中讨论:VirtualGL#移动到主命名空间并展开

使用pacman安装virtualgl软件包,然后按照此处的说明进行配置。在arch上,/ opt / VirtualGL / bin / vglserver_config只是vglserver_config,而/ opt / VirtualGL / bin / glxinfo是vglxinfo。

使用VirtualGL和X11转发

探戈 - 视图 -  fullscreen.png本文或部分需要扩展。探戈 - 视图 -  fullscreen.png

原因: 请使用模板的第一个参数提供简要说明。(在Talk讨论:VirtualGL#
  服务器:客户端:

 ·························································································· ·····

 :┌──────────X11命令::┌───────────:

 :│application│━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ :

 :││┌───────────::││:

 :│││X服务器1)│::├┈┈┈┈┈┈┈┈┈╮│:

 :│╭┈┈┈┈┈┈┈┈┈┤OpenGL│╭┈┈┈┈┈┈┈┈┈┤:图像流:│VirtualGL┊│:

 :│┊VirtualGL│━━━━━━━━〓│┊VirtualGL│━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 :└─┴───────────────────────────────────:

 ·························································································· ·····
  1. “3D”渲染发生在这里
  2. “2D”渲染发生在这里

与使用带有VNC的VirtualGL相比,此设置的优点:

  • 无缝的窗户
  • 在服务器端使用少一点的CPU资源
  • 支持立体渲染(使用“3D眼镜”查看)

说明

1.准备

除了如上所述在远程服务器上设置VirtualGL 之外,此使用方案还要求您:

  • 同时在客户端安装virtualgl(但不需要像在服务器端那样设置它,我们只需要这个vglconnectvglclient二进制文件)
  • 使用X11转发 设置SSH (确认通过ssh -X user@server并在生成的shell中运行GUI应用程序从客户端连接到服务器)

2.连接

现在,vglconnect只要您想连接到服务器,就可以在客户端计算机上使用:

$ vglconnect user @ server      #X11流量加密,VGL图像流未加密
$ vglconnect -s user @ server   #加密X11流量和VGL图像流

这将打开与X11转发的SSH会话ssh -X,并且还会自动启动vglclient具有正确参数的VirtualGL Client()作为后台守护程序。该守护进程将处理来自服务器的传入VirtualGL图像流,即使在关闭SSH shell后也将继续在后台运行 - 您可以使用它来停止它vglclient -kill

3.运行应用程序

连接后,您可以运行为其OpenGL部件启用VirtualGL渲染的远程应用程序,方法是在SSH shell中启动它们,vglrun如下面的“ 运行应用程序”中所述。

您不需要将自己限制vglconnect为为您打开的shell ; 从客户端上的同一个X会话打开到同一个用户 @ 服务器的任何ssh -Xssh -Yshell 应该可以工作。将检测到您是否在SSH shell中,并确保VGL图像流通过网络发送到属于SSH客户端的IP /主机名(正在运行的实例将拦截并处理它)。 vglrunvglclient

将VirtualGL与VNC配合使用

探戈 - 视图 -  fullscreen.png本文或部分需要扩展。探戈 - 视图 -  fullscreen.png

原因: 请使用模板的第一个参数提供简要说明。(在Talk讨论:VirtualGL#
  服务器:客户端:

 ·················································· ······························

 :┌──────────X11命令┌────────────:图像流:┌──────────:

 :│application│━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━VNC服务器2)│━━━━━━━━━━━━━━━━━━━━━━━━━ ▶│VNC查看器│:

 :││┌─────────────────────────────────────────────────────────────────────────────────────────

 :│││X服务器1)│▲:::

 :│╭┈┈┈┈┈┈┈┈┈┤OpenGL│╭┈┈┈┈┈┈┈┈┈┤图像┃:::

 :│┊VirtualGL│━━━━━━━━〓│┊VirtualGL│━━━━━━━━━:::

 :└─┴─────────────────────:

 ·················································· ······························
  1. “3D”渲染发生在这里
  2. “2D”渲染发生在这里

与使用带有X11转发的VirtualGL相比,此设置的优点:

  • 在低带宽/高延迟网络的情况下,可以保持更好的性能
  • 可以将相同的图像流发送到多个客户端(“桌面共享”)
  • 即使网络连接中断,远程应用程序也可以继续运行
  • 更好地支持非Linux客户端,因为该体系结构不依赖于客户端X服务器

说明

在远程服务器上设置VirtualGL后如上所述,建立使用工作远程桌面连接VNC客户端/服务器您所选择的实现,应该不需要进一步的配置。

在VNC会话内部(例如,在VNC桌面内的终端仿真器中,甚至直接在其中~/.vnc/xstartup),只需运行选定的应用程序,vglrun如下面的运行应用程序中所述。

您还可以运行整个会话vglrun,以便所有opengl应用程序默认工作。例如,如果你使用XFCE,您可以运行vglrun startxfce4,而不是startxfce4在你的X启动脚本(~/.vnc/xstartup.xinitrc或同等学历),或复制,如果您使用的是显示管理器编辑在/ usr /共享/ xsessions一个.desktop文件。

选择合适的VNC包

VirtualGL可以为任何通用vncserver实现提供3D渲染(例如TightVNC,RealVNC,......)。

但是,如果您希望真正获得良好的性能(例如,使其可以观看视频或通过VNC播放OpenGL游戏),您可能希望使用针对此用例专门优化的VNC实现之一:

  • turbovnc AUR:由与VirtualGL相同的团队开发,其明确目标是提供与其结合的最佳性能。但是,它的vncserver实现不支持普通Xorg服务器提供的所有功能,因此某些应用程序将运行异常缓慢或根本不运行。
  • TigerVNC:在开发时考虑到了VirtualGL,并通过它实现了良好的性能,同时提供了比TurboVNC更好的Xorg兼容性。

运行应用程序

使用VirtualGL支持设置远程桌面连接后,可以使用vglrunVirtualGL加速渲染其OpenGL部件来运行所选应用程序:


$ vglrun glxgears

这必须在远程计算机上执行(运行应用程序的地方),即在SSH或VNC会话中。将使用的X服务器由以下两个环境变量确定:

DISPLAY 将处理应用程序并呈现其非OpenGL部分的X服务器。如果使用VNC,则指的是VNC服务器。在SSH转发的情况下,它是远程计算机上的一个虚拟X服务器号,SSH内部映射到客户端上的真实X服务器。没有关于此变量的特定于VirtualGL的内容,并且它已在SSH或VNC会话中设置为正确的值。
VGL_DISPLAY VirtualGL应该重定向OpenGL呈现的X服务器。请参阅上面的安装和设置。如果未设置,:0.0则假定该值。请注意,点后面的数字可用于选择图形卡。

可以使用更多环境变量和命令行参数进行微调vglrun- 请参阅用户手册和vglrun -help参考。VirtualGL的行为还取决于它的两种主要操作模式中的哪一种是活动的(vglrun它将根据执行它的环境自动选择):

在此模式下,渲染的OpenGL场景的压缩图像流通过自定义网络协议发送到vglclient实例。默认情况下,它使用90%质量的JPEG压缩,但这可以完全自定义,例如:
$ vglrun -q 30 -samp 4x glxgears               #使用积极压缩(减少带宽需求)
$ VGL_QUAL = 30 VGL_SUBSAMP = 4x vglrun glxgears   #与上面相同,使用环境变量
还有一个GUI对话框,允许您在应用程序启动后立即更改应用程序的最常见VirtualGL渲染/压缩选项vglrun- 只需Ctrl+Shift+F9在应用程序具有键盘焦点时按下,即可打开此对话框。
  • “ X11 Transport ” - 使用VNC时的默认值
在此模式下,VirtualGL通过普通的X11协议将原始(未压缩)图像直接提供给处理应用程序的X服务器 - 例如,在同一台机器上运行的VNC服务器。许多vglrun命令行选项(例如与图像流压缩或立体渲染有关的选项)在这里不适用,因为vglclient另一端没有运行。它现在是处理所有图像流优化/压缩的VNC服务器,因此您应该转向进行微调。
提示: vglrun实际上只是一个shell脚本(暂时)在运行请求的应用程序之前设置一些环境变量 - 最重要的是它添加了提供所有VirtualGL功能的库LD_PRELOAD。如果它更适合您的工作流程,您可以自己设置这些变量。以下命令列出了vglrun为您的特定设置设置的所有环境变量:

comm -1 -3 <(env | sort)<(vglrun env | grep -v'^ \ ['| sort)

确认VirtualGL呈现处于活动状态

如果VGL_LOGO在启动应用程序之前设置环境变量,则在该应用程序中通过VirtualGL呈现的任何OpenGL场景的右下角将显示一个小的标识“VGL”:


$ VGL_LOGO = 1 vglrun glxgears

如果应用程序运行但徽标没有出现,则表示VirtualGL无法生效(请参阅下面的#Troubleshooting),应用程序可能已经回退到软件渲染。

测量性能

许多OpenGL程序或游戏都可以显示嵌入式FPS(“每秒帧数”)计数器 - 但是当使用VirtualGL时,这些值将不会非常有用,因为它们仅测量在服务器端渲染帧的速率(通过3D) -capable X server),而不是实际最终在客户端呈现帧的速率。

用户手册的“性能测量”章节描述了如何在VirtualGL图像流水线的各个阶段测量吞吐量,以及如何识别瓶颈(特别是在使用带有X11转发的VirtualGL时)。使用VNC时,VNC客户端也应该能够告诉您它的渲染帧速率。

故障排除

提示:运行vglrun+v命令行开关(或环境变量VGL_VERBOSE=1),使VirtualGL打印出关于其试图初始化渲染问题的应用程序的一些细节。该+tr开关(或变量VGL_TRACE=1)将使得打印出大量的拦截上的OpenGL函数现场信息的实际渲染过程中调用。默认情况下,VirtualGL将其所有调试输出打印到shell - 如果要将其与应用程序自己的STDERR输出分开,则可以设置VGL_LOG=/tmp/virtualgl-$USER.log

问题:vglrun因“无法打开显示”而中止

如果vglrun退出时出现错误消息,例如......


[VGL] 错误:无法打开显示:0。

...在shell输出中,这意味着服务器端的3D服务器(应该处理OpenGL渲染)要么没有运行,要么没有正确设置用于VirtualGL(参见安装和安装程序),或未VGL_DISPLAY正确设置(请参阅运行应用程序)。如果它曾经工作但不再工作,则软件包升级可能会覆盖已修改的文件vglserver_config,因此请再次运行该脚本,然后重新启动服务器端X服务器(例如systemctl restart kdm)。

问题:vglrun似乎根本没有效果

症状:

  • 没有VirtualGL加速的3D渲染 - 程序要么中止,要么回退到软件渲染(如何检查
  • 同时,没有与shell打印的VirtualGL相关错误消息或信息

当某些东西阻止VirtualGL被预加载到应用程序的可执行文件中时,可能会发生这种情况。预加载的方式是在运行启动应用程序的命令之前vglrun将一些VirtualGL库的名称添加到LD_PRELOAD环境变量中。现在,当应用程序二进制文件作为此命令的一部分执行时,Linux内核将加载动态链接器,动态链接器将检测LD_PRELOAD变量并将指定的库链接到应用程序二进制文件的内存中副本,然后再进行其他操作。如果环境变量未传播到动态链接器,这显然不起作用,例如在以下情况中:

  • 应用程序通过显式取消设置/覆盖LD_PRELOAD的脚本启动
解决方案:编辑脚本以注释掉或修复有问题的行。(您可以将修改后的脚本放入,/usr/local/bin/以防止在下一次软件包升级时恢复它。)
  • 应用程序通过多层脚本启动,环境变量在此过程中丢失
解决方案:修改实际运行应用程序的最终脚本,使其运行应用程序vglrun
  • 应用程序通过加载器二进制文件(可能本身!)启动,其方式无法传播LD_PRELOAD
解决方案:如果可能,绕过加载器二进制文件并直接启动实际的OpenGL应用程序vglrun- 例如VirtualBox,您需要直接启动虚拟机会话,vglrun VirtualBox -startvm "Name of the VM"而不是通过VirtualBox主程序GUI启动。如果在二进制文件中显式取消设置LD_PRELOAD,则vglrun使用-ge命令行开关运行可以在某些情况下防止这种情况发生。

有关已知需要此类解决方法的一些应用程序的列表,请参阅用户手册中的“应用程序配方”部分。

问题:vglrun因ld.so错误而失败

如果VirtualGL加速的3D渲染不起作用(与上一节一样),但另外您会看到错误消息,如...

错误:ld.so:来自LD_PRELOAD的对象'libdlfaker.so'无法预加载:忽略。

错误:ld.so:LD_PRELOAD中的对象'librrfaker.so'无法预加载:忽略。

...在shell输出中,动态链接器正在接收将VirtualGL库预加载到应用程序中的指令,但有些东西阻止它成功执行此任务。三个可能的原因是:

  • 未安装用于正确体系结构的VirtualGL库
要使用VirtualGL 运行32位应用程序(如Wine),您需要从multilib存储库安装lib32-virtualgl
  • 应用程序可执行文件设置了setuid / setgid标志
您可以通过以下方式检查可执行文件的权限来确认是否是这种情况ls -l:如果设置了setuid ,它将显示s代替用户可执行位的字母(例如),如果设置了setgid,则代替组可执行位。对于这样的应用程序,任何预加载尝试都将失败,除非要预加载的库也设置了setuid标志。您可以通过以root身份执行以下操作来为相关的VirtualGL库设置此标志:-rwsr-xr-x
$ chmod u + s /usr/lib/lib{rr,dl}faker.so#,for virtualgl
 
$ chmod u + s /usr/lib32/lib{rr,dl}faker.so#for 提供的本机架构版本lib32-virtualgl提供的multilib版本
但是,在确定在安全性至关重要的服务器环境中执行此操作之前,请确保完全了解setuid的安全隐患。
  • 您可能需要指定VirtualGL库的完整路径
打开/ usr / bin / vglrun并在LD_PRELOAD变量中指定库的完整路径。例:

libvglfaker $ SUFFIX.so  - > /usr/lib/libvglfaker$SUFFIX.so

问题:vglrun因ERROR而失败:无法连接到VGL客户端。

如果您的“客户端”程序与virtualGL在同一服务器上运行(例如,如果您使用的是虚拟化的VNC),请尝试使用vglrun -c proxy

问题:关于/ etc / opt / VirtualGL / vgl_xauth_key的错误消息不存在

这意味着vglgenkey要么没有为您的virtualGL X服务器运行,要么它正由另一个X服务器再次运行。对我来说,lightdm运行vglgenkey在错误的(vnc远程)X服务器上,因为vglserver_config添加了以下内容:

/etc/lightdm/lightdm.conf
...
[座位:*] 

显示设置脚本=的/ usr /斌/ vglgenkey

将其更改为

/etc/lightdm/lightdm.conf
...
[座:seat0] 

显示设置脚本=的/ usr /斌/ vglgenkey

所以它只在第一台X服务器上运行解决了我的问题。

问题:vglrun失败并出现错误:VirtualGL尝试加载真正的glXCreatePbuffer函数并改为伪造函数。

这意味着VirtualGL正在尝试从错误的库加载函数。您可以通过设置LD_PRELOAD库的路径来指定要使用的OpenGL 库。/usr/lib/libGL.so似乎适用于64位应用程序。请记住,32位应用程序(如Steam或Wine)将需要32位OpenGL。如果需要同时使用32位和64位库,则可以使用它们加载它们LD_PRELOAD="/path/to/libGL.so /path/to/lib32/libGL.so"

问题:渲染故障,异常糟糕的性能或应用程序错误

OpenGL具有非常低级且灵活的API,这意味着不同的OpenGL应用程序可能会提供非常不同的渲染技术。VirtualGL关于如何重定向渲染以及如何/何时捕获新帧的默认策略适用于大多数交互式3D程序,但对于某些应用程序可能效率低下甚至存在问题。如果您怀疑可能出现这种情况,可以在启动应用程序之前通过设置某些环境变量来调整VirtualGL的操作模式vglrun。例如,您可以尝试设置以下某些值(一次尝试一个,并注意每个值也会使事情变得更糟!)

VGL_ALLOWINDIRECT = 1

VGL_FORCEALPHA = 1

VGL_GLFLUSHTRIGGER = 0

VGL_READBACK = PBO

VGL_SPOILLAST = 0

VGL_SYNC = 1#使用VNC和X11转发非常慢

一些OpenGL应用程序也对其X服务器环境或加载的库做出了强有力的假设,这些假设可能无法通过VirtualGL设置来实现 - 从而导致这些应用程序失败。环境变量VGL_DEFAULTFBCONFIGVGL_GLLIBVGL_TRAPX11VGL_X11LIBVGL_XVENDOR可用于在某些情况下解决这一问题。

有关所有支持的环境变量的正确说明,请参阅用户手册中的“高级配置”部分;有关已知需要调整以适应VirtualGL的某些特定应用程序的信息,请参阅“应用程序配方”部分。

也可以看看

--转载请注明: http://91o.cc/virtualgl/

作者 - 分类 未分类

发表回复

(必填)