Xvfb : guide pratique, et comment obtenir un vrai rendu GPU
Xvfb (X virtual framebuffer) est un serveur X qui dessine dans la mémoire au lieu d’un écran. C’est la façon classique de lancer un navigateur, une application graphique ou une suite de tests E2E sur un serveur Linux sans écran. Ce guide montre l’essentiel, puis la limite que la plupart des tutoriels oublient : Xvfb ne passe pas par le GPU.
Démarrer en une ligne
sudo apt install xvfb # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
-achoisit automatiquement un numéro d’affichage libre (utile en CI parallèle) ;-screen 0 1920x1080x24fixe la résolution et la profondeur : les captures d’écran sont identiques d’une exécution à l’autre.
Pour garder un affichage ouvert en tâche de fond :
Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99
Le piège : Xvfb rend sur le CPU
Xvfb n’a pas d’accès au GPU. Toute application OpenGL lancée dessus est rendue
par le CPU, avec le pilote logiciel llvmpipe de Mesa :
$ xvfb-run -a glxinfo -B | grep renderer
OpenGL renderer string: llvmpipe (LLVM 19.1.7, 256 bits)
Pour Chrome et Chromium, c’est encore plus net. Sous Xvfb sans réglage,
WebGL est tout simplement désactivé ; en mode --headless sans réglage,
Chrome utilise SwiftShader, un GPU émulé sur le CPU. Sur un test WebGL 1080p,
cela donne environ 13 images/s.
Faire utiliser le GPU à Chrome, avec ou sans Xvfb
Chrome sait faire son rendu directement sur le GPU via ANGLE, sans passer par le serveur X. Il suffit de lui demander :
chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist ...
Mesuré le 29/10/2026 sur un serveur Linux GPU (Intel UHD 770, 4 vCPU, Chromium 156, même shader WebGL 1080p) :
| Configuration | Moteur de rendu WebGL | Images/s |
|---|---|---|
--headless=new seul | SwiftShader (CPU) | 13 |
| Xvfb seul | WebGL désactivé | — |
--headless=new --use-angle=vulkan | UHD 770 (Vulkan) | ~260 |
--headless=new --use-angle=gl-egl | UHD 770 (OpenGL ES 3.2) | ~230 |
Xvfb + --use-angle=vulkan | UHD 770 (Vulkan) | GPU, comme ci-dessus |
Environ 20 fois plus rapide, et le CPU reste libre pour vos tests. Les mêmes options fonctionnent sous Xvfb : utile si vous gardez Xvfb pour une extension ou une application qui exige un vrai affichage X.
Le détail (Playwright, Puppeteer, Selenium, Docker, vérification) est dans notre guide Lancer Chrome avec le GPU sur un serveur Linux.
Ai-je encore besoin de Xvfb ?
| Cas | Xvfb utile ? |
|---|---|
| Playwright / Puppeteer / Selenium récents | Non : --headless=new suffit |
| Extensions Chrome, tests en mode « headed » | Oui |
| Applications X11 (Electron, Java Swing, outils anciens) | Oui |
| OpenGL accéléré pour une appli non-navigateur | Non : utilisez EGL sans affichage, ou VirtualGL |
Questions fréquentes
Pourquoi mes captures WebGL sont-elles noires ou très lentes sous Xvfb ?
Parce que Chrome désactive WebGL (ou passe sur SwiftShader) quand il ne trouve
pas de GPU. Ajoutez --use-angle=vulkan --ignore-gpu-blocklist.
Peut-on avoir de l’OpenGL matériel sous Xvfb ?
Pas directement : Xvfb ne sait pas utiliser le GPU. Les applications qui
savent rendre via EGL (eglinfo -B -p surfaceless montre la carte) ou
VirtualGL contournent le problème.
Est-ce reproductible en CI ? Oui : résolution et profondeur sont fixées par la commande, et le GPU donne le même rendu à chaque exécution.
Essayer sur un serveur Linux GPU
Nos serveurs ont un GPU Intel UHD 770 accessible dans la VM, avec Mesa,
Vulkan et VAAPI déjà installés : installez Chromium (apt install chromium)
et les commandes ci-dessus marchent tout de suite. À partir de 14,99 € HT/mois, accès root, IPv6 dédiée, option
cluster k3s.