Skip to content

Commit c2d24d9

Browse files
committed
Neuer Beitrag: OpenGL-Unterstützung in einer Proxmox VE VM
1 parent 09b1596 commit c2d24d9

2 files changed

Lines changed: 209 additions & 0 deletions

File tree

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
---
2+
title: OpenGL-Unterstützung in einer Proxmox VE VM
3+
author:
4+
name: Peter Müller
5+
link: https://crycode.de
6+
banner: banner.webp
7+
date: 2025-08-11 20:40:00
8+
categories:
9+
- [Linux]
10+
- [Software]
11+
tags:
12+
- GPU
13+
- OpenGL
14+
- Proxmox VE
15+
- Virtuelle Maschine
16+
- VirGL
17+
- WebGL
18+
abbr:
19+
VM: Virtuelle Maschine
20+
---
21+
22+
Manche Anwendungen benötigen OpenGL-Unterstützung, um performant zu laufen. Das ist beispielsweise bei Browser-Spielen in Form von WebGL der Fall. In diesem Artikel wird gezeigt, wie man OpenGL-Unterstützung in einer Proxmox VE {% abbr VM %} einrichtet, ohne echtes GPU-Passthrough zu verwenden. Stattdessen wird die virtuelle GPU *VirGL* verwendet, die OpenGL-Beschleunigung bietet.
23+
24+
Standardmäßig ist in VMs unter Proxmox VE eine OpenGL-Unterstützung nur softwareseitig über `llvmpipe` verfügbar. Das ist für viele Anwendungen zu langsam.
25+
26+
Mit den richtigen Einstellungen für die VM kann in der VM die hardwarebeschleunigtes OpenGL des Host-Systems genutzt werden (sofern der Host eine entsprechende GPU hat).
27+
28+
<!-- more -->
29+
30+
<!-- toc 2 -->
31+
32+
## Vorbereitungen am PVE-Host
33+
34+
Als Grundlage wird hier ein Proxmox VE 9 Host verwendet, der auf Debian 13 (Trixie) basiert. Bei anderen Versionen kann es zu Abweichungen kommen, aber die grundlegenden Schritte sollten ähnlich sein.
35+
36+
Zunächst müssen auf dem Host zwei Pakete installiert werden, die für die OpenGL-Unterstützung in der VM benötigt werden. Andernfalls lässt sich die VM nicht starten:
37+
38+
```sh Pakete auf dem Host installieren
39+
apt install libgl1 libegl1
40+
```
41+
42+
## VM erstellen
43+
44+
Beim Erstellen der VM ist die Auswahl der virtuellen Grafikkarte entscheidend, um OpenGL-Beschleunigung zu aktivieren. Hier muss **VirGL GPU** ausgewählt werden. Das ist die einzige Option, die Hardware-beschleunigtes OpenGL in der VM ermöglicht.
45+
Die anderen Optionen für die VM können auf der Standard-Einstellung belassen werden.
46+
47+
* Grafikkarte: **VirGL GPU**
48+
* Maschinentyp: *i440fx* (*q35* geht auch)
49+
* BIOS: *SeaBIOS* (*OVMF* für UEFI)
50+
51+
Der Rest kann nach Belieben angepasst werden.
52+
53+
## Installation und Anpassung der VM
54+
55+
In der VM installieren wir hier ein Debian 13 (Trixie) mit normalen Parametern und *XFCE* als Desktop-Umgebung.
56+
Andere Linux-Distributionen sollten ähnlich funktionieren.
57+
58+
Nach der Debian-Installation müssen die Pakete `mesa-utils` und `mesa-vulkan-drivers` installiert werden, um OpenGL und Vulkan-Unterstützung zu aktivieren. Diese Pakete sind notwendig, damit die VirGL-Grafikbeschleunigung korrekt funktioniert.
59+
60+
```sh Pakete in der VM installieren
61+
sudo apt install mesa-utils mesa-vulkan-drivers
62+
```
63+
64+
Anschließend können wir testen, ob *VirGL* aktiv ist:
65+
66+
```sh Prüfen, ob VirGL aktiv ist
67+
glxinfo | grep "OpenGL renderer"
68+
OpenGL renderer string: virgl (AMD Radeon Graphics (radeonsi, raven, ACO, DRM 3.61,...))
69+
```
70+
71+
> [!NOTE]
72+
> Hier sollte nun `virgl` stehen und nicht `llvmpipe`.
73+
74+
Damit haben wir nun unter Proxmox die bestmögliche Grafikleistung ohne GPU-Passthrough.
75+
76+
## Remote-Verbindungen zur VM mit Sunshine und Moonlight
77+
78+
> [!IMPORTANT]
79+
> Wichtig ist anzumerken, dass die OpenGL-Beschleunigung nur funktioniert, wenn die aktive Sitzung in der VM mit grafischer Oberfläche direkt auf dem virtuellen Display (*Konsole* in der PVE-Oberfläche) läuft.
80+
> Bei RDP-Verbindungen beispielsweise wird immer `llvmpipe` verwendet und somit keine Hardware-Beschleunigung unterstützt.
81+
82+
Damit der Desktop inkl. OpenGL-Beschleunigung auf anderen Geräten angezeigt werden kann, installieren wir [Sunshine](https://docs.lizardbyte.dev/projects/sunshine/latest/) in der VM und [Moonlight](https://moonlight-stream.org/) auf dem jeweiligen Client.
83+
84+
### Installation von Sunshine in der VM
85+
86+
Da zum aktuellen Zeitpunkt Sunshine noch nicht von Debian Trixie als deb-Paket unterstützt wird, nutzen wir das AppImage.
87+
88+
```sh Sunshine in der VM installieren
89+
cd ~
90+
wget https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine.AppImage
91+
chmod +x sunshine.AppImage
92+
sudo mv sunshine.AppImage /usr/local/bin/sunshine.AppImage
93+
sunshine.AppImage --install
94+
```
95+
96+
Durch den Aufruf von `sunshine.AppImage --install` werden ein paar udev-Regeln angelegt, die für eine korrekte Funktion von Sunshine sinnvoll sind.
97+
98+
Um nun Sunshine zu starten rufen wir einfach `sunshine.AppImage` auf. Das AppImage kann auch in den Autostart gelegt werden, damit es beim Start der VM automatisch gestartet wird (siehe weiter unten).
99+
100+
Sobald Sunshine läuft, kann über die angezeigte URL (`http://localhost:47990`) die Weboberfläche aufgerufen werden, um die Einstellungen vorzunehmen. Das dabei angezeigte Sicherheitsrisiko wegen einem selbstsignierten Zertifikat ist normal und kann ignoriert werden, da Sunshine nur lokal läuft.
101+
102+
Beim ersten Login legen wir einen Benutzernamen und ein Passwort fest, worüber wir uns anschließend in Sunshine einloggen können.
103+
104+
### Installation von Moonlight auf dem Client
105+
106+
Von Moonlight laden wir die passende Version für das jeweilige Betriebssystem direkt aus den offiziellen [Releases](https://github.com/moonlight-stream/moonlight-qt/releases) herunter und installieren dieses wie gewohnt.
107+
108+
Sobald Moonlight gestartet ist und Sunshine in der VM läuft, sollte die VM automatisch in der Liste der verfügbaren Geräte in Moonlight auftauchen.
109+
110+
Bei der ersten Verbindung müssen wir in Sunshine die Verbindung autorisieren. Dazu wird in Moonlight eine vierstellige PIN angezeigt, welche in der Sunshine-Weboberfläche unter dem Menüpunkt *PIN* zusammen mit einem Namen für den Client eingegeben werden muss.
111+
Nach der Autorisierung sollte die Verbindung zur VM hergestellt werden können und die in Sunshine als *Applications* definierten Anwendungen auswählbar sein. Standardmäßig sind dies der Desktop, der Desktop in niedriger Auflösung und Steam.
112+
113+
> [!TIP]
114+
> Eine aktive Verbindung von Moonlight kann mit der Tastenkombination `Strg` + `Alt` + `Shift` + `Q` verlassen werden.
115+
116+
> [!TIP]
117+
> In den Einstellungen von Moonlight können u.a. die Auflösung und die Bildwiederholrate angepasst und auch ein Fenstermodus aktiviert werden.
118+
> Abhängig von der Anwendung, die man nutzen möchte, kann es sinnvoll sein, die Option *Optimiere die Maus für Remotedesktop* zu aktivieren, wodurch sich die Maus einfach zwischen lokalen Anwendungen und der Remote-VM bewegen lässt.
119+
120+
### Autostart von Sunshine in der VM
121+
122+
Damit beim Start der VM Sunshine automatisch gestartet wird und wir uns direkt verbinden können, aktivieren wir zunächst den automatischen Login in der VM.
123+
124+
Da wir *XFCE* zusammen mit *LightDM* nutzen, passen wir die Datei `/etc/lightdm/lightdm.conf` an und fügen die folgenden Zeilen im Abschnitt `[Seat:*]` hinzu:
125+
126+
```ini /etc/lightdm/lightdm.conf
127+
autologin-user = username
128+
autologin-user-timeout = 10
129+
```
130+
131+
`username` muss durch den tatsächlichen Benutzernamen ersetzt werden, mit dem der automatische Login erfolgen soll.
132+
Der Timeout von 10 Sekunden sorgt dafür, dass der automatische Login nicht sofort erfolgt, sondern eine kurze Verzögerung hat. Das ist nützlich, falls man sich mal mit einem anderen Nutzer anmelden möchte.
133+
134+
Für den Autostart von Sunshine erstellen wir eine `.desktop`-Datei im Autostart-Verzeichnis des Benutzers:
135+
136+
```sh Sunshine Autostart-Datei erstellen
137+
mkdir -p ~/.config/autostart
138+
cat <<EOF > ~/.config/autostart/sunshine.desktop
139+
[Desktop Entry]
140+
Type=Application
141+
Exec=/usr/local/bin/sunshine.AppImage
142+
Hidden=false
143+
NoDisplay=false
144+
X-GNOME-Autostart-enabled=true
145+
Name=Sunshine
146+
Comment=Start Sunshine Remote Desktop
147+
EOF
148+
```
149+
150+
Nach einem Neustart der VM sollte der Benutzer nun direkt (nach 10 Sekunden) angemeldet werden und Sunshine sollte automatisch starten und im Hintergrund laufen.
151+
152+
Ob Sunshine läuft, können wir in einem Terminal mit dem Befehl `ps aux | grep sunshine` überprüfen. Dort sollte eine Zeile mit dem Prozess `sunshine.AppImage` angezeigt werden.
153+
154+
## Einstellungen in Firefox für WebGL-lastige Browseranwendungen
155+
156+
Hier noch ein paar Einstellungen für Firefox, um die Leistung von WebGL-lastigen Anwendungen wie Browser-Games zu verbessern.
157+
Diese Einstellungen können in der Adresszeile von Firefox unter `about:config` vorgenommen werden.
158+
159+
> [!CAUTION]
160+
> Falsche oder fehlerhafte Einstellungen in `about:config` können zu Instabilität oder unerwartetem Verhalten des Browsers führen. Änderungen sollten mit Vorsicht vorgenommen werden.
161+
162+
### WebRender erzwingen
163+
164+
* `gfx.webrender.all` auf `true` setzen
165+
166+
Das sorgt dafür, dass das Rendering direkt auf der GPU über *VirGL* läuft.
167+
168+
### WebGL-Hardwarebeschleunigung einschalten
169+
170+
* `webgl.disabled` auf `false`
171+
* `webgl.force-enabled` auf `true`
172+
* `webgl.msaa-samples` auf `4` (für Kantenglättung)
173+
174+
Spiele sehen damit besser aus und laufen glatter.
175+
176+
## FPS in WebGL-Anwendungen anzeigen
177+
178+
Manchmal möchte man vielleicht die Framerate (FPS) in WebGL-Anwendungen anzeigen, um die Leistung zu überwachen. Dies kann nützlich sein, um zu sehen, ob die OpenGL-Beschleunigung korrekt funktioniert und ob die Leistung ausreichend ist.
179+
180+
Dazu einfach die Browser-Konsole (F12) öffnen und folgenden Code ausführen, um die FPS-Anzeige zu aktivieren:
181+
182+
```js FPS Overlay in einer Webseite hinzufügen
183+
(function(){
184+
let last = performance.now();
185+
let frames = 0;
186+
let fps = 0;
187+
const div = document.createElement('div');
188+
Object.assign(div.style, {
189+
position: 'fixed', top: '5px', right: '5px',
190+
background: 'rgba(0,0,0,0.7)', color: '#0f0',
191+
padding: '5px', font: 'bold 14px monospace', zIndex: 99999
192+
});
193+
document.body.appendChild(div);
194+
function loop(){
195+
frames++;
196+
const now = performance.now();
197+
if (now - last >= 1000) {
198+
fps = frames;
199+
frames = 0;
200+
last = now;
201+
div.textContent = fps + ' FPS';
202+
}
203+
requestAnimationFrame(loop);
204+
}
205+
loop();
206+
})();
207+
```
208+
209+
Damit sollte in der rechten oberen Ecke der Webseite die aktuelle Framerate angezeigt werden, bis die Seite geschlossen oder neu geladen wird.
13.6 KB
Loading

0 commit comments

Comments
 (0)