Tenho tido dificuldades em consertar um sistema WSL2 que funcionava e que podia exibir a GUI de aplicativos Linux no Windows. Anteriormente, eu estava usando um aplicativo/xserver de terceiros chamado GWSL, mas um belo dia desinstalei o Docker Desktop no Windows por algum motivo não relacionado, e isso de alguma forma quebrou tudo.
Desde então, descobri que a versão atual do WSL vem com seu próprio suporte gráfico (WSLG) da própria Microsoft, e consegui iniciar qualquer aplicativo instalado no Ubuntu, como google-chrome
etc., com apenas uma etapa inicial necessária.
Ainda estou completamente confuso sobre todo esse servidor x e coisas de DISPLAY em geral, e a única coisa que me importa é fazer o Playwright iniciar um navegador para testar algumas coisas da web, mas ele continua me dando esse erro
Looks like you launched a headed browser without having a XServer running.
Set either 'headless: true' or use 'xvfb-run <your-playwright-app>
Então não estou procurando ajuda com o Playwright, mas sim tentando entender o que está acontecendo.
Quando eu inicializo o Ubuntu no WSL2 e executo
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Eu entendo
DISPLAY=10.255.255.254:0.0
DISPLAY=:0
Isso significa que tenho dois displays? Acho que sim.
Quando eu corro echo $DISPLAY
eu ganho10.255.255.254:0.0
Quando eu corro então google-chrome
eu receboMissing X server or $DISPLAY
Quando eu corro, export DISPLAY=:0
consigo executar com sucesso não apenas google-chrome
a versão do Playwrights chromium
(encontrada me\.cache\ms-playwright\chromium-1134\chrome-linux\chrome
) sem problemas.
No entanto, quando tento executar os testes do Playwright novamente, ele ainda me diz que não tenho nenhum XServer em execução.
Então, neste ponto, estou tentando entender em que estado estou. Eu realmente não tenho um XServer em execução se eu realmente posso iniciar o Chrome e outros pelo Ubuntu e vê-lo na minha área de trabalho do Windows? Eu tenho os DISPLAYs errados ou muitos? Achamos que o Playwright só funciona em um DISPLAY ou XServer específico (porta? ip?). Estou um pouco sem noção aqui e não tenho certeza do que mais depurar. Eu instalei e executei cerca de 1000 comandos Linux e tentei vários xservers de terceiros do Windows. Parece que está funcionando, mas não para o Playwright.
O nome de exibição do X11 tem o seguinte formato geral:
As partes hostname e screen number são opcionais: se hostname for deixado em branco, significa o host local. Se o screen number for deixado de fora, screen 0 é assumido.
Um display X11 é uma coleção de dispositivos de entrada (geralmente um teclado e um mouse) e uma ou mais telas físicas, todos sob controle de uma única sessão de usuário por vez . Um computador pode ter vários displays X11 por uma infinidade de razões: por exemplo, ele pode suportar o equivalente X11 da troca rápida de usuários do Windows, ou pode hospedar sessões VNC ou RDP remotas, ou pode ser um verdadeiro sistema multi-seat : um que permite que dois ou mais usuários locais façam login e tenham sessões GUI independentes ao mesmo tempo.
Uma tela X11 é um dispositivo de exibição com propriedades particulares. Na época em que os CRTs eram o estado da arte em tecnologia de exibição, uma estação de trabalho CAD profissional poderia ter um monitor em escala de cinza de alta taxa de atualização para minimizar a fadiga ocular e outro monitor otimizado para exibição de cores de alta fidelidade para visualizar os resultados renderizados.
Em monitores planos modernos, a cor completa é a norma e a taxa de atualização não afeta a fadiga ocular (pelo menos com imagens estáticas), e por isso é mais comum ter vários monitores físicos representados como uma única tela X11 que abrange ambos. Isso permite mover janelas livremente de um monitor para outro. Portanto, ter números de tela maiores que 0 seria bastante inesperado em sistemas modernos.
significa "contate o display 0, tela 0 do servidor de display X11 usando uma conexão TCP para o endereço IP 10.255.255.254, número da porta 6000 (= número do display + 6000)". O número da tela (o último
.0
bit) é opcional; se não for especificado, a tela 0 será usada.significa "contatar o display 0, tela padrão 0 da máquina local, usando o mecanismo de transporte mais eficiente disponível". No Linux, isso normalmente significaria que o aplicativo contataria inicialmente o servidor de display usando um soquete UNIX localizado em
/tmp/.X11-unix/X0
, e opcionalmente negociando acesso de memória compartilhada ao servidor X11 (extensão do protocolo MIT-SHM X11) e/ou Direct Rendering (acesso direto à GPU; extensões XFree86-DGA ou DRI) para melhor desempenho, se necessário e disponível.Se 10.255.255.254 for o endereço IP do seu sistema local, ambas as especificações DISPLAY informam ao cliente para se conectar ao mesmo monitor X11, mas provavelmente usando métodos de transporte diferentes.
A primeira forma força o TCP a ser usado até mesmo localmente; isso resulta em uma perda de desempenho, mas facilita, por exemplo, a gravação da sessão.
O segundo formulário pode voltar a usar TCP de qualquer maneira, se o soquete UNIX correspondente ao número de exibição não estiver disponível e o servidor X11 estiver escutando na porta TCP local (número de exibição + 6000).
No Linux moderno, os servidores X11 geralmente fornecem apenas o soquete UNIX por padrão, já que usar conexões X11 baseadas em TCP sem encaminhamento SSH X11 ou alguma outra camada de criptografia em uma conexão de rede real é terrivelmente inseguro para os padrões modernos.
Como os servidores X11 baseados em Windows costumavam ser usados principalmente para acessar monitores X11 remotos, eles tendem a ter conexões baseadas em TCP habilitadas por padrão, e esse pode até ser seu único método de conexão disponível.
O fato de a variável DISPLAY estar definida sugere que algo no seu sistema está definido para assumir que o servidor X11 está disponível. Mas a mensagem de erro
sugerem que ele não está realmente disponível agora; ou não está em execução ou algo impede que os aplicativos o contatem.
Provavelmente existe
xvfb-run
um script que executa o aplicativo especificado com um servidor Virtual Frame Buffer X11: uma espécie de servidor X11 fictício que não está realmente conectado a nenhum monitor visível, mas se comporta como se estivesse.O WSLg complica ainda mais o problema porque, aparentemente, ele é implementado como um servidor de exibição Wayland acessível por RDP com uma
XWayland
camada de compatibilidade X11 sobre ele.Para que o WSLg funcione, você aparentemente deve estar se conectando ao sistema WSL2 usando RDP. Então, você pode testar com um aplicativo Wayland nativo como o
gnome-terminal
first. Se isso funcionar, então o servidor de exibição principal do Wayland está em execução, pelo menos.Se isso funcionar, o próximo passo seria verificar se o
/tmp/.X11-unix/X<display number>
soquete UNIX está presente e se oXWayland
processo está em execução ou se está configurado para começar a usar osystemd
recurso de ativação de soquete do quando um cliente X11 tenta usar o soquete.fuser /tmp/.X11-unix/X0
deve informar o(s) PID(s) do(s) processo(s) atualmente associado(s) ao soquete.Para
DISPLAY=10.255.255.254:0.0
funcionar, você primeiro teria que verificar se há um processo de servidor X11 escutando na porta TCP 6000 naquele endereço IP. Se o endereço pertencer ao sistema WSL2,lsof -i tcp:6000
deve confirmar se o servidor X11 (ou aXWayland
camada de compatibilidade) está realmente escutando naquela porta. Comnc -v 10.255.255.254 6000
você poderia testar se a porta é realmente conectável ou não (firewalls de software?).O XWayland pode não escutar em uma porta TCP por padrão, mas o Playwright pode fornecer um proxy X11 para ele. (Aviso: não tenho a mínima ideia de como o Playwright realmente funciona.)