Acesso remoto no Linux de qualidade que dá até pra jogar com aceleração 3D pra OpenGL

Olá pessoal

Resumo antes de tudo: Combinei a solução de acesso remoto ThinLinc com VirtualGL (pra conseguir aceleração 3D da máquina remota) e com Steam Link (pra conseguir controlar jogos rodando na sessão virtual remota). Vídeo em Thinlinc com VirtualGL e Steam Link: Acesso remoto decente com direito a jogos - YouTube

Meu nome é Andre e na pandemia passei uns bocados aqui em casa tentando fazer funcionar computadores aqui pra casa… Na verdade já tinha meu computador e um notebook decentes (um phenom II x6 e um i5 quarta geração que ainda funcionam bem), mas aí casei na pandemia, precisava arrumar um computador pro meu sobrinho que mora conosco e dar um jeito de melhorar o computador da minha esposa.

Infelizmente com a grana curta, me restou improvisar: um i5 quarta geração com 8GB de RAM e SSD parecia um latifúndio de desempenho perto do Centrino 2 4GB da minha esposa e de uns Raspberry Pi que tinha encostados. E aí como o Linux é multiusuário, comecei a pesquisar a melhor forma de que eles fizessem acesso remoto no i5 e assim pudessem ter uma melhor experiência. Foi nessa época que conheci o ThinLinc, ferramenta de acesso remoto que roda em máquinas Linux e possui aplicações cliente compiladas para várias plataformas, incluindo Linux Armv7 (no caso, Raspberry Pi 2 pra cima).

Já havia testado algumas coisas de acesso remoto por conta do trabalho mesmo: VNC, X2Go, ssh -X (o X-Forwarding do SSH), XRDP, X-query… Algumas delas até já me atenderam em partes, como por exemplo o VNC que me serviu uma vez quando quebrei o pé e precisava fazer manutenção no computador de casa que ficava no segundo andar e não podia ficar subindo escada e o X2Go que já havíamos usado no trabalho para que pessoas pudessem rodar aplicativos gráficos que ficam nos servidores. SSH -X serve como muito quebra galho para acessar coisas na rede local, mas tornam-se impossíveis de usar com latência pouco mais alta ou sem muita banda disponível. Ferramentas como TeamViewer, Anydesk ou MeshCentral não serviriam pois apenas espelham o que está acontecendo na máquina local, eu precisava de 3 pessoas simultaneamente dividindo a mesma máquina. E aí conheci o ThinLinc: que funcionava perfeitamente mesmo com o sinal fraco do WiFi, mantendo boa qualidade de imagem e boa responsividade, permitindo que 3 pessoas dividissem o mesmo computador com sucesso. Outra vantagem do ThinLinc é que dá até pra rodar do próprio navegador, por padrão ele abre um servidor na porta 300, onde se pode acessar uma sessão desktop completa por qualquer navegador web com HTML5, inclusive pelo tablet ou celular!

E aí como o ThinLinc padrão funciona em cima da porta SSH mesmo, sem precisar ficar abrindo portas novas no firewall e tal, comecei a brincar de fazer acesso remoto na minha máquina do serviço e vi que não tinha muita diferença para meu trabalho utilizar minha máquina de casa durante o teletrabalho ou usar um simples Raspberry Pi 2 pra acessar remotamente a máquina do trabalho. Fiz um túnel SSH pra poder chegar na minha máquina remota e com alguns ajustes na configuração do cliente (parâmetro HOST_ALIASES), pronto, era como se estivesse trabalhando localmente. Comparado com X2Go por exemplo, a qualidade de imagem é bem melhor.

