经过大量研究后,向同事提出这个问题。他想通过ssh -X
(或)连接到旧的 Centos 4 服务器-Y
并在那里运行一些 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
确实是客户端版本问题。在客户端恢复到早期的 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
我尝试了以下方法来重新启用间接渲染。除非我弄错了,所有这些都必须在客户端计算机上完成:
在 /etc/X11/xorg.conf 的“屏幕”或“设备”部分中添加:
选项“AllowIndirectGLXProtocol”“True”
在 /usr/bin/startx 中(或 startx 所在的任何位置):
默认服务器参数=“+iglx”
在 /usr/share/lightdm/lightdm.conf.d/50-xserver-command.conf 中更改行:
xserver 命令=X -core +iglx
在启动 KDE 之前,例如在 .kde/env/igl.sh 中
导出 LIBGL_ALWAYS_INDIRECT=1
这些都不起作用。
答案1
Linux工作站
反常的是,有很多版本GDM 不提供一种传递参数的方法,例如+iglx
to Xorg
。作为回应,新的 X.org 版本有一个IndirectGLX
选项(也可以看看示例xorg.conf
文本)。
如果没有该选项,有一个解决方法Xorg
用 shell 脚本包装自身:
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
macOS 工作站 (XQuartz)
赶紧跑
defaults write org.macosforge.xquartz.X11 enable_iglx -bool true
如果 XQuartz 正在运行,请重新启动它。 (注意拼写错误:没有对域和变量名称进行错误检查。)最近的版本使用更简单的org.xquartz.X11
.