root necessário para iniciar o aplicativo X11

1

Estou criando um aplicativo Qt usando a tecnologia QML. QML usa o OpenGL.

O computador que executa a compilação é um CentOS 6.7, com GPU Intel. Estou usando apenas no SSH e uso o XMing (ou VcxSrv às vezes) para abrir aplicativos gráficos.

Eu tive vários problemas para fazer isso funcionar, mas pesquisando meus problemas e jogando com o xauth agora posso abrir remotamente meu aplicativo QML.

MAS

Ao executar meu aplicativo com um usuário normal, recebo:

KiTTY X11 proxy: Unsupported authorisation protocol QXcbConnection: Could not connect to display localhost:10.0

Percebi que a mensagem de erro dizia Não suportado (muitas perguntas sobre SO são sobre o protocolo Errado )

AND

Só posso abri-lo na raiz ( sudo não funciona aqui, preciso su ) e recebi vários erros:

failed to get the current screen resources WARNING: Application /home/user/QMLapp/app calling GLX 1.3 function "glXCreatePbuffer" when GLX 1.3 is not supported! This is an application bug! QXcbConnection: XCB error: 170 (Unknown), sequence: 163, resource id: 90, major code: 146 (Unknown), minor code: 20

Nota: O glxinfo parece bom e a renderização direta é ativada. glxgeers funciona bem também e não precisa ser root para trabalhar

Primeira pergunta : posso atualizar facilmente meu GLX? Segunda pergunta : Por que só funciona no root?

    
por MokaT 30.09.2015 / 17:00

2 respostas

0

QXcbConnection: Could not connect to display localhost:10.0

O erro acima pode conter algumas dicas. Isso significa que, para esse usuário, a variável $DISPLAY está definida como localhost: 10.0

Depois de suar para root, você pode verificar a variável novamente com echo $DISPLAY . em seguida, altere o valor da variável para o usuário normal de acordo.

O valor correto é provavelmente localhost:0.0

    
por 01.10.2015 / 11:06
0

O valor DISPLAY de localhost:10.0 indica que você está em uma conexão X11 encaminhada pelo SSH, como você afirmou na pergunta. Se você alterar o DISPLAY para :0.0 , então você está dizendo que deseja que o programa apresente suas janelas na tela que está diretamente conectada ao computador remoto ... e se você não estiver fisicamente perto disso, não vai ser muito útil.

A renderização direta exigiria que o aplicativo da GUI tivesse acesso direto à GPU real que é desenhada na sua tela ... o que é obviamente impossível quando a tela e o aplicativo não estão no mesmo host.

Parece que este aplicativo pode ser projetado para ser usado apenas localmente. Se ele não puder retornar à renderização indireta, ele não poderá ser usado em uma conexão X11 remota: a renderização direta exige que a GPU que realmente fará o desenho esteja no mesmo computador que o aplicativo e não seja separada dele por uma rede. conexão.

Se você estiver usando uma conexão X11 remota com Xming ou VcXsrv , seus níveis de suporte do OpenGL dependerão principalmente dos níveis que o Xming ou VcXsrv suportará. É claro que o computador remoto também precisa das bibliotecas apropriadas do OpenGL, mas geralmente o gerenciador de pacotes ou o instalador do aplicativo cuida disso.

Quando você o está executando como um usuário comum, você está executando como o usuário que você registrou em sua conexão SSH de encaminhamento X11, ou você mudou para outra conta de usuário no host remoto após efetuar o login?

A troca de contas de usuário, embora preservando o encaminhamento do X11, requer um pouco de esforço extra: além de garantir que o valor da variável DISPLAY seja preservado, você também deve garantir que o usuário de destino tenha acesso ao conteúdo do ~ Arquivo / .Xauthority do usuário de origem. Você pode copiar o arquivo ~ / .Xauthority para algum outro local (por exemplo, em / tmp) e, em seguida, usar a variável de ambiente XAUTHORITY para apontar para ele.

Por exemplo:

<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>

Isso pode ser evitado quando você muda de usuário para root, já que o root pode ler todos os arquivos ... incluindo o arquivo ~ / .Xauthority. Portanto, ao alternar de user1 para raiz, as únicas coisas que precisam ser feitas são manter o valor DISPLAY e o ponto XAUTHORITY to /home/user1/.Xauthority . Algumas distribuições do Linux incluem scripts ou módulos PAM que fazem isso automaticamente quando você alterna de um usuário comum para o root.

    
por 24.02.2018 / 11:39