E aí a única coisa que faltava era rodar jogos… faltava, pois aí um dia me apresentaram o VirtualGL, que é uma aplicação que se encarrega de passar os gráficos OpenGL para a placa de vídeo da máquina que está sendo acessada e repassar pro cliente tudo mastigadinho. Basta instalar o pacote do virtualgl presente em muitas distros ou seguir as instruções pra instalar ele que tem no site delee configurar ele com o comando vglserver_config. A partir daí, para rodar algo com aceleração 3D, basta rodar com o comando vglrun na frente. Como muita coisa no Linux é OpenGL, lá fui eu arriscar nos jogos pra ver como ficava. E rodei o teste com sucesso: aplicação glxspheres rodava com acelerada ao se executar com “vglrun glxspheres”.

Mas aí os jogos do Steam de primeira não rodaram. E aí achei esse link: Steam + VGL crashes when attempting to launch a game · Issue #25 · VirtualGL/virtualgl · GitHub - onde eles indicam que o modo como o Steam chama o jogo acaba atropelando a ordem das coisas e pulando todo efeito do VirtualGL… E aí existe uma linha a se colocar naquele “Launch Options” do jogo no Steam, com o seguinte conteúdo:

LD_PRELOAD="${LD_PRELOAD#libdlfaker.so:libvglfaker.so:}:libdlfaker.so:libvglfaker.so" %command%

E dessa forma, o VirtualGL será utilizado corretamente para o jogo. Infelizmente só funciona pra jogos que vão rodar em OpenGL, não funciona pra Vulkan por exemplo. Ainda não consegui por exemplo rodar jogos que rodam no Wine/Proton, pq eles tendem a usar o DXVK que traduz DirectX do Windows para Vulkan. Parece que tem um esquema pra fazer o Wine/Proton rodar em OpenGL, mas não testei isso muito a fundo. Mas jogos nativos que rodem em OpenGL como Left4Dead 2, ficam com desempenho bacana.

E aí explico porquê só bacana e não excelente: Descobri que jogos FPS não funcionam bem com programas de acesso remoto! Vi vídeos de pessoas rodando com várias ferramentas diferentes de acesso remoto e acabavam tendo o mesmo sintoma do mouse ficar doidão quando tentava mover ele, mesmo sintoma de quando se tenta usar como mouse uma mesa digitalizadora, acho que por conta da forma como mandam as coordenadas do mouse pra máquina remota. Outra coisa que faltou no ThinLinc é a possibilidade de repassar controles para a máquina remota.

Mas como sempre, tudo tem um jeitinho… e esse jeitinho resolveu esses problemas com maestria: Usar o Steam Link para jogar. E vocês vão perguntar: “E por que você não usou só o Steam Link logo de cara?”. A resposta é: Eu precisava que a máquina remota (tanto o notebook i5 que compartilhava aqui como minha máquina do trabalho) ficassem livres para que um usuário local pudesse sentar-se à frente delas e utilizá-las. O Steam Link funciona bem no estilo do TeamViewer, Anydesk e MeshCentral: ele só espelha o que está sendo executado na tela principal da máquina. Algumas pessoas no Linux chegaram a desenvolver um método “Steam Headless” pra poder rodar o Steam em um monitor virtual ou monitor fictício (usando um dummy plug, um conector que finge pra máquina que tem um monitor espetado na placa de vídeo) e depois elas podiam deixar o Steam rodando e acessar ele pelo Steam Link, mas isso também dependia de se deixar a sessão logada para que ele funcionasse. Com o Steam rodando dentro da sessão do ThinLinc, tudo é resolvido de modo simples: o som fica restrito na sessão virtual, o vídeo fica restrito na sessão virtual, a máquina fica liberada para outros poderem usar.

E assim, fiz um vídeo de demonstração pra vocês, espero que gostem dele. A ideia é que usem o ThinLinc pra iniciar uma sessão remota e se quiserem jogar, utilizem como cliente uma máquina com o Steam Link (computador ou Raspberry Pi 3 pra cima ou outro), pra poder ter boa qualidade no seu jogo e acesso a controles e tudo mais.

