较新的客户端使用间接渲染的 X 转发失败

dar*_*aud 10 ssh x11 startx

经过相当多的研究,为同事发布了这个问题。他想通过ssh -X(或-Y)连接到旧的 Centos 4 服务器并在那里运行一些 X 应用程序。它曾经运行良好多年,但最近对他的客户端 PC 的更新(在 Centos 7 和 Ubuntu 上)现在使这成为不可能。他的应用程序只是挂起,试图简单地运行glxgears会导致崩溃:

X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  150 (GLX)
Minor opcode of failed request:  3 (X_GLXCreateContext)
Value in failed request:  0x0
Serial number of failed request:  19
Current serial number in output stream:  21
Run Code Online (Sandbox Code Playgroud)

确实是客户端版本问题。在客户端恢复到早期的 Centos 6 使其再次工作。服务器端的 X11 日志中没有任何内容。我跑了,strace glxgears没有注意到任何异常。我可以尝试进一步诊断什么?

编辑:在任何现代 Linux 上,以下强制间接渲染上下文的尝试将失败:

glxinfo -i
name of display: :0
X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  154 (GLX)
Minor opcode of failed request:  24 (X_GLXCreateNewContext)
Value in failed request:  0x0
Serial number of failed request:  39
Current serial number in output stream:  40
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法来重新启用间接渲染。除非我弄错了,所有这些都必须在客户端机器上完成:

  • 在 /etc/X11/xorg.conf 的 Screen 或 Device 部分中添加:

    选项“AllowIndirectGLXProtocol”“True”

  • 在 /usr/bin/startx (或 startx 所在的任何地方):

    defaultserverargs="+iglx"

  • 在 /usr/share/lightdm/lightdm.conf.d/50-xserver-command.conf 中,您更改行:

    xserver-command=X -core +iglx

  • 在启动 KDE 之前,例如在 .kde/env/igl.sh

    导出 LIBGL_ALWAYS_INDIRECT=1

这些都不起作用。

Dav*_*ing 7

Linux工作站

事与愿违,许多版本的GDM不提供一种方式来传递参数一样+iglxXorg。作为回应,新的 X.org 版本有一个IndirectGLX选项(另见示例xorg.conf文本)。

在没有该选项的情况下,有一种用 shell 脚本包装Xorg自己的解决方法:

mv /usr/bin/Xorg /usr/bin/Xorg.original
echo -e '#!/usr/bin/env bash\nexec /usr/bin/Xorg.original "$@" +iglx' > /usr/bin/Xorg
chmod +x /usr/bin/Xorg
chcon --type=bin_t /usr/bin/Xorg
Run Code Online (Sandbox Code Playgroud)

macOS 工作站 (XQuartz)

赶紧跑

defaults write org.macosforge.xquartz.X11 enable_iglx -bool true
Run Code Online (Sandbox Code Playgroud)

如果 XQuartz 正在运行,则重新启动它。(注意错别字:没有对域和变量名称进行错误检查。)