Load a modified VBIOS per NVIDIA GPU at boot on Linux, in memory, through the open kernel modules
Python
22
13 commits
updated Oct 19, 2026
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.
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: synthetic and container tests only |
| 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:
nvbios normalize edited.rom gpu0.bin --representation ada-relocated-v1 (0.1.5 or newer).--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.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.
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.
nvidia-smi must list your GPUs.git clone --depth 1 --branch 615.78.08 https://github.com/NVIDIA/open-gpu-kernel-moduleskernel-devel on Fedora), make, dracut,
grub2-editenv and mokutil. With DNF5, also libdnf5-plugin-actions.GRUB_DEFAULT=saved and GRUB_ENABLE_BLSCFG=true (Fedora's defaults).--signing-key and --signing-certificate to prepare../nvbios-<version>-linux-x86_64 normalize edited.rom gpu0.bin.
For Ada and Ampere, add the --representation given above (ada-relocated-v1, ada-relocated-v2 or
ampere-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.bin next to an edited Ada or Ampere copy.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-gui
Run 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 --device per GPU (--userspace manual for the .run driver; rpm, deb or
pacman for 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-run shows 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 status compares 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-modules
Keep --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 (.run installs): run sudo nvbios system pre-install before 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-install before 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, run
post-install from that boot; it works even while nvidia-smi fails.
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 status before 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) and status shows the post-install command.
post-install (see above).sudo nvbios system disable stops automatic rebuilds and restores the normal entry as default.sudo nvbios system rollback TRANSACTION_ID undoes one install, enroll or enable step; the IDs are printed
by those commands.There is no uninstall command yet. After a kernel update, the modules this tool builds can be the only NVIDIA kernel modules for that kernel, and the normal boot entry may load them too. Restore normal modules first:
sudo nvbios system disable..run
installer for that kernel (--kernel-name=KERNEL). Then
rebuild its normal initramfs with sudo dracut -f --kver KERNEL./usr/lib/modules/*/updates/vbios-override aside (for example to /var/backups/vbios-override),
run sudo depmod -a KERNEL for each kernel, reboot into the normal entry and check that nvidia-smi works./usr/local/bin/nvbios, /usr/libexec/nvidia-vbios and /usr/local/lib/nvidia-vbios-tools/etc/nvidia-vbios and /var/lib/nvidia-vbios/usr/lib/systemd/system/nvidia-vbios-reconcile.{service,path,timer}, then sudo systemctl daemon-reload/usr/lib/kernel/install.d/99-nvidia-vbios.install and /etc/dnf/libdnf5-plugins/actions.d/nvidia-vbios.actions/boot/loader/entries/vbios-*.conf and /boot/initramfs-*-vbios-*.img/usr/lib/firmware/nvidia/*/vbios-overrideIf nvidia-smi fails in step 3, move the directory back, run depmod -a KERNEL again and fix step 2 first.
PYTHONPATH=src python3 -m unittest discover -s tests
The 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.
Load a modified VBIOS per NVIDIA GPU at boot on Linux, in memory, through the open kernel modules
Python
22
13 commits
updated Oct 19, 2026
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.
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: synthetic and container tests only |
| 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:
nvbios normalize edited.rom gpu0.bin --representation ada-relocated-v1 (0.1.5 or newer).--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.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.
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.
nvidia-smi must list your GPUs.git clone --depth 1 --branch 615.78.08 https://github.com/NVIDIA/open-gpu-kernel-moduleskernel-devel on Fedora), make, dracut,
grub2-editenv and mokutil. With DNF5, also libdnf5-plugin-actions.GRUB_DEFAULT=saved and GRUB_ENABLE_BLSCFG=true (Fedora's defaults).--signing-key and --signing-certificate to prepare../nvbios-<version>-linux-x86_64 normalize edited.rom gpu0.bin.
For Ada and Ampere, add the --representation given above (ada-relocated-v1, ada-relocated-v2 or
ampere-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.bin next to an edited Ada or Ampere copy.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-gui
Run 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 --device per GPU (--userspace manual for the .run driver; rpm, deb or
pacman for 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-run shows 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 status compares 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-modules
Keep --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 (.run installs): run sudo nvbios system pre-install before 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-install before 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, run
post-install from that boot; it works even while nvidia-smi fails.
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 status before 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) and status shows the post-install command.
post-install (see above).sudo nvbios system disable stops automatic rebuilds and restores the normal entry as default.sudo nvbios system rollback TRANSACTION_ID undoes one install, enroll or enable step; the IDs are printed
by those commands.There is no uninstall command yet. After a kernel update, the modules this tool builds can be the only NVIDIA kernel modules for that kernel, and the normal boot entry may load them too. Restore normal modules first:
sudo nvbios system disable..run
installer for that kernel (--kernel-name=KERNEL). Then
rebuild its normal initramfs with sudo dracut -f --kver KERNEL./usr/lib/modules/*/updates/vbios-override aside (for example to /var/backups/vbios-override),
run sudo depmod -a KERNEL for each kernel, reboot into the normal entry and check that nvidia-smi works./usr/local/bin/nvbios, /usr/libexec/nvidia-vbios and /usr/local/lib/nvidia-vbios-tools/etc/nvidia-vbios and /var/lib/nvidia-vbios/usr/lib/systemd/system/nvidia-vbios-reconcile.{service,path,timer}, then sudo systemctl daemon-reload/usr/lib/kernel/install.d/99-nvidia-vbios.install and /etc/dnf/libdnf5-plugins/actions.d/nvidia-vbios.actions/boot/loader/entries/vbios-*.conf and /boot/initramfs-*-vbios-*.img/usr/lib/firmware/nvidia/*/vbios-overrideIf nvidia-smi fails in step 3, move the directory back, run depmod -a KERNEL again and fix step 2 first.
PYTHONPATH=src python3 -m unittest discover -s tests
The 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.