Nesse vídeo (que está o link lá no resumo do começo) demonstro o Thinlinc combinado com VirtualGL que permite aceleração por hardware na placa de vídeo da máquina remota para aplicações OpenGL.

Para contornar problemas no comando de alguns jogos, suporte a controle e melhorar a taxa de quadros do monitor, utilizei o Steam Link para acessar o Steam rodando na sessão remota.

Thinlinc é gratuito para até 5 acessos simultâneos, utilizado muito em universidades do mundo todo que precisam fornecer acesso a computadores compartilhados ou empresas que precisam centralizar seus usuários em um único computador. É baseado em projetos código aberto como TigerVNC e noVNC. A empresa que criou o ThinLinc é a mantenedora do TigerVNC e do noVNC

O VirtualGL é FOSS (gratuito e código aberto) e permite que gráficos OpenGL sejam renderizados no hardware da máquina remota antes de serem enviados para a máquina cliente.

Steam Link é parte do Steam, serve para poder acessar remotamente seu computador rodando Steam. A desvantagem dele sozinho é que ele apenas espelha o que é renderizado na máquina remota. Com ajuda do ThinLinc, essa imagem ficará restrita em um monitor virtual que só será visto através da sessão remota do ThinLinc, deixando a máquina remota livre para que outras pessoas possam acessá-la localmente ou até mesmo utilizando outros métodos de acesso remoto, como o próprio ThinLinc.

Referências Importantes pra vocês procurarem:

Tenho um vídeo pra comparar X2Go com ThinLinc e SSH -X lá no meu canal. Está em inglês pois compartilhei no Reddit uns tempos atrás.

ThinLinc - Software de acesso remoto baseado em softwares FOSS, gratuito para até 5 usuários conectados simultaneamente.

VirtualGL - Faz o repasse do vídeo acelerado em hardware para o cliente de acesso remoto. Tem o pacote nas distros mais comuns, é necessário configurar da primeira vez com o comando vglserver_config (como root)

Steam Link - Ferramenta da Valve para poder acessar seu Steam rodando remotamente, voltado para jogos.

Gambiarra para Steam rodar jogos no VirtualGL é o issue 25 no github do VirtualGL. Adicionar nas opções de inicialização do jogo a linha abaixo:

LD_PRELOAD="${LD_PRELOAD#libdlfaker.so:libvglfaker.so:}:libdlfaker.so:libvglfaker.so" %command%

FAQ:
Posso rodar qualquer jogo?
Por enquanto só jogos OpenGL

Meu jogo não roda!
Se for OpenGL, você editou as opções de inicialização do jogo no Steam? Seu VirtualGL tá configurado?

O vglrun diz que não é possível acessar o display!
Veja no comando “vglxinfo | head” qual o display você está e exporte para a variável DISPLAY com algo do tipo: export DISPLAY=:10 (supondo que o vglxinfo indique que o display é :10

Steam Link já funciona como acesso remoto!
É, mas você viu que a qualidade da imagem dele é otimizada pra ter fluidez, não melhor qualidade. E a imagem é um espelho do que está passando na tela do computador, se você deixar o Steam logado numa sessão de um monitor físico, o som e o vídeo vão aparecer nessa tela e qualquer pessoa em frente à máquina poderá interferir no seu jogo. São aplicações com destinações diferentes, recomendo o ThinLinc para uso como se estivesse usando em frente ao computador e deixar o Steam Link só pra jogatina… E a menos para jogos que não sejam OpenGL, pode usar o Steam dentro de uma sessão do ThinLinc.

Aplicação X tem melhor qualidade de imagem e melhor responsividade do que o ThinLinc!
Bom, nos meus testes com latências chegando perto de 100ms (usando no wifi 2.4GHz) e banda larga de apenas 10Mbps, a melhor qualidade de imagem e responsividade foi do ThinLinc. Compartilha com a gente uma comparação, por favor, alternativas são sempre bem vindas.

Abraços

3 curtidas