かなりの調査の後、同僚にこの質問を投稿する。彼は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
それは本当にクライアントのバージョンの問題です。クライアント側で以前の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のセクション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をエクスポート
それらのどれも動作しません。
逆に、多くのバージョンの GDMは提供していません+iglx
のような引数をXorg
に渡す方法です。それに応じて、新しいX.orgバージョンには IndirectGLX
オプション があります( example xorg.conf
text も参照)。
そのオプションがない場合は、回避策として 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
とにかく走れ
defaults write org.macosforge.xquartz.X11 enable_iglx -bool true
xQuartzが実行されている場合は再起動します。 (タイプミスに注意:ドメイン名と変数名のエラーチェックはありません。)