OpenGL driver errors in QubesOS VMs: Why there’s no fix*

The reason you can’t fix this is simple: QubesOS is built on the principle of isolation, and GPUs aren’t designed to meet the strict isolation requirements QubesOS demands because they prioritize performance instead.

UPDATE [2025-07-19]: Turns out you can? I found a way to use GPU on a VM, and it would likely help with this issue, read more here

Also, QubesOS uses the Xen hypervisor, which does not support GPU passthrough in a way that allows OpenGL applications to run with hardware acceleration inside VMs.

This limitation, which effectively prevents VMs from using GPU-accelerated OpenGL apps, exists for a good reason.

There are some theoretical attack scenarios where malware inside a VM could:

  • Exploit vulnerabilities in the GPU driver or firmware
  • Permanently flash malicious firmware to the GPU
  • Survive reboots, OS reinstalls, possibly even heat death of the universe.

See Qubes OS Device handling security for more information.

I ran into this issue myself while trying to switch my setup to fully use nixpkgs. When I installed kitty (a terminal emulator) from nixpkgs, it didn’t work due to OpenGL errors, but the apt version (0.26.5-5) worked fine.

I tried matching the nixpkgs version to the closest available one-0.26.5-but it threw the same OpenGL 3.3 requirement error.

Some [1, 2] solutions exist for GPU passthrough on QubesOS, but none of them are easy to implement and often require a secondary graphics card, so that one goes to the dom0 and the second goes to the VM. Attaching a whole GPU to a VM is not a trivial task and certainly is overkill just to run a terminal emulator in my case.

In case you really need GPU passthrough (for cracking, games, or 3D rendering), it’s better to use a different machine (best solution) or dual-boot (which introduces other attack vectors; see multibooting qubes).

One of apt’s main goals is to provide packages that work across a wide range of hardware setups, including systems without GPU passthrough. Because of this, for incompatible apps like kitty, I currently stick to using apt packages and make bash builder scripts to combine the declarative power of Nix with the stability of apt.