Écran noir VNC sous Ubuntu : la cause était xstartup

L’écran noir VNC sous Ubuntu ne venait pas du réseau. C’était un problème de configuration de xstartup.

Et le port 5901 n’avait même pas besoin d’être ouvert.

En installant VNC sous Ubuntu, la plupart des gens bloquent sur deux points. Le client se connecte, mais l’écran reste noir.

Et on ne sait pas trop s’il faut ouvrir le port 5901 sur Internet. Dans les deux cas, la cause était plus simple que je ne le pensais.

J’avais besoin de tester une interface graphique sur un serveur Ubuntu d’AWS EC2. J’ai donc installé TigerVNC moi-même, et je retrace ici le parcours tel qu’il s’est passé.

Quand a-t-on besoin de VNC sur un serveur Ubuntu ?

SSH suffit pour administrer un serveur. VNC n’est utile que pour voir l’écran réel, comme un flux d’authentification dans le navigateur ou l’état d’une application graphique.

D’habitude, j’administrais mes serveurs en SSH. Je n’ai pas ajouté VNC pour avoir un bureau à distance en permanence.

Pendant une période de développement et de test, je devais vérifier directement un navigateur et des applications graphiques sur un Ubuntu dans le cloud.

Il fallait soit suivre de mes yeux des flux d’authentification et de redirection, soit vérifier l’état réel de l’écran d’une application graphique.

J’ai donc ajouté TigerVNC et un environnement de bureau léger, uniquement pour la période où il me fallait une interface graphique.

Si le travail se fait en CLI, aujourd’hui encore, je n’installe pas VNC.

Comment installer Xfce et TigerVNC ?

Pour un bureau à distance VNC sous Ubuntu, installez un environnement de bureau léger (Xfce) et le serveur TigerVNC. Définissez ensuite le mot de passe de connexion avec vncpasswd.

À l’époque, mon environnement principal était Ubuntu 22.04 LTS.

Beaucoup de guides prenaient la 20.04 comme référence, mais son support standard a pris fin le 31 mai 2025. Pour une installation neuve aujourd’hui, je pense qu’il faut partir de la 22.04 ou de la 24.04 LTS.

Installer les paquets (Xfce, TigerVNC)

Mettez d’abord à jour la liste des paquets, puis installez les paquets.

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

L’installation elle-même ne prend pas longtemps. C’est l’étape suivante qui demande du temps.

Définir le mot de passe de connexion avec vncpasswd

Une fois l’installation terminée, créez un mot de passe pour les connexions VNC avec vncpasswd.

vncpasswd

Ce mot de passe est distinct de celui de votre compte Linux. C’est celui que vous saisissez dans le client VNC au moment de la connexion.

Pourquoi TigerVNC affiche-t-il un écran noir après la connexion ?

Si vous n’avez qu’un écran noir après la connexion, ne commencez pas par le réseau. Vérifiez d’abord le droit d’exécution de ~/.vnc/xstartup et la commande qui lance la session de bureau.

C’est exactement le premier problème que j’ai rencontré.

Le processus VNC tournait, et le client se connectait. C’est pour cela qu’au début, je n’ai pas soupçonné le réseau.

En vérifiant, j’ai vu que ~/.vnc/xstartup ne lançait pas correctement la session de bureau.

J’ai corrigé le droit d’exécution et la commande de démarrage de la session. J’ai relancé la session VNC, et le problème était réglé.

