English | Español
Loads a modified VBIOS for each NVIDIA GPU at boot on Linux, in memory: the card's flash chip is never written. It patches the NVIDIA open kernel modules so the GSP firmware starts with your VBIOS image, builds them in a separate boot entry, rebuilds them automatically after kernel updates, and keeps your normal boot entry as a fallback.
Works with NVIDIA 615.x (R615) drivers. It may stop working in a future driver if NVIDIA decides to change or
remove the override, so after every driver update run nvbios system status and check an edited value (for
example the power limits in nvidia-smi -q -d POWER).
Thanks to @pantsoftime (overclock.net), whose original vbios_override patch
this project is built on. Without it, none of this would have been possible.
To modify the VBIOS, use NVIDIA VBIOS Vix Editor. This repository only loads it. On Windows, use NVIDIA Windows VBIOS Vix Loader.
This project is not affiliated with or endorsed by NVIDIA. NVIDIA and GeForce are trademarks of NVIDIA Corporation.
Warning. A modified VBIOS can raise power, clocks and voltages beyond the card's design limits. You can damage hardware. Keep a copy of your original ROM and use this at your own risk.
| Platform | State |
|---|---|
Fedora 43, GRUB/BLS, dracut, DNF5, NVIDIA 615.x open kernel modules installed with the .run installer |
Supported: used on real hardware |
RHEL family, Debian/Ubuntu, Arch/CachyOS/EndeavourOS, systemd-boot, UKI, Secure Boot (all with the .run driver) |
Experimental: users report it working on Ubuntu, Kubuntu, Debian, CachyOS and Arch Linux; the maintainer only uses Fedora |
| NVIDIA drivers from a package manager (RPM Fusion, NVIDIA repos, apt, pacman), open kernel modules 615+ | Experimental: synthetic tests only |
| rpm-ostree, proprietary NVIDIA kernel modules, drivers older than 615 | Not supported |
After a package-manager driver upgrade the loader downloads the matching tag from github.com/NVIDIA/open-gpu-kernel-modules
once, compares it with the distribution's own copy of the source when it recognises the package layout, and rebuilds.
NVIDIA's repositories and Arch install the whole tree, which is compared whole. RPM Fusion and Ubuntu install only
kernel-open, so the tag's top-level Makefiles and src/ are trusted on GitHub's TLS alone
(cross_check: kernel-open-only in nvbios system status).
Offline, with a P2P profile, or on any mismatch, it moves its modules aside and selects the newest normal entry whose
own NVIDIA module (from the distribution) was built for the new version, and whose boot image does not load another
NVIDIA build; it boots without the override. If there is none, the previous entry stays the default.
nvbios system status shows the post-install command.
--no-auto-source (on prepare) turns off the download.
Tested working on: RTX PRO 6000 Blackwell Max-Q, RTX PRO 6000 Blackwell Workstation Edition, GeForce RTX 5090, 5080, 5070 Ti, 5070, 5060 Ti and RTX 2000 Ada.
Ada GSP firmware loads at most 512 KiB, counted from the payload's legacy image, so Ada payloads must be relocated with Vix Editor:
- RTX 2000 Ada (tested):
nvbios normalize edited.rom gpu0.bin --representation ada-relocated-v1(0.1.5 or newer). - Experimental, not tested on hardware: other desktop and workstation Ada GPUs with
--representation ada-relocated-v2(0.1.6 or newer). It works offline on images of the RTX 4090, 4080 (SUPER), 4070 Ti SUPER, 4070 (SUPER), 4060 Ti, 4060 and RTX 6000/5000/4500/4000 Ada; anything that does not verify is refused. If you try it, please open an issue with the result. - The laptop Ada images tested are refused: four do not fit, and the RTX 4090 Laptop image has no UEFI image.
Ampere GA102–GA107 has the same known 512 KiB GSP load limit, counted from the
selected legacy image to the end of the payload. The loader rejects oversized
images during preparation and enrollment, rather than letting firmware silently
use the stock VBIOS. Plain normalized Ampere ROMs exceed it. Experimental, not
tested on hardware: nvbios normalize edited.rom gpu0.bin --representation ampere-relocated-v1
(Vix Editor 0.1.9 or newer) drops the UEFI image and the bytes after the last data image, which
leaves about 443–506 KiB from the legacy image on the images examined (the file keeps
a ~37 KiB prefix that is not sent); anything that does not verify is refused.
If you try it, please open an issue with the result. GA100 uses different firmware
and is outside this capacity audit.
Turing (TU102, TU104, TU106, TU116, TU117), experimental, not tested on any Turing GPU. The patched
module accepts these chips, and their GSP firmware (gsp_tu10x.bin) has the same override receiver and
512 KiB limit (found by static analysis of 615.78.08, not on hardware). A single-bank Turing payload sends
250-355 KB from the legacy image (the file keeps a prefix of up to ~162 KiB that is not sent) and needs no
relocation: nvbios normalize edited.rom gpu0.bin. Vix Editor 0.1.18 or newer also saves
<name>-loader-e0end.bin (--representation turing-e0-end-v1), a variant to try when the first file loads
but the edit does not apply. If GSP refuses an image, the card runs its stock VBIOS. To help, follow the
Turing tester guide: load your unmodified ROM first, then a power-limit edit, and report
nvidia-smi -q -d POWER before and after and the vbios_override line of journalctl -k -b.
Select 1–32 GPUs, repeating --device INDEX PAYLOAD for each one. Indices are
resolved to UUID and PCI address during preparation; assignments and full payload
hashes are checked separately. The configuration is stored in the initramfs,
without adding every GPU to the kernel command line.
The patched module accepts 4094 bytes per registry parameter. A typical 17-GPU configuration uses 1733 bytes for firmware filenames; 32 GPUs use 3263 bytes. Preserved extra registry settings count toward the same budget. Oversized configurations fail before publication. Rebuild through the updated loader: an old module with the original 1024-byte limit cannot load the expanded values. Support above eight GPUs has offline tests; a 17- or 32-GPU hardware boot has not yet been verified.
- A working NVIDIA 615.x (R615) driver with the open kernel modules;
nvidia-smimust list your GPUs. - The unpatched source of the open kernel modules for the exact installed version, for example:
git clone --depth 1 --branch 615.78.08 https://github.com/NVIDIA/open-gpu-kernel-modules - Python 3.11 or newer, the headers for the running kernel (
kernel-develon Fedora),make,dracut,grub2-editenvandmokutil. With DNF5, alsolibdnf5-plugin-actions. - GRUB with
GRUB_DEFAULT=savedandGRUB_ENABLE_BLSCFG=true(Fedora's defaults). - Secure Boot off, or your own module signing key: pass
--signing-keyand--signing-certificatetoprepare. - One VBIOS payload per GPU: a single-chain image for that exact card. Full ROM dumps that contain two
banks are refused. With Vix Editor's command-line tool:
./nvbios-<version>-linux-x86_64 normalize edited.rom gpu0.bin. For Ada and Ampere, add the--representationgiven above (ada-relocated-v1,ada-relocated-v2orampere-relocated-v1); without it the payload exceeds the 512 KiB GSP limit and is refused. Vix Editor 0.1.11 or newer also saves this payload as<name>-loader.binnext to an edited Ada or Ampere copy. Turing needs no--representation(see above).
On Fedora and RHEL-family systems the loader also has a window, as an alternative to the steps under
Install. It needs GTK 4.10 or newer and PyGObject (sudo dnf install python3-gobject gtk4).
./vbios-loader-guiRun it from a clone, without sudo. It shows the driver, kernel, Secure Boot and boot setup it detected and
one row per GPU. For each GPU choose New file (the .rom or <name>-loader.bin the editor saved, checked as
soon as you pick it), Keep the current file or Own VBIOS (no override). Choose where the NVIDIA source comes from (the copy saved
at the last Load, a download of the installed version, or a folder; mark P2P sources), then press Load. It asks
for your password once and runs nvbios system setup, which does steps 2-4 below, with live progress. Then reboot;
your normal boot entry stays in the menu and never loads the override. Remove override runs nvbios system disable. Menu > Details shows nvbios system status.
Tested on Fedora 43 with eight GPUs: two new files (an RTX PRO 4000 Blackwell SFF and an RTX 2000 Ada, both raised to a 106 W power limit) and six kept; after the reboot both reported the new limit.
The window refuses to start as root. Without a graphical password agent (for example over SSH) it prints the
sudo command instead. Secure Boot with your own signing key, other distributions and driver updates with the
.run installer still use the command-line steps.
Run these from a clone of this repository.
-
List the GPUs. Note each GPU's index (as in
nvidia-smi) and match it to its own payload.sudo ./nvbios system devices
-
Prepare a profile, with one
--deviceper GPU (--userspace manualfor the.rundriver;rpm,deborpacmanfor a package-manager driver). This step only writes the output directory.sudo ./nvbios system prepare \ --device 0 /path/to/gpu0.bin \ --device 1 /path/to/gpu1.bin \ --driver-source /path/to/open-gpu-kernel-modules \ --userspace manual --output "$PWD/gpu-profile"A device can also be selected by GPU UUID or PCI address (
--device 0000:03:00.0 ...). -
Install the tool and enroll the profile.
--dry-runshows what would change.sudo ./nvbios system install --repository "$PWD" sudo /usr/local/bin/nvbios system enroll --profile "$PWD/gpu-profile/profile.json"
-
Build the modules and the boot entry, which becomes the default, then turn on automatic rebuilds after updates. Building takes a few minutes.
sudo /usr/local/bin/nvbios system reconcile --kernel "$(uname -r)" sudo /usr/local/bin/nvbios system enable --kernel "$(uname -r)" sudo /usr/local/bin/nvbios system status
-
Reboot. Your normal entry stays in the boot menu. After the reboot,
sudo nvbios system statuscompares the loaded module and parameters with the prepared ones.
After updating this checkout, replace the installed runtime and rebuild for the running kernel using the source for your currently installed NVIDIA driver:
sudo nvbios system pre-install
sudo nvbios system install --repository "$PWD"
sudo nvbios system post-install --source /path/to/current-open-kernel-modulesKeep --p2p-preferred on post-install if your existing profile requires a P2P
source. This sequence updates the loader and builds a new boot image; it does not
reinstall NVIDIA userspace or reload active GPU modules. Wait for post-install
to complete, then reboot. An older installed runtime or module does not gain the
expanded GPU count merely by downloading this repository.
-
Kernel updates are handled automatically: the package hook and a retry timer rebuild the modules and the boot entry for the new kernel.
-
Driver updates (
.runinstalls): runsudo nvbios system pre-installbefore removing the old driver, install the new driver, then register the matching unpatched source of the new version:sudo nvbios system post-install --source /path/to/open-gpu-kernel-modules-NEW
It builds and selects the new boot entry and resumes automatic updates. Reboot when it finishes.
Run
post-installbefore rebooting. Until then the modules built for the previous driver take priority in every boot entry, including the normal one, so the NVIDIA driver will not start. If you already rebooted, runpost-installfrom that boot; it works even whilenvidia-smifails. -
Driver updates (package manager, experimental): nothing to run. The package hook downloads the matching source and rebuilds during the upgrade (see Status). Check
sudo nvbios system statusbefore rebooting: if it could not rebuild, a normal entry with the distribution's new module is the default (or the previous entry, if there is none) andstatusshows thepost-installcommand.
- Choose your normal entry in the boot menu (press Esc or hold Shift while the computer starts); it does not
load any override. It still uses the modules this tool built, so it does not help after a driver update without
post-install(see above). sudo nvbios system disablestops automatic rebuilds and restores the normal entry as default.- To remove the loader completely, see Uninstall.
- If
nvidia-smistops listing a GPU after you boot an override, the NVIDIA driver most likely could not use that GPU's override (sudo dmesg | grep NVRMshows the error). The loader then refuses to load ("NVIDIA driver did not initialize GPU ..."). Reboot and choose the normal entry (without "VBIOS override" in its name), then pick another file or Own VBIOS (no override) for that GPU and press Load. Remove override and a reboot also work. sudo nvbios system rollback TRANSACTION_IDundoes one install, enroll or enable step; the IDs are printed by those commands.
Run it from an up-to-date clone of this repository: an installed /usr/local/bin/nvbios has the command only when it
was installed from this version or a later one.
sudo ./nvbios system uninstall --dry-run
sudo ./nvbios system uninstallThe command is new and has only been tested on synthetic systems so far. Run --dry-run first, and if anything in
its output looks wrong, open an issue with that output before running it for real.
--dry-run lists what would be removed and changes nothing. Uninstall works on every distribution and boot setup this
tool supports, and it needs neither the GPU nor a working NVIDIA driver, so it also works after the driver was removed
or replaced. In order, it:
- Removes the package, kernel and systemd hooks, so nothing builds the override again.
- With GRUB, makes a normal entry the default, preferring kernels that keep an NVIDIA driver: on Fedora the entry of the override's kernel, elsewhere the newest kernel's (the menu's top entry, which follows later kernels). With systemd-boot, clears the override default. A default you chose yourself, such as another system, stays.
- Removes the override boot entries and their images.
- Removes the modules it built, runs
depmod, and rebuilds a kernel's normal initramfs if it contains them. A normal UKI that contains them is left to the tool that made it, unless that is mkinitcpio: uninstall names the command (such askernel-install add KERNEL /usr/lib/modules/KERNEL/vmlinuz) and finishes when run again. - Removes the VBIOS files it gave the driver, its state (
/etc/nvidia-vbios/lifecycle.jsonand/var/lib/nvidia-vbios) and, last,nvbiositself.
On GRUB systems other than Fedora, GRUB_DEFAULT=saved stays in /etc/default/grub. If you set it only for the
loader, set GRUB_DEFAULT=0 again and run sudo update-grub (or sudo grub-mkconfig -o /boot/grub/grub.cfg) and
sudo grub-set-default 0.
It deletes only the loader's own files; anything else it finds is listed under kept. On a boot or EFI partition
shared with another system that also uses the loader, that system's entries and images are kept as well. The enrolled
payloads in /var/lib/nvidia-vbios/roms are deleted too, so copy that folder first if you need them. Your signing
keys and your Secure Boot key (MOK) are not touched. If it stops halfway, it says why and keeps what it needs to
finish: fix that and run it again. Running it twice is harmless. Reboot when it is done, before suspending or using
CUDA.
The modules this tool builds can be the only NVIDIA kernel modules of a kernel, for example a kernel installed
after a .run driver. Uninstall then stops before changing anything and names that kernel. Install the driver's own
module for it and run uninstall again:
.rundriver:sudo sh NVIDIA-Linux-x86_64-VERSION.run --kernel-module-only --kernel-name=KERNEL, with the version of the installed driver.- Package-manager driver: reinstall its kernel module package, or rebuild the module with
sudo akmods --force --kernels KERNEL. DKMS can refuse to install over the loader's module: usesudo dkms install --force NAME/VERSION -k KERNEL, with the name and versiondkms statuslists, or run uninstall with--allow-missing-moduleand thensudo dkms autoinstall -k KERNEL.
--allow-missing-module removes them anyway; that kernel then starts without the NVIDIA driver until you install one.
-
GRUB: open the boot menu (press Esc or hold Shift while the computer starts), select the normal entry (without "VBIOS override" in its name), press
e, addmodule_blacklist=nvidia,nvidia_drm,nvidia_modeset,nvidia_uvm,nvidia_peermemat the end of thelinuxline and start it with Ctrl+X or F10. With systemd-boot, select the normal entry, presse, add the same text and press Enter. NVIDIA stays off for that boot only. Then run the uninstall from a clone. -
Recovery mode works too: first run
mount -o remount,rw /and, if/bootor the EFI partition is separate,mount -a. The clone must already be on the computer, or turn on networking in the recovery menu to download it. -
From a live USB (the only way with a signed UKI, whose command line cannot be edited): mount the installed system on
/mnt, with/bootand the EFI partition at their usual places below it, copy this repository (a clone or the extracted ZIP from GitHub) to/mnt/opt/vix-loader, then run:for d in dev proc sys run; do sudo mount --rbind /$d /mnt/$d; done sudo chroot /mnt /usr/bin/python3 /opt/vix-loader/nvbios system uninstall
Only if the command cannot run at all. As root:
systemctl disable --now nvidia-vbios-reconcile.path nvidia-vbios-reconcile.timer(in a chroot, without--now). Delete whichever of these exist, then runsystemctl daemon-reload:/usr/lib/systemd/system/nvidia-vbios-reconcile.{service,path,timer},/usr/lib/kernel/install.d/99-nvidia-vbios.install,/etc/kernel/postinst.d/zz-nvidia-vbios,/etc/kernel/postrm.d/zz-nvidia-vbios,/etc/apt/apt.conf.d/99-nvidia-vbios,/etc/pacman.d/hooks/99-nvidia-vbios.hook,/etc/dnf/libdnf5-plugins/actions.d/nvidia-vbios.actionsand/etc/dnf/plugins/post-transaction-actions.d/nvidia-vbios.action.- Make a normal entry the default:
grub2-set-default 0(Fedora),grub-set-default 0(other GRUB systems) orbootctl set-default ""(systemd-boot). - Delete the override boot files. On Fedora:
/boot/loader/entries/vbios-*.confand/boot/initramfs-*-vbios-*.img. Elsewhere:/etc/grub.d/41_nvidia_vbios,/boot/grub/nvidia-vbios-entries, and on/bootor the EFI partition thenvidia-vbiosfolder and thevbios-*files inloader/entriesorEFI/Linux(if another system on the computer also uses the loader, only thevbios-*folders and files of this system's kernels). With GRUB, then delete/boot/grub/nvidia-vbios.cfgand runupdate-grub(orgrub-mkconfig -o /boot/grub/grub.cfg). With a hand-writtengrub.cfg, run neither: delete its linesource $prefix/nvidia-vbios.cfg, then/boot/grub/nvidia-vbios.cfg. - Move each
/usr/lib/modules/KERNEL/updates/vbios-overrideto a backup folder of its own (for example/var/backups/vbios-override-KERNEL), and/usr/lib/modules/.vbios-*too. Rundepmod -a KERNELfor every installed kernel and check thatmodinfo -k KERNEL -F filename nvidiaprints a module (if not, see above, or move that kernel's folder back and rundepmod -a KERNELagain). - Rebuild the normal initramfs:
dracut -f --kver KERNEL,update-initramfs -u -k allormkinitcpio -P. - Delete
/usr/lib/firmware/nvidia/*/vbios-override,/usr/local/bin/nvbios,/usr/libexec/nvidia-vbios,/usr/local/lib/nvidia-vbios-tools,/etc/nvidia-vbiosand/var/lib/nvidia-vbios. First move out any key you keep in/etc/nvidia-vbios, and copy/var/lib/nvidia-vbios/romsif you want the payloads. Reboot, check thatnvidia-smiworks, then delete the module backups.
PYTHONPATH=src python3 -m unittest discover -s testsThe tests use synthetic files only; they never touch a GPU, /boot or the installed system.
Copyright (C) 2026 panchovix. GNU General Public License v3.0 or later (GPL-3.0-or-later), see
LICENSE: you can use, study, change and share it, and changed versions you share must stay under
the same license.
The kernel module patches (patches/*.patch) and src/nvidia_vbios/driver/_payload.py derive from NVIDIA's
open kernel modules and stay under the MIT license, so a patched module can still be built and shared with the
Linux kernel (GPLv2). See THIRD_PARTY_NOTICES.md. Earlier versions were released under
the MIT license.