Skip to content

Instantly share code, notes, and snippets.

@djosephsen
Last active March 8, 2026 20:37
Show Gist options
  • Select an option

  • Save djosephsen/123f32507ff9badcb8ed819741feb768 to your computer and use it in GitHub Desktop.

Select an option

Save djosephsen/123f32507ff9badcb8ed819741feb768 to your computer and use it in GitHub Desktop.
How the AI and I finally managed to downgrade the NVIDIA Drivers on Pop!_OS
How the AI and I finally managed to downgrade the NVIDIA Drivers on Pop!_OS
(RTX 40-series / Kernel 6.12+)
Take it away claude:
The Problem: The "Latest Driver Trap"
On Pop!_OS 22.04 (and upstream Ubuntu Jammy), older NVIDIA driver packages (like
nvidia-driver-550, 560, or 565) have been turned into meta-packages that point to the
latest version (currently 580).
If version 580 is unstable on your hardware, apt will actively fight you if you try to
downgrade, effectively "trapping" you on the broken driver or forced upgrade loop.
Additionally, the NVIDIA Open Kernel Modules (now the default) can cause critical Xid
154/31 MMU faults on Ada Lovelace (RTX 40-series) laptop GPUs.
The Solution: Surgical Manual Installation
To fix this, we bypass the package manager's dependency logic by downloading real binary
components from the graphics-drivers PPA and installing them manually via dpkg.
1. Preparation (From the Desktop)
Verify you have the necessary kernel headers and build tools:
1 sudo apt update
2 sudo apt install build-essential gcc make dkms linux-headers-$(uname -r)
Create a directory and download the Real 565.77 Proprietary Binaries:
1 mkdir -p ~/nvidia-565-manual && cd ~/nvidia-565-manual
2 sudo add-apt-repository ppa:graphics-drivers/ppa -y
3 sudo apt update
4
5 # Download components (specify the exact version to avoid the 580 trap)
6 V="565.77-0ubuntu0~gpu22.04.1"
7 apt-get download \
8 nvidia-driver-565=$V nvidia-dkms-565=$V nvidia-kernel-common-565=$V \
9 nvidia-kernel-source-565=$V libnvidia-compute-565=$V libnvidia-compute-565:i386=$V \
10 libnvidia-extra-565=$V nvidia-compute-utils-565=$V libnvidia-decode-565=$V \
11 libnvidia-decode-565:i386=$V libnvidia-encode-565=$V libnvidia-encode-565:i386=$V \
12 nvidia-utils-565=$V xserver-xorg-video-nvidia-565=$V libnvidia-cfg1-565=$V \
13 libnvidia-fbc1-565=$V libnvidia-fbc1-565:i386=$V libnvidia-gl-565=$V \
14 libnvidia-gl-565:i386=$V libnvidia-common-565=$V nvidia-firmware-565-565.77=$V \
15 libnvidia-egl-wayland1 libnvidia-egl-wayland1:i386
2. The "Clean Room" Install (From TTY)
1. Switch to TTY3 (Ctrl+Alt+F3) and log in.
2. Stop the Desktop: sudo systemctl stop gdm
3. Nuke existing drivers:
1 sudo apt remove --purge "*nvidia*" -y || sudo dpkg --purge --force-depends $(dpkg -l
| grep nvidia | awk '{print $2}')
2 sudo apt autoremove -y
4. Manual Install:
1 cd ~/nvidia-565-manual
2 sudo dpkg -i *.deb
5. The Shield (Critical): Lock these versions so apt can never upgrade them to 580:
1 dpkg-query -W -f='${Package}\n' | grep 565 | xargs sudo apt-mark hold
2 sudo apt-mark hold libnvidia-egl-wayland1
6. The Glue: Install any remaining standard system dependencies:
1 sudo apt install -f
7. Finalize:
1 sudo update-initramfs -u
2 sudo reboot
Why this works
* dpkg -i: Places the specific 565.77 files on disk without checking the "poisoned"
Pop!_OS repositories.
* apt-mark hold: Creates a permanent block that prevents Pop!_OS's 1001-priority rules
from forcing an upgrade to 580.
* Proprietary modules: By choosing the non-open binaries, we avoid the experimental
memory-mapping bugs in the NVIDIA Open driver.
---
Pro-tip: If you ever need to upgrade in the future, you must sudo apt-mark unhold these
packages first.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment