QML 기술을 사용하여 Qt 애플리케이션을 구축 중입니다. QML은 OpenGL을 사용합니다.
빌드를 실행하는 컴퓨터는 Intel GPU가 탑재된 CentOS 6.7입니다. 저는 SSH를 통해서만 이를 사용하고 XMing(또는 때로는 VcxSrv)을 사용하여 그래픽 응용 프로그램을 엽니다.
작동하는 데 많은 어려움을 겪고 있지만 문제를 검색하고 xauth를 사용하면 이제 QML 앱을 원격으로 열 수 있습니다.
하지만
일반 사용자로 애플리케이션을 실행하면 다음과 같은 결과가 나타납니다.
KiTTY X11 proxy: Unsupported authorisation protocol QXcbConnection: Could not connect to display localhost:10.0
나는 다음과 같은 오류 메시지를 발견했습니다.지원하지 않음(에 관한 질문이 많습니다.잘못된규약)
그리고
루트에서만 열 수 있으며( sudo
여기서는 작동하지 않습니다. 필요합니다 su
) 여러 오류가 발생합니다.
현재 화면 리소스를 얻을 수 없습니다. 경고: GLX 1.3이 지원되지 않을 때 /home/user/QMLapp/app 애플리케이션이 GLX 1.3 함수 "glXCreatePbuffer"를 호출합니다! 이것은 응용 프로그램 오류입니다! QXcbConnection: XCB 오류: 170(알 수 없음), 시퀀스: 163, 리소스 ID: 90, 메이저 코드: 146(알 수 없음), 마이너 코드: 20
노트: glxinfo가 좋아 보이고 직접 렌더링이 활성화됩니다. glxgeers도 잘 작동하며 루트가 필요하지 않습니다.
첫 번째 질문: GLX를 쉽게 업그레이드할 수 있나요? 두 번째 질문: 왜 루트에서만 실행될 수 있나요?
답변1
QXcbConnection: Could not connect to display localhost:10.0
위의 오류에는 몇 가지 단서가 포함될 수 있습니다. 이는 이 사용자의 변수가 $DISPLAY
localhost:10.0으로 설정되었음을 의미합니다.
루트에 고소한 후 를 사용하여 변수를 다시 확인할 수 있습니다 echo $DISPLAY
. 그런 다음 일반 사용자에 맞게 변수 값을 변경하십시오.
올바른 값은 다음과 같을 수 있습니다.localhost:0.0
답변2
질문에서 언급한 대로 DISPLAY
값은 SSH 전달 X11 연결을 사용하고 있음을 나타냅니다. localhost:10.0
로 변경하면 DISPLAY
프로그램 :0.0
이 원격 컴퓨터에 직접 연결된 화면에 창을 표시하기를 원한다는 의미입니다. 물리적으로 가까이 있지 않으면 그다지 유용하지 않습니다.
직접 렌더링을 위해서는 GUI 응용 프로그램이 화면에 그리는 실제 GPU에 직접 액세스할 수 있어야 합니다. 물론 화면과 응용 프로그램이 동일한 호스트에 있지 않으면 불가능합니다.
이 앱은 로컬에서만 사용하도록 설계된 것 같습니다. 간접 렌더링으로 적절하게 대체되지 않으면 원격 X11 연결을 통해 사용할 수 없습니다. 직접 렌더링을 사용하려면 실제로 그림을 그리는 GPU가 응용 프로그램과 동일한 컴퓨터에 있어야 하며 별도로 연결되어서는 안 됩니다. 네트워크를 통해.
원격 X11 연결이나 장치를 사용하는 경우 Xming
OpenGL 지원 수준은 주로 장치가 지원 하는 VcXsrv
OpenGL 수준에 따라 달라집니다 . 물론 적절한 OpenGL 라이브러리도 원격 시스템에 있어야 하지만 이는 일반적으로 패키지 관리자나 응용 프로그램 설치 프로그램에 의해 처리됩니다.Xming
VcXsrv
일반 사용자로 실행할 경우 X11 전달 SSH 연결에 로그인한 사용자로 실행합니까, 아니면 로그인하고 원격 호스트에서 다른 사용자 계정으로 전환합니까?
X11 전달을 유지하면서 사용자 계정을 전환하려면 몇 가지 추가 작업이 필요합니다. 즉, DISPLAY
변수 값이 유지되는지 확인해야 할 뿐만 아니라 대상 사용자가 ~/.Xauthority 파일의 콘텐츠 소스 사용자에 액세스할 수 있는지 확인해야 합니다. ~/.Xauthority 파일을 다른 위치(예: /tmp)에 복사한 다음 XAUTHORITY
환경 변수를 사용하여 이를 가리킬 수 있습니다.
예를 들어:
<logged in to remote host as user1, with X11 forwarding>
user1$ echo $DISPLAY
localhost:10.0
user1$ cp ~/.Xauthority /tmp/user1.Xauthority
user1$ chgrp user2 /tmp/user1.Xauthority
user1$ chmod 640 /tmp/user1.Xauthority
user1$ sudo -u user2 -i
user2$ export DISPLAY=localhost:10.0
user2$ export XAUTHORITY=/tmp/user1.Xauthority
<now running a X11 GUI application should be possible>
루트는 ~/.Xauthority 파일을 포함하여 모든 사람의 파일을 읽을 수 있으므로 일반 사용자에서 루트로 전환할 때 일반적으로 이를 피할 수 있습니다. 따라서 루트에서 전환할 때 user1
수행해야 할 유일한 작업은 DISPLAY
값을 유지하고 XAUTHORITY
해당 값을 가리키는 것 입니다 /home/user1/.Xauthority
. 일부 Linux 배포판에는 일반 사용자에서 루트로 전환할 때 자동으로 이 작업을 수행하는 스크립트나 PAM 모듈이 포함되어 있습니다.