|
| 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. |
0 commit comments