Tela preta no VNC com Ubuntu: a causa era o xstartup

A tela preta no VNC com Ubuntu não era problema de rede. Era a configuração do xstartup.

E a porta 5901 nem precisava ser aberta.

Esses são os dois pontos onde a maioria das pessoas trava ao configurar VNC no Ubuntu. O cliente conecta, mas a tela fica preta. E não fica claro se é preciso abrir a 5901 para a internet.

As duas causas foram mais simples do que eu pensava.

Eu precisava testar uma interface gráfica num servidor Ubuntu na AWS EC2. Então instalei o TigerVNC eu mesmo. Aqui conto o processo como ele foi.

Quando o VNC é necessário num servidor Ubuntu?

Para administrar o servidor, SSH basta. O VNC só é necessário quando você precisa ver a tela de verdade, como um fluxo de autenticação no navegador ou o estado de um aplicativo gráfico.

No dia a dia, eu administrava os servidores por SSH. Não foi por querer um desktop remoto sempre disponível que instalei o VNC.

Houve um período de desenvolvimento e testes em que eu precisava conferir um navegador e aplicativos gráficos direto num Ubuntu na nuvem.

Eram tarefas em que eu precisava ver com meus próprios olhos fluxos de autenticação e redirecionamento. Ou então conferir em que estado de tela um aplicativo gráfico estava de fato.

Por isso, adicionei o TigerVNC e um ambiente de desktop leve só durante o período em que precisei da interface gráfica.

Se o trabalho se resolve pela CLI, até hoje não instalo o VNC.

Como instalei o Xfce e o TigerVNC?

Para ter um desktop remoto VNC no Ubuntu, instale um ambiente de desktop leve (Xfce) e o servidor TigerVNC. Depois, defina a senha de conexão com vncpasswd.

Na época, meu ambiente principal era o Ubuntu 22.04 LTS.

Muitos guias antigos usam o 20.04, mas o suporte padrão dele terminou em 31 de maio de 2025. Se for montar do zero hoje, acho que o certo é partir do 22.04 ou do 24.04 LTS.

Instalar os pacotes (Xfce e TigerVNC)

Primeiro, atualize a lista de pacotes. Depois, instale os pacotes.

sudo apt update
sudo apt install -y xfce4 xfce4-goodies tigervnc-standalone-server

A instalação em si não demora. O tempo vai embora na etapa seguinte.

Definir a senha de conexão com vncpasswd

Quando a instalação terminar, crie a senha das conexões VNC com vncpasswd.

vncpasswd

Essa senha é diferente da senha da sua conta Linux. É a que você digita no cliente VNC ao conectar.

Por que o VNC no Ubuntu mostra uma tela preta?

Se, depois de conectar, você só vê uma tela preta, não comece pela rede. Confira primeiro a permissão de execução do ~/.vnc/xstartup e o comando que inicia a sessão de desktop.

Esse foi exatamente o primeiro problema que tive.

O processo do VNC estava rodando e o cliente conectava. Por isso, no começo, não suspeitei da rede.

Ao investigar, vi que o ~/.vnc/xstartup não conseguia iniciar direito a sessão de desktop.

Ajustei a permissão de execução e o comando de início da sessão. Depois subi a sessão VNC de novo, e o problema se resolveu.

Desktop do Xfce visível pelo VNC depois de corrigir o xstartup
A área de trabalho Xfce pelo VNC. (redesenhado com IA)

Depois disso, mudei a ordem do diagnóstico. Primeiro separo dois problemas: a conexão não acontece, ou conecta e só mostra preto.

No primeiro caso, olho a rede, o firewall e o estado do serviço. No segundo, vou primeiro ao xstartup.

Diagrama para separar no VNC "não conecta" de "conecta, mas mostra tela preta"
Ordem de diagnóstico: falha de conexão ou tela preta.

Na primeira vez em que passei por tudo isso, levei cerca de 40–50 minutos, contando as tentativas e erros.

Esse é o tempo total, de instalar o VNC até conectar de fato. No meio, precisei configurar o ambiente de desktop, escrever o xstartup, enfrentar a tela preta, corrigir permissão e sessão e montar o túnel SSH.

No segundo ambiente, eu já conhecia a causa e terminei em menos de 20 minutos.

Corrigir a permissão do xstartup e o comando de início da sessão

Dê permissão de execução ao ~/.vnc/xstartup e confira se ele tem um comando para iniciar a sessão de desktop.

chmod +x ~/.vnc/xstartup

Dentro do xstartup, o comando de início da sessão do Xfce precisa estar escrito para rodar sem problemas.

Se esse arquivo estiver errado, o servidor VNC pode funcionar normalmente e, mesmo assim, a tela fica preta.

Preciso abrir a porta 5901? Melhor um túnel SSH

Não é preciso expor a porta do VNC (5901) na internet. Se você liga uma porta local ao servidor por um túnel SSH, não precisa adicionar uma regra para o VNC no grupo de segurança.

O protocolo RFB, usado pelo VNC, não criptografa o tráfego por conta própria. Os dados de tela e a autenticação ficam expostos, sem proteção.

Por isso, vale envolver a conexão num túnel SSH em vez de abrir a porta para a internet.

Uma vez, achei que precisava abrir a porta 5901 e quis começar mudando o grupo de segurança da AWS.

No fim, não fiz isso. Usei um túnel SSH em vez de expor a porta do VNC na internet.

A conexão foi, em linhas gerais, localhost:5901 na minha máquina → SSH → localhost:5901 no servidor. No grupo de segurança, não abri a 5901 do VNC para a internet inteira.

Esquema de conexão VNC por túnel SSH sem abrir a porta 5901
VNC por um túnel SSH, localhost:5901 nas duas pontas.

O VNC não funcionar não era motivo para começar abrindo a 5901 para a internet.

O que eu precisava não era publicar uma porta. Eu precisava de uma sessão de desktop funcionando e de um túnel SSH.

Como rodar o servidor VNC como serviço do systemd?

Se você registra o servidor VNC como serviço do systemd, não precisa rodar vncserver à mão de novo depois de reiniciar o servidor.

Crie um arquivo de unidade no formato [email protected] e ative-o com systemctl.

Assim, mesmo que o servidor reinicie, a sessão VNC sobe sozinha. Não é mais preciso entrar por SSH e digitar vncserver toda vez.

sudo systemctl enable [email protected]
sudo systemctl start [email protected]
sudo systemctl status [email protected]

Com o comando de status, você vê na hora se a sessão subiu bem.

Saída do systemctl status mostrando o serviço VNC rodando
[email protected] em execução no systemd. (redesenhado com IA)

Eu recomendaria VNC hoje? Alternativas e como escolho

Para código, uso SSH ou um ambiente remoto. Para conferir uma interface web, um navegador headless. Acho que o VNC só faz sentido quando você precisa da interface gráfica completa do Linux.

Escolho conforme o objetivo.

Objetivo Ferramenta
Administrar o servidor, editar código SSH, VS Code Remote SSH, devcontainer, code-server
Conferir interface web, automatizar o navegador navegador headless
Conferir a própria sessão de desktop do Linux VNC

Resumindo: código vai por SSH, e o resultado na tela, por navegador headless. VNC, só quando preciso da sessão de desktop em si.

Também já usei X11 forwarding. Ao lidar com várias janelas gráficas por muito tempo, houve casos em que o VNC, que mantém uma sessão de desktop completa, foi mais confortável.

Então não defendo que “servidor Ubuntu precisa de interface gráfica”. Pelo contrário: se o trabalho se resolve pela CLI, prefiro não instalar o VNC.

Hoje não deixo o VNC ligado o tempo todo naquela instância EC2. Passei a criar o ambiente gráfico só quando preciso.

Num servidor exposto à internet, pode não haver motivo para manter o daemon do VNC e o desktop sempre ativos. Nesse caso, acho que eles só aumentam a superfície de ataque e as peças para operar.

Perguntas frequentes

O VNC conecta, mas a tela fica preta. Por quê?

Na maioria dos casos, é a configuração do ~/.vnc/xstartup, não a rede. Comece conferindo a permissão de execução (chmod +x) e se o comando de início da sessão está no arquivo.

Preciso abrir a porta 5901 no grupo de segurança?

Não. Basta ligar uma porta local ao servidor por um túnel SSH. Não é preciso expor a 5901 diretamente na internet.

Existem outras formas de acesso remoto além do VNC?

Depende do objetivo. Para código, SSH ou um ambiente de desenvolvimento remoto é mais simples. Para conferir uma interface web, um navegador headless.

Considere o VNC só quando precisar ver a interface gráfica inteira do Linux.

Referências


Este artigo foi localizado a partir do original em coreano: https://jjeongil.tistory.com/2090.