Fluxo sem cabeçote remoto da GUI do Linux: X diz “Nenhum protocolo especificado” antes do login

1

O objetivo:

Eu quero transmitir vídeo (ou seja, Twitch) da saída gráfica de um programa em Java que estou executando em uma caixa Linux sem cabeça. Eu também quero ser capaz de iniciar isso remotamente e sem um monitor conectado, por exemplo, então eu posso fazer um sudo reboot sobre SSH e depois iniciá-lo novamente usando o SSH após a reinicialização.

Eu fiz progressos substanciais, e a primeira parte essencialmente funciona. Neste ponto, no entanto, está ficando muito profundo no Linux para que eu tenha um modelo mental útil de todas as peças, então eu gostaria de receber alguns conselhos sobre o que tentar em seguida. Parece-me que o problema está em algum lugar em torno do processo de login e / ou do gerenciador de login e como ele se relaciona com o servidor X, e talvez as distinções entre o usuário do console e os usuários virtuais.

O problema:

  • Se eu conectar a máquina a um monitor e teclado e efetuar login, a transmissão funcionará conforme o esperado. Eu posso iniciar o aplicativo e o fluxo através do SSH executando (em sessões de tela diferentes):

    DISPLAY=:0 ./gradlew viz
    DISPLAY=:0 obs --startstreaming
    
  • No entanto, se eu não fizer login, esses aplicativos falharão, juntamente com o glxinfo.

Se eu executar DISPLAY=:0 glxinfo :

No protocol specified
Error: unable to open display :0

(A primeira linha não aparece ao tentar usar uma exibição que não existe, então: 0 está lá, mas não está funcionando por algum motivo. Após o login, o glxinfo funciona como esperado.)

No programa Java, recebo:

Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        (etc.)

E obs me dá:

No protocol specified
QXcbConnection: Could not connect to display :0
Aborted (core dumped)

ps aux mostra um processo do Xorg em execução:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1227  0.1  0.2 149588 48116 tty7     Ss+  16:14   0:01 /usr/lib/xorg/Xorg :0 vt7 -nolisten tcp -auth /var/lib/xdm/authdir/authfiles/A:0-vcuAPl

Como mencionei antes, gostaria muito de evitar as etapas de rotina em que preciso estar no local físico do computador, como digitar em um teclado anexado a ele.

Detalhes sobre minha configuração atual:

  • Estou trabalhando com uma máquina física, não com uma VM. Está executando o Ubuntu Server 16.04.
  • A finalidade principal da caixa é executar este programa e alguns outros programas que escrevi. Estou disposto a mudar significativamente o software instalado para que isso funcione, se necessário. Reinstalar ou substituir o sistema operacional é uma opção, ainda que irritante.
  • Estou usando o OBS Studio para Linux para fazer o streaming. Ele adicionou recentemente um argumento de linha de comando --startstreaming, portanto, depois de configurar o fluxo uma vez com um monitor conectado, posso iniciar o fluxo remotamente sempre que quiser.
  • O
  • OBS Studio no Linux requer suporte para OpenGL 3.2, então eu adaptei uma GeForce 9500 GT para o computador. Isso suporta a versão necessária do OpenGL, desde que eu esteja usando os drivers proprietários da NVidia ('nvidia-current').
  • Eu também tenho que ter um servidor X em execução, ao contrário de uma instalação padrão do Ubuntu Server, e eu suponho que eu também precise de um gerenciador de janelas em execução. Para este propósito, eu instalei o Xorg, o Fluxbox e o XDM, por estas páginas: link e link , embora na realidade não haja nenhum problema real em usar algo como o GNOME (ou uma instalação do Ubuntu Desktop).
  • Eu comprei um dongle HDMI "monitor falso", e parece funcionar, então não se preocupe com soluções de software para fazer o computador pensar que um monitor está conectado. (Quando eu inicio o computador com ele ou com um monitor real conectado, o ps aux mostra um processo do Xorg com display: 0; quando ele é iniciado sem nenhum anexado, o processo está ausente.)

EDIT: Resultado

Isso foi invadido por um estado mais utilizável. Tenho certeza de que existem soluções melhores por aí, mas não preciso mais de acesso físico à caixa de streaming.

Primeiro eu removi o xdm. Então eu adicionei um script que executa "startx" como parte da inicialização. O script aparentemente é executado como root, o que causa problemas de Xauthority e mensagens de erro sobre MIT-MAGIC-COOKIEs; então eu tenho o script executado startx com XAUTHORITY definido como /home/myUsername/.Xauthority . Isso requer mais uma solução alternativa; Eu tenho que sudo chown o arquivo .Xauthority de volta ao meu usuário após a inicialização (sua propriedade é definida como root). Depois disso, posso executar programas em DISPLAY: 0 como esperado.

    
por ALandau 16.05.2016 / 02:34

1 resposta

1

Eu posso recomendar a leitura das páginas wiki do ArchLinux sobre este assunto, já que ele terá muito em comum com um Ubuntu recente, agora que ambos usam o systemd. Existem muitos novos problemas introduzidos por ter permissões session , e ser capaz de executar o servidor X sem que ele seja root setuid.

Comece configurando um login automático para um VT e, em seguida, execute startx ou xinit de lá. Outras páginas para ler estão no servidor Xorg e no gerenciador de exibição e usuário systemd . Procure também a palavra-chave modo de quiosque , pois é semelhante ao que você deseja. Eu ainda não fiz nada disso, então não posso fornecer mais detalhes.

    
por 16.05.2016 / 21:47