Xvfb: Praxisanleitung und wie Sie echtes GPU-Rendering erhalten
Xvfb (X virtual framebuffer) ist ein X-Server, der in den Arbeitsspeicher statt auf einen Bildschirm zeichnet. Das ist der klassische Weg, einen Browser, eine grafische Anwendung oder eine E2E-Testsuite auf einem Linux-Server ohne Bildschirm zu starten. Diese Anleitung zeigt das Wesentliche und danach die Grenze, die die meisten Tutorials vergessen: Xvfb nutzt die GPU nicht.
Start in einer Zeile
sudo apt install xvfb # Debian / Ubuntu
xvfb-run -a -s "-screen 0 1920x1080x24" npx playwright test
-awählt automatisch eine freie Display-Nummer (nützlich bei paralleler CI);-screen 0 1920x1080x24legt Auflösung und Farbtiefe fest: Die Screenshots sind von Lauf zu Lauf identisch.
Um ein Display dauerhaft im Hintergrund offen zu halten:
Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99
Die Falle: Xvfb rendert auf der CPU
Xvfb hat keinen Zugriff auf die GPU. Jede OpenGL-Anwendung, die darauf läuft,
wird von der CPU gerendert, mit dem Software-Treiber llvmpipe von Mesa:
$ xvfb-run -a glxinfo -B | grep renderer
OpenGL renderer string: llvmpipe (LLVM 19.1.7, 256 bits)
Bei Chrome und Chromium ist es noch deutlicher. Unter Xvfb ohne weitere
Einstellungen ist WebGL schlicht deaktiviert; im Modus --headless ohne
weitere Einstellungen verwendet Chrome SwiftShader, eine auf der CPU emulierte
GPU. Bei einem WebGL-Test in 1080p ergibt das etwa 13 Bilder/s.
Chrome die GPU nutzen lassen, mit oder ohne Xvfb
Chrome kann über ANGLE direkt auf der GPU rendern, ohne den X-Server zu nutzen. Man muss es nur verlangen:
chromium --headless=new --use-angle=vulkan --ignore-gpu-blocklist ...
Gemessen am 29.10.2026 auf einem Linux-GPU-Server (Intel UHD 770, 4 vCPU, Chromium 156, gleicher WebGL-Shader in 1080p):
| Konfiguration | WebGL-Renderer | Bilder/s |
|---|---|---|
nur --headless=new | SwiftShader (CPU) | 13 |
| nur Xvfb | WebGL deaktiviert | — |
--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, wie oben |
Etwa 20-mal schneller, und die CPU bleibt frei für Ihre Tests. Dieselben Optionen funktionieren unter Xvfb: nützlich, wenn Sie Xvfb für eine Erweiterung oder eine Anwendung behalten, die ein echtes X-Display verlangt.
Die Details (Playwright, Puppeteer, Selenium, Docker, Überprüfung) finden Sie in unserer Anleitung Chrome mit GPU auf einem Linux-Server starten.
Brauche ich Xvfb noch?
| Anwendungsfall | Xvfb sinnvoll? |
|---|---|
| Aktuelles Playwright / Puppeteer / Selenium | Nein: --headless=new reicht |
| Chrome-Erweiterungen, Tests im „headed“-Modus | Ja |
| X11-Anwendungen (Electron, Java Swing, ältere Tools) | Ja |
| Beschleunigtes OpenGL für eine Nicht-Browser-Anwendung | Nein: Verwenden Sie EGL ohne Display oder VirtualGL |
Häufige Fragen
Warum sind meine WebGL-Screenshots unter Xvfb schwarz oder sehr langsam?
Weil Chrome WebGL deaktiviert (oder auf SwiftShader ausweicht), wenn es keine
GPU findet. Fügen Sie --use-angle=vulkan --ignore-gpu-blocklist hinzu.
Bekommt man Hardware-OpenGL unter Xvfb?
Nicht direkt: Xvfb kann die GPU nicht nutzen. Anwendungen, die über EGL
rendern können (eglinfo -B -p surfaceless zeigt die Karte), oder VirtualGL
umgehen das Problem.
Ist das in der CI reproduzierbar? Ja: Auflösung und Farbtiefe werden durch den Befehl festgelegt, und die GPU liefert bei jedem Lauf dasselbe Rendering.
Auf einem Linux-GPU-Server ausprobieren
Unsere Server haben eine Intel-UHD-770-GPU, die in der VM verfügbar ist, mit
bereits installiertem Mesa, Vulkan und VAAPI: Installieren Sie Chromium
(apt install chromium), und die obigen Befehle funktionieren sofort.
Ab 14,99 € netto/Monat, Root-Zugriff, dedizierte IPv6, optionaler
k3s-Cluster.