Xvfb: guía práctica y cómo obtener renderizado GPU real
Xvfb (X virtual framebuffer) es un servidor X que dibuja en memoria en lugar de en una pantalla. Es la forma clásica de lanzar un navegador, una aplicación gráfica o una suite de pruebas E2E en un servidor Linux sin pantalla. Esta guía muestra lo esencial y después el límite que la mayoría de los tutoriales olvidan: Xvfb no usa la GPU.
Empezar en una línea
sudo apt install xvfb # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
-aelige automáticamente un número de display libre (útil en CI en paralelo);-screen 0 1920x1080x24fija la resolución y la profundidad de color: las capturas de pantalla son idénticas de una ejecución a otra.
Para mantener un display abierto en segundo plano:
Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99
La trampa: Xvfb renderiza en la CPU
Xvfb no tiene acceso a la GPU. Cualquier aplicación OpenGL lanzada sobre él se
renderiza en la CPU, con el driver por software llvmpipe de Mesa:
$ xvfb-run -a glxinfo -B | grep renderer
OpenGL renderer string: llvmpipe (LLVM 19.1.7, 256 bits)
Con Chrome y Chromium es todavía más claro. Bajo Xvfb sin ajustes,
WebGL está directamente desactivado; en modo --headless sin ajustes,
Chrome usa SwiftShader, una GPU emulada en la CPU. En una prueba WebGL a 1080p,
eso da unas 13 imágenes/s.
Hacer que Chrome use la GPU, con o sin Xvfb
Chrome puede renderizar directamente en la GPU mediante ANGLE, sin pasar por el servidor X. Basta con pedírselo:
chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist ...
Medido el 29/10/2026 en un servidor Linux GPU (Intel UHD 770, 4 vCPU, Chromium 156, mismo shader WebGL a 1080p):
| Configuración | Motor de renderizado WebGL | Imágenes/s |
|---|---|---|
--headless=new solo | SwiftShader (CPU) | 13 |
| Xvfb solo | WebGL desactivado | — |
--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, como arriba |
Unas 20 veces más rápido, y la CPU queda libre para tus pruebas. Las mismas opciones funcionan bajo Xvfb: útil si mantienes Xvfb para una extensión o una aplicación que exige un display X real.
Los detalles (Playwright, Puppeteer, Selenium, Docker, verificación) están en nuestra guía Ejecutar Chrome con GPU en un servidor Linux.
¿Sigo necesitando Xvfb?
| Caso | ¿Xvfb útil? |
|---|---|
| Playwright / Puppeteer / Selenium recientes | No: --headless=new basta |
| Extensiones de Chrome, pruebas en modo «headed» | Sí |
| Aplicaciones X11 (Electron, Java Swing, herramientas antiguas) | Sí |
| OpenGL acelerado para una aplicación que no es un navegador | No: usa EGL sin display, o VirtualGL |
Preguntas frecuentes
¿Por qué mis capturas WebGL salen negras o van muy lentas bajo Xvfb?
Porque Chrome desactiva WebGL (o pasa a SwiftShader) cuando no encuentra
GPU. Añade --use-angle=vulkan --ignore-gpu-blocklist.
¿Se puede tener OpenGL por hardware bajo Xvfb?
No directamente: Xvfb no sabe usar la GPU. Las aplicaciones que pueden
renderizar mediante EGL (eglinfo -B -p surfaceless muestra la tarjeta) o
VirtualGL esquivan el problema.
¿Es reproducible en CI? Sí: la resolución y la profundidad las fija el comando, y la GPU da el mismo renderizado en cada ejecución.
Probar en un servidor Linux GPU
Nuestros servidores tienen una GPU Intel UHD 770 accesible dentro de la VM, con
Mesa, Vulkan y VAAPI ya instalados: instala Chromium (apt install chromium)
y los comandos anteriores funcionan de inmediato. Desde 14,99 €/mes sin IVA,
acceso root, IPv6 dedicada, opción clúster k3s.