Install gpu unlock on Ubuntu so the module loads first

The install is one ordering problem, and on gpu-unlock Ubuntu it is a packaging problem too. gpu_unlock has to sit inside the initramfs, ahead of nvidia, and then you have to ask for it on the kernel command line. Everything below is that problem on one distribution.

Three gpu unlock checks before you start

A Fedora 43 machine with Secure Boot on is reported working through MOK signing in issue #173. Turning Secure Boot off is the other route, and it is a different decision, worth making deliberately. [official README]

The whole gpu unlock install, in four moves

  1. Build and install the package

    make install reads /etc/os-release and picks the right packaging, or name it: make install-arch / install-deb / install-rpm.
  2. Get the drop-in into your initramfs generator

    Four targets, four locations. The file has to be where your generator looks, not where the README example was written for.
  3. Opt in on the kernel command line

    gpu_unlock.targets=all, or the individual PCI addresses. Nothing happens without it.
  4. Verify the module is inside the image, then that it ran

    Two commands, two different questions. The order matters: a module that is missing from the image cannot have run.

Four gpu unlock install paths

The project ships packaging for the three big families plus Unraid, and a dispatcher that reads /etc/os-release for you.

pick a path
# reads ID / ID_LIKE and picks the right installer
make install

# or name it
make install-arch   # makepkg
make install-deb    # dpkg-buildpackage + apt
make install-rpm    # rpmbuild + dnf

# build without installing
make arch / make deb / make rpm
  • Unraid is the exception: it has no make path, and the only thing published under Releases is an Unraid plugin package.
  • AUR is not in the list either. The package is still an open pull request #223.

Whichever path you take, the build is what produces the firmware:

  • Inputs come from NVIDIA and CachyOS and land in ~/.cache/gpu-unlock/inputs.
  • They are compiled into the module directory and the package.
  • make inputs refreshes them; INPUTS= points the build somewhere else.
  • A source package does not carry the firmware, which matters later when you wonder why a copied blob does nothing.
[official README]

How the initramfs generator changes gpu unlock

Four targets, four drop-in locations, and one of them is not where you expect.

  • Drop-in paths as listed by the project. A file written for one generator does nothing on another.
  • mkinitcpio

    Drop-in file
    /etc/mkinitcpio.conf.d/zz-gpu-unlock.conf
    Typical distros
    Arch, CachyOS, EndeavourOS
  • initramfs-tools

    Drop-in file
    /usr/share/initramfs-tools/modules.d/gpu-unlock.conf
    Typical distros
    Debian, Ubuntu up to 25.04
  • dracut

    Drop-in file
    /usr/lib/dracut/dracut.conf.d/gpu-unlock.conf
    Typical distros
    Fedora, RHEL, openSUSE, Ubuntu 25.10 and 26.04
  • UKI / generated entries

    Drop-in file
    /etc/kernel/cmdline, then rebuild
    Typical distros
    any install that boots a unified kernel image

The trap sits in the third row, and it is the most common way a gpu-unlock Ubuntu install fails without saying so. The Debian package writes an initramfs-tools drop-in only, so on Ubuntu 25.10 or 26.04, where the boot goes through dracut, the module never makes it into the image.

You will not see an error at install time. You will see a log with no gpu_unlock lines at all, which is the tell. issue #54 has the manual drop-in, which is one install command.

Install under dracut

One more generator detail that bites people on Arch: mkinitcpio -c <config> and preset files with _config ignore drop-ins entirely. If your preset does that, the module will not be included no matter what you put in zz-gpu-unlock.conf.

The kernel parameter that opts gpu unlock in

A gpu-unlock Ubuntu install does nothing until you name the cards you want handled. That is deliberate: the module is installed on machines where it must do nothing by default.

kernel command line
gpu_unlock.targets=all                          # every supported, unbound card
gpu_unlock.targets=0000:21:00.0                 # one card
gpu_unlock.targets=0000:21:00.0,0000:22:00.0    # two cards
  • The addresses are full lspci -D names, unrelated to GPU numbering or to which card is driving your display.
  • Entries that are not in the whitelist get logged and skipped, including when you mix all with explicit addresses.
  • The replay after a suspend and resume is on by default. gpu_unlock.resume=0, or writing 0 to /sys/module/gpu_unlock/parameters/resume, turns it off, for machines where the replay is what fails.

How you write the parameter depends on the bootloader, and the difference matters more than it looks: a parameter added to a running session does nothing for the next boot.

per distro
# Debian / Ubuntu / Mint  ->  /etc/default/grub, then update-grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash gpu_unlock.targets=all"

# Arch / CachyOS
sudo grub-mkconfig -o /boot/grub/grub.cfg

# Fedora / RHEL
sudo grubby --update-kernel=ALL --args="gpu_unlock.targets=all"

# systemd-boot: edit the options line (bootctl status shows the path)
# UKI: write /etc/kernel/cmdline, then rebuild

Verify gpu unlock before you trust it

Verify a gpu-unlock Ubuntu install with two checks, in order: is the module inside the image, and did it actually run.

verify
lsinitramfs /boot/initrd.img-$(uname -r) | grep gpu_unlock
journalctl -k -b | grep gpu_unlock
  1. install problem

    First command prints nothing

    An installation problem: the module is not in the image. Fix the drop-in path and rebuild before looking anywhere else.
  2. timing problem

    First command prints a path, second prints nothing

    A timing problem: the module is there and never ran. That is the -16 page.
  3. working

    A healthy boot logs gpu_unlock: unlocked, then a chain

    claim, layout, dma, gfw, fwsec, publish, pass, host, flr, handoff ret=0. Where that chain stops is the diagnosis.

    [issue #258]

Roll back gpu unlock in three steps

  1. Remove the parameter from the kernel command line

    gpu_unlock.targets is what opts the module in. Nothing else has to change.
  2. Rebuild the bootloader configuration

    update-grub, grub-mkconfig, grubby, or the UKI rebuild — whichever your boot flow uses.
  3. Cold boot

    The card was never modified, so that is enough. If you also want the package gone, uninstall it rather than deleting files: it owns the module and the drop-in.

The exception is a machine where a failed run left the firmware unsettled. In that case the module keeps its DMA buffer until the next power cycle, so shut down, unplug, and start again rather than restarting into the same state.

Rebuild gpu unlock after a kernel update

Any kernel or initramfs change on a gpu-unlock Ubuntu machine needs a rebuild, or the module disappears along with the kernel it was built for.

  • On initramfs-tools and dracut, a hook handles new kernels once the package is installed.
  • On mkinitcpio it depends on the preset, and the _config case above applies again.

The symptom is not an error message. The card simply stays locked, and the only trace is the missing gpu_unlock: unlocked line in the boot log.

Version, commit and the date of this check are on every page of this site. [official README] carries the current instructions; the paths above were checked against them.

Next: if the module is in the image and the log still shows no gpu_unlock line, that is the -16 page. If the log shows -2 instead, the firmware never made it in.

Checked VERSION 2.0.0commit 1fc6d62