Bureau Xfce affiché dans un client VNC après correction de xstartup sous Ubuntu
Le bureau Xfce via VNC. (redessiné avec l'IA)

Depuis, j’ai changé l’ordre de mon diagnostic. Je sépare d’abord deux cas : la connexion échoue, ou elle réussit mais l’écran reste noir.

Dans le premier cas, je regarde d’abord le réseau, le pare-feu et l’état du service. Dans le second, je vais d’abord voir xstartup.

Schéma de diagnostic VNC séparant l'échec de connexion et l'écran noir après connexion
Ordre de diagnostic : échec de connexion ou écran noir.

La première fois que j’ai traversé tout cela, il m’a fallu environ 40 à 50 minutes, essais et erreurs compris.

C’est le temps total, de l’installation de VNC jusqu’à la connexion effective.

Il comprend l’environnement de bureau, l’écriture de xstartup, l’écran noir, la correction des droits et de la session, et le tunnel SSH.

Sur le deuxième environnement, je connaissais déjà la cause. J’ai terminé en moins de 20 minutes.

Corriger le droit d’exécution et la commande de session de xstartup

Donnez le droit d’exécution à ~/.vnc/xstartup, puis vérifiez qu’il contient bien une commande qui lance la session de bureau.

chmod +x ~/.vnc/xstartup

Dans xstartup, la commande qui lance la session Xfce doit être écrite de façon à s’exécuter correctement.

Si ce fichier est mal configuré, le serveur VNC peut fonctionner normalement alors que l’écran reste noir.

Faut-il ouvrir le port 5901 ? Passez plutôt par un tunnel SSH

Non, il n’est pas nécessaire d’exposer le port VNC (5901) sur Internet. Avec un tunnel SSH d’un port local vers le serveur, vous n’avez pas à ajouter de règle VNC au groupe de sécurité.

Le protocole RFB, utilisé par VNC, ne chiffre pas le trafic par lui-même. Les données d’écran et l’authentification sont exposées telles quelles.

C’est pour cela qu’on l’enveloppe dans un tunnel SSH plutôt que d’ouvrir le port sur Internet.

Une fois, j’ai pensé devoir ouvrir le port 5901, et j’ai voulu commencer par modifier le groupe de sécurité AWS.

Finalement, je ne l’ai pas fait. J’ai utilisé un tunnel SSH au lieu d’exposer le port VNC sur Internet.

Le chemin était à peu près celui-ci : localhost:5901 sur ma machine → SSH → localhost:5901 sur le serveur. Dans le groupe de sécurité, je n’ai pas ouvert le 5901 de VNC à tout Internet.

Connexion VNC par tunnel SSH, de localhost:5901 en local vers localhost:5901 sur le serveur, sans ouvrir le port 5901
VNC via un tunnel SSH, localhost:5901 aux deux extrémités.

Même avec VNC en panne, il n’y avait aucune raison de commencer par ouvrir le 5901 sur Internet.

Il ne me fallait pas un port public. Il me fallait une session de bureau qui fonctionne et un tunnel SSH.

Comment lancer le serveur VNC comme service systemd ?

Si vous enregistrez le serveur VNC comme service systemd, vous n’avez plus à relancer vncserver à la main après un redémarrage du serveur.

Créez un fichier d’unité de la forme [email protected] et activez-le avec systemctl.

Même si le serveur redémarre, la session VNC remonte alors toute seule. Plus besoin de vous connecter en SSH pour taper vncserver à chaque fois.

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

La commande status vous montre tout de suite si la session a bien démarré.

Sortie de systemctl status vncserver@1.service montrant le service VNC actif
[email protected] en cours d'exécution sous systemd. (redessiné avec l'IA)

Recommanderais-je encore VNC ? Alternatives et critères de choix

Pour le code, SSH ou un environnement de développement distant ; pour vérifier une interface web, un navigateur headless. Je pense qu’il est raisonnable de ne choisir VNC que si vous avez besoin de toute l’interface graphique Linux.

Je choisis selon l’usage.

Objectif Outil recommandé
Administrer le serveur, modifier du code SSH, VS Code Remote SSH, devcontainer, code-server
Vérifier une interface web, automatiser le navigateur navigateur headless
Vérifier la session de bureau Linux elle-même VNC

En bref, le code passe par SSH, et le simple résultat à l’écran par un navigateur headless. VNC, seulement quand j’ai besoin de la session de bureau elle-même.

J’ai aussi utilisé le X11 forwarding. Avec plusieurs fenêtres graphiques ouvertes longtemps, VNC, qui garde une session de bureau complète, était plus pratique dans certains cas.

Je ne défends donc pas l’idée qu’« un serveur Ubuntu a besoin d’une interface graphique ». Au contraire, si le travail se fait en CLI, je préfère ne pas installer VNC.

Aujourd’hui, je ne laisse pas VNC tourner en permanence sur cette instance EC2. Je suis passé à une autre méthode : créer l’environnement graphique seulement quand j’en ai besoin.

Sur un serveur exposé à Internet, s’il n’y a pas de raison d’y garder un démon VNC et un bureau actifs, je pense qu’ils ajoutent seulement de la surface d’attaque et des composants à maintenir.

Questions fréquentes

La connexion VNC fonctionne, mais l’écran reste noir. Pourquoi ?

Dans la plupart des cas, c’est la configuration de ~/.vnc/xstartup, pas le réseau. Vérifiez d’abord le droit d’exécution (chmod +x) et la présence de la commande de démarrage de session.

Faut-il ouvrir le port 5901 dans le groupe de sécurité ?

Non. Il suffit de relier un port local au serveur par un tunnel SSH. Inutile d’exposer directement le 5901 sur Internet.

Existe-t-il d’autres méthodes d’accès à distance que VNC ?

Tout dépend de l’objectif. Pour le code, SSH ou un environnement de développement distant est plus simple ; pour vérifier une interface web, un navigateur headless.

N’envisagez VNC que si vous devez voir toute l’interface graphique Linux.

Références


Cet article a été localisé à partir de l’original en coréen : https://jjeongil.tistory.com/2090.