
Задаю этот вопрос коллеге после довольно долгого исследования. Он хочет подключиться к старому серверу Centos 4 через ssh -X
(или -Y
) и запустить там какое-нибудь приложение X. Раньше оно работало нормально в течение многих лет, но недавние обновления (как на 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
не заметив ничего необычного. Что я могу попробовать диагностировать дальше?
EDIT: В любой современной версии 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):
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
Ничего из этого не работает.
решение1
Рабочая станция Linux
Как ни странно, многие версииGDM не предлагаютспособ передачи аргументов, как +iglx
в Xorg
. В ответ на это, новые версии X.org имеютIndirectGLX
вариант(смотрите такжепример xorg.conf
текста).
При отсутствии такой возможности существует обходной путьоборачивая 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
Рабочая станция macOS (XQuartz)
Просто беги
defaults write org.macosforge.xquartz.X11 enable_iglx -bool true
и перезапустите XQuartz, если он запущен. (Остерегайтесь опечаток: проверка на ошибки в именах доменов и переменных не выполняется.) В последних версиях используется более простой org.xquartz.X11
.