Fedora

Fix Fedora 45 Third-Party Repo 404s: Docker, VirtualBox, CUDA

A vendor repo with no Fedora 45 tree does not stop dnf. It prints “Usable URL not found”, loads every other repo and carries on, so the failure surfaces one command later as “No match for argument: terraform”, or worse, as dnf swapping your PostgreSQL server for a different build in the middle of an unrelated install. Find the broken repo before you install anything from it.

Original content from computingforgeeks.com - post 172738

Most third-party repo files build their URL from $releasever, so on Fedora 45 they ask for a /45/ directory that Docker, Oracle, HashiCorp and the PostgreSQL project publish on their own schedule. NVIDIA hardcodes the release in its repo file instead, which fails the same way. Below is the fix that worked per vendor. Pinning to Fedora 44 is not always safe, and two vendors prove it. We re-ran every vendor repo row on 3 November 2026 against the final Fedora 45 repos, on a fresh install with SELinux enforcing and Secure Boot on, and on a box upgraded from Fedora 44.

Third-party repo status on Fedora 45

The big change since our October run is Docker: its Fedora 45 tree now carries the full package set, buildx included. Every vendor row below comes from one Fedora 45 VM where we installed real packages from each repo instead of trusting a curl of the metadata; the release-agnostic row was only probed this time:

RepoFedora 45 treeWhat breaksFix that workedChecked
Docker CEFull tree (HTTP 200): 7 packages, all fc45. The documented install takes six of them: docker-ce and docker-ce-cli 29.9.2, containerd.io 2.4.2, docker-buildx-plugin 0.38.1, docker-compose-plugin 5.7.0 and docker-ce-rootless-extrasNothing. An upgrade from 44 moves every Docker package to its fc45 buildNone. Drop the scoped Fedora 44 buildx repo if you added it3 Nov 2026
HashiCorp404No match for argument: terraformPin the repo to the 44 tree with a dnf5 override3 Nov 2026
Oracle VirtualBox404Pinned to 44: nothing provides libvpx.so.9()(64bit)RPM Fusion VirtualBox with a signed akmod3 Nov 2026
NVIDIA CUDANo fedora45 tree (404); the repo file is hardcoded to fedora44Nothing, because the file never asks for 45Install from the fedora44 repo, driver packages excluded3 Nov 2026
PGDG PostgreSQL404 for every stable version (14 to 18) and for common; F-45 repo RPM 404; testing tree presentPinned to 44: nothing provides libperl.so.5.42()(64bit)Repo RPM from F-44, then the PGDG testing tree for 453 Nov 2026
RPM Fusionreleases/45 404; the metalink resolves to development/45Nothing. Release package 45-0.2 leaves the -updates repos disabled and empty and serves packages from -updates-testing, where 45-0.3 already waitsNone needed3 Nov 2026
VS Code, GitHub CLI, TailscaleOne tree for all Fedora releasesNothingNone neededInstalled 4 Oct, probed 3 Nov 2026

The release-agnostic repos at the bottom use one URL for every Fedora release, which is why they never 404. Anything with $releasever in the base URL depends on the build calendar each vendor keeps, so treat this table as dated evidence, not a promise. The HashiCorp, PGDG and RPM Fusion rows are the ones most likely to change next, and the undo table near the end tells you how to spot it on your own machine.

Finding the repo that fails

Fedora ships skip_if_unavailable=True in /usr/share/dnf5/libdnf.conf.d/20-fedora-defaults.conf. That’s why a dead repo is a warning and not an error, and why it’s so easy to miss. Confirm the setting on your machine:

dnf --dump-main-config | grep -E "^skip_if_unavailable"

Fedora 45 reports it enabled:

skip_if_unavailable = 1

Refresh the metadata and keep only the repo name that sits above each failure. The grep -v drops the raw “Status code: 404” lines, which repeat once per mirror attempt:

sudo dnf makecache --refresh 2>&1 | grep -vE "Status code" | grep -B1 "Usable URL not found" | grep -v -- "--"

With the vendor repos added the way each vendor documents, eight repos had no Fedora 45 tree on our box. Six of them are the PGDG stable repos, because the PGDG repo RPM enables PostgreSQL 14 through 18 plus a common repo:

 Fedora 45 - x86_64 - VirtualBox        100% |   8.7 KiB/s |  27.6 KiB |  00m03s
>>> Usable URL not found
 PostgreSQL 18 for Fedora 45 - x86_64   100% | 211.0   B/s | 584.0   B |  00m03s
>>> Usable URL not found
 PostgreSQL 17 for Fedora 45 - x86_64   100% | 209.0   B/s | 584.0   B |  00m03s
>>> Usable URL not found
 PostgreSQL 16 for Fedora 45 - x86_64   100% | 226.0   B/s | 584.0   B |  00m03s
>>> Usable URL not found
 PostgreSQL 15 for Fedora 45 - x86_64   100% | 348.0   B/s | 584.0   B |  00m02s
>>> Usable URL not found
 PostgreSQL 14 for Fedora 45 - x86_64   100% | 361.0   B/s | 584.0   B |  00m02s
>>> Usable URL not found
 PostgreSQL common RPMs for Fedora 45 - 100% | 406.0   B/s | 584.0   B |  00m01s
>>> Usable URL not found
 Hashicorp Stable - x86_64              ???% | 620.0   B/s | 314.0   B |  00m01s
>>> Usable URL not found

Docker is missing from that list, which is the first sign its row changed. Those are display names, though, and every fix below needs the repo ID. Map them:

dnf repo list --enabled | grep -iE "virtualbox|hashicorp|pgdg|docker"

The first column is the ID:

docker-ce-stable      Docker CE Stable - x86_64
hashicorp             Hashicorp Stable - x86_64
pgdg14                PostgreSQL 14 for Fedora 45 - x86_64
pgdg15                PostgreSQL 15 for Fedora 45 - x86_64
pgdg16                PostgreSQL 16 for Fedora 45 - x86_64
pgdg17                PostgreSQL 17 for Fedora 45 - x86_64
pgdg18                PostgreSQL 18 for Fedora 45 - x86_64
pgdg-common           PostgreSQL common RPMs for Fedora 45 - x86_64
virtualbox            Fedora 45 - x86_64 - VirtualBox

Before pinning anything, ask the vendor which release directories exist. This loop probes the HashiCorp tree for 45, 44 and 43:

for v in 45 44 43; do printf "%s %s\n" $v $(curl -s -o /dev/null -w "%{http_code}" https://rpm.releases.hashicorp.com/fedora/$v/x86_64/stable/repodata/repomd.xml); done

A 200 means that tree has metadata. Fedora 44 is still the newest one HashiCorp publishes:

45 404
44 200
43 200

Swap the URL for any other vendor. The repodata/repomd.xml path at the end stays the same for every yum-style repo, and the same diagnosis in the terminal looks like this:

dnf makecache on Fedora 45 showing Usable URL not found for the VirtualBox, PGDG and HashiCorp repos

A repo that answers 200 for 45 is not automatically complete. Our October run proved that with Docker, so the next section checks the contents of the tree as well as its existence.

Some stale packages come from Fedora’s own repos

Not every Fedora 45 package problem is a third-party 404. Two popular GNOME extensions that Fedora packages itself get marked OUT OF DATE by GNOME when they come from the wrong repo, as our Workstation checklist found. No repo is missing here. The base fedora repo, frozen at release, carries Dash to Dock 105 and AppIndicator 64, while the updates repo now ships Dash to Dock 110 and AppIndicator 66. Ask dnf which builds each repo holds:

dnf repoquery --qf "%{name} %{version}-%{release} %{repoid}\n" gnome-shell-extension-dash-to-dock gnome-shell-extension-appindicator 2>/dev/null | sort

We unpacked each RPM’s metadata.json to check the supported shells. The fedora builds stop at GNOME 50, and the updates builds add GNOME 51, which is the shell Fedora 45 runs. An install on a box with the updates repo enabled picks the new builds without any pin:

dnf repoquery on Fedora 45 showing Dash to Dock 110 and AppIndicator 66 in the updates repo next to the older fedora repo builds

The fix here is sudo dnf upgrade --refresh before installing extensions, never a repo override. If you disabled updates on a slow connection, turn it back on. Enabling the extensions after a log out and checking their state is covered in the things to do after installing Fedora 45 guide.

Docker CE: the Fedora 45 tree now carries buildx

In October, Docker’s Fedora 45 tree held five packages and no docker-buildx-plugin, so the documented install failed with “No match for argument: docker-buildx-plugin”. That gap is closed. Add the repo the way Docker documents it:

sudo dnf config-manager addrepo --from-repofile https://download.docker.com/linux/fedora/docker-ce.repo

List the newest build of every package Docker now ships for Fedora 45:

dnf repoquery --repo=docker-ce-stable --latest-limit=1 --qf "%{name} %{version}-%{release}\n" 2>/dev/null | sort

Seven packages, every one tagged fc45, with buildx and the model plugin back in the set:

containerd.io 2.4.2-3.fc45
docker-buildx-plugin 0.38.1-1.fc45
docker-ce 29.9.2-1.fc45
docker-ce-cli 29.9.2-1.fc45
docker-ce-rootless-extras 29.9.2-1.fc45
docker-compose-plugin 5.7.0-1.fc45
docker-model-plugin 1.2.9-1.fc45

The documented install command now works as written, with no second repo:

sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Start the daemon and check that the plugins answer:

sudo systemctl enable --now docker
sudo docker buildx version; sudo docker compose version

Both plugins report the Fedora 45 builds:

github.com/docker/buildx v0.38.1 0dbe87f36ed472fe36b6796c3f70b4210a731fc5
Docker Compose version v5.7.0

The repo listing and the installed builds, captured on the lab box:

Docker CE Fedora 45 repo listing docker-buildx-plugin and the full package set with fc45 builds installed

A version string proves little on its own, so we went further. A docker buildx build from a fedora-minimal:45 base produced an image that printed built-on-45 when run, and an nginx service brought up with docker compose up -d answered HTTP/1.1 200 OK on port 8080. Non-root access, SELinux bind mounts and firewall rules are covered in the Docker on Fedora guide. To push the images you build to a self-hosted registry, the private Docker registry setup on Fedora uses these same Docker CE packages on its client and can run the registry container on them too.

One trap is still live. Do not install Fedora’s own docker-buildx package next to Docker CE. It requires Fedora’s docker-cli, which conflicts with docker-ce-cli, and dnf refuses unless you let it remove the Docker CE CLI:

  - package docker-buildx-0.37.1-1.fc45.x86_64 from fedora requires docker-cli, but none of the providers can be installed
  - package docker-buildx-0.38.0-1.fc45.x86_64 from updates requires docker-cli, but none of the providers can be installed
  - installed package docker-ce-cli-1:29.9.2-1.fc45.x86_64 conflicts with docker-ce-cli provided by docker-cli-29.7.2-1.fc45.x86_64 from fedora

The name is the giveaway. Docker CE’s plugin is docker-buildx-plugin, while Fedora’s is docker-buildx, and only the first one belongs on a Docker CE host.

Upgrading from Fedora 44 with Docker CE installed

The upgrade path needs no Docker fix either. We installed Docker CE on a Fedora 44 VM from the stock docker-ce.repo, which gave docker-ce-29.9.2-1.fc44 and docker-buildx-plugin-0.38.1-1.fc44, then ran the system upgrade with no override of any kind:

sudo dnf -y system-upgrade download --releasever=45

The transaction pulled each Docker package from docker-ce-stable and swapped it for the same version rebuilt for 45 (trimmed to two of the six Docker lines):

 docker-buildx-plugin                               x86_64 0:0.38.1-1.fc45                        docker-ce-stable                  72.4 MiB
   replacing docker-buildx-plugin                   x86_64 0:0.38.1-1.fc44                        docker-ce-stable                  72.4 MiB
 docker-ce                                          x86_64 3:29.9.2-1.fc45                        docker-ce-stable                 111.2 MiB
   replacing docker-ce                              x86_64 3:29.9.2-1.fc44                        docker-ce-stable                 111.2 MiB

The same download step logged “Usable URL not found” for VirtualBox, all six PGDG repos and HashiCorp, and still finished with Complete!. After sudo dnf5 offline reboot, the box came back on Fedora 45 with every Docker package on an fc45 build and hello-world running:

After a Fedora 44 to 45 upgrade Docker CE packages are fc45 builds, the CUDA repo file still points at fedora44 and RPM Fusion enables the updates-testing repos

That terminal also answers two questions the next sections deal with. NVIDIA’s repo file still names fedora44 after the upgrade, and RPM Fusion lands on its testing repos. The full upgrade walkthrough, with the database and Python fixes it needs, is in our Fedora 44 to 45 upgrade guide.

Retiring the scoped Fedora 44 buildx repo

If you followed the October version of this guide, your box has a docker-ce-f44-plugins repo limited to docker-buildx-plugin, and buildx installed from it carries an fc44 tag. It still works, but it’s now the wrong source. Confirm the 45 tree has the plugin before you remove anything:

dnf repoquery --repo=docker-ce-stable docker-buildx-plugin 2>/dev/null | grep fc45

Two Fedora 45 builds came back on our box:

docker-buildx-plugin-0:0.38.0-1.fc45.x86_64
docker-buildx-plugin-0:0.38.1-1.fc45.x86_64

Delete the scoped repo file and let dnf move the plugin to the 45 build:

sudo rm /etc/yum.repos.d/docker-ce-f44-plugins.repo
sudo dnf -y upgrade --refresh docker-buildx-plugin

dnf replaced the fc44 package from the old scoped repo with the fc45 one from Docker’s stable repo, and rpm -q docker-buildx-plugin then printed docker-buildx-plugin-0.38.1-1.fc45.x86_64:

dnf upgrade replacing the fc44 docker-buildx-plugin with the fc45 build after removing the scoped Fedora 44 repo

Leaving the old repo in place is not dangerous today, because the .fc45 release tag sorts above .fc44 and the 45 build wins on every upgrade. It is still a repo pointing at an older release that nobody remembers adding, and that is exactly how the next upgrade picks up a stray package. Remove it.

HashiCorp (Terraform, Packer): a pin to the 44 tree

HashiCorp still has no Fedora 45 tree at all. HashiCorp’s docs fetch the repo file with wget and tee; the dnf5 equivalent writes the same file:

sudo dnf config-manager addrepo --from-repofile=https://rpm.releases.hashicorp.com/fedora/hashicorp.repo

The install then fails with nothing more than a missing package:

sudo dnf -y install terraform 2>&1 | grep -vE "Status code: 404" | tail -6

The repo loaded empty:

>>> Usable URL not found
Repositories loaded.
Failed to resolve the transaction:
No match for argument: terraform
You can try to add to command line:
  --skip-unavailable to skip unavailable packages

Do not edit /etc/yum.repos.d/hashicorp.repo by hand. dnf5 can override a single key of one repo, and it records the change in its own file where you can see it and undo it later:

sudo dnf config-manager setopt hashicorp.baseurl=https://rpm.releases.hashicorp.com/fedora/44/\$basearch/stable

The override lands in /etc/dnf/repos.override.d/99-config_manager.repo:

# Generated by libdnf5.
# Do not modify this file manually, use dnf5 config-manager instead.
[hashicorp]
baseurl=https://rpm.releases.hashicorp.com/fedora/44/$basearch/stable

Install from the pinned tree:

sudo dnf -y install terraform packer

Confirm both binaries run:

terraform version | head -1; packer version | head -1; rpm -q terraform packer

Both work on Fedora 45:

Terraform v1.17.1
Packer v1.16.2
terraform-1.17.1-1.x86_64
packer-1.16.2-1.x86_64

The override file, the versions and the linkage check, captured on the lab box:

HashiCorp repo pinned to the Fedora 44 tree with a dnf5 override, Terraform and Packer installed on Fedora 45

HashiCorp’s pin is safe because ldd /usr/bin/terraform says “not a dynamic executable”, so nothing in the binary depends on a Fedora 45 library. Hold every pin to the same test before you trust it:

  • The vendor’s 45 tree returns 404 and its 44 tree returns 200.
  • The pinned packages are static binaries, or link only against sonames Fedora 45 still ships.
  • The pin lives in /etc/dnf/repos.override.d/, never in a hand-edited .repo file.

VirtualBox and PGDG both fail the second line, and the next sections show what that looks like. Full Terraform and OpenTofu setup lives in the Terraform on Fedora guide.

VirtualBox: RPM Fusion instead of a pin

The Oracle repo 404s on Fedora 45 in the same way as the HashiCorp one. If you followed Oracle’s instructions, this repo file is already on the box; if you never added it, skip to the RPM Fusion part of this section:

sudo dnf config-manager addrepo --from-repofile https://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo

Probe Oracle’s 45 and 44 directories:

for v in 45 44; do printf "%s %s\n" $v $(curl -s -o /dev/null -w "%{http_code}" http://download.virtualbox.org/virtualbox/rpm/fedora/$v/x86_64/repodata/repomd.xml); done

Only the 44 tree answers:

45 404
44 200

The obvious fix fails here, and the way it fails is worth seeing. Pin the virtualbox repo to the 44 tree. The Oracle repo file sets repo_gpgcheck=1, so run one makecache for that repo first: dnf asks to import Oracle’s key there, and without it the next command fails on “repomd.xml GPG signature verification error: Signing key not found” instead of showing the real problem.

sudo dnf config-manager setopt virtualbox.enabled=1 virtualbox.baseurl=http://download.virtualbox.org/virtualbox/rpm/fedora/44/\$basearch
sudo dnf makecache --repo=virtualbox

Now ask dnf what it would install:

sudo dnf install --assumeno VirtualBox-7.2 2>&1 | tail -7

Every build in the Oracle tree needs a library Fedora 45 no longer ships:

  - nothing provides libvpx.so.9()(64bit) needed by VirtualBox-7.2-7.2.22_175245_fedora40-1.x86_64 from virtualbox
  - nothing provides libvpx.so.9()(64bit) needed by VirtualBox-7.2-7.2.2_170484_fedora40-1.x86_64 from virtualbox
  - nothing provides libvpx.so.9()(64bit) needed by VirtualBox-7.2-7.2.4_170995_fedora40-1.x86_64 from virtualbox
  - nothing provides libvpx.so.9()(64bit) needed by VirtualBox-7.2-7.2.6_172322_fedora40-1.x86_64 from virtualbox
  - nothing provides libvpx.so.9()(64bit) needed by VirtualBox-7.2-7.2.8_173730_fedora40-1.x86_64 from virtualbox
You can try to add to command line:
  --skip-broken to skip uninstallable packages

Note the fedora40 in every package name, including the new 7.2.22 build Oracle added since October: the builds in Oracle’s 44 directory are made on Fedora 40. Fedora 45 ships libvpx 1.17.0, which provides libvpx.so.12 only. No pin can fix a missing soname.

Oracle VirtualBox repo pinned to Fedora 44 fails on Fedora 45 with nothing provides libvpx.so.9

Undo that pin and switch the Oracle repo off. Pinned, it loads and produces only these dependency errors. Unpinned, it 404s on every dnf run:

sudo dnf config-manager unsetopt virtualbox.baseurl
sudo dnf config-manager setopt virtualbox.enabled=0

RPM Fusion builds VirtualBox against Fedora 45 itself. Enable the free repo (the RPM Fusion setup explains the free and nonfree split):

sudo dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm

On a Secure Boot machine, create the akmods signing key before the akmod is installed. Our October run did it the other way round, and the first build came out unsigned because the key didn’t exist yet. The commands come from RPM Fusion’s Secure Boot howto, which also lists kmodtool and openssl; the order is our recommendation from that failure:

sudo dnf -y install akmods mokutil
sudo kmodgenca -a

The akmod builds against kernel-devel for the running kernel, and the Fedora repos keep only the release build and the newest update of kernel-devel. If kernel-devel-$(uname -r) fails with “No match for argument”, run sudo dnf upgrade --refresh and reboot into the new kernel first. Then install VirtualBox, its akmod and the headers:

sudo dnf -y install VirtualBox akmod-VirtualBox kernel-devel-$(uname -r)

The akmod package starts the module build in the background when the install finishes. Run akmods in the foreground so you know the build is done before you load anything:

sudo akmods --kernels $(uname -r)

The module is built and signed with the new key, yet the kernel still refuses it:

RPM Fusion VirtualBox akmod signed by the akmods key but rejected by Secure Boot until the key is enrolled

That is the expected state, not a broken build. modinfo -F signer vboxdrv names the akmods key, and mokutil --test-key says that key “is not enrolled”, so the firmware has no reason to trust it yet. Queue it for MOK enrollment. You set a one-time password here and type it again in the blue MokManager screen on the next boot:

sudo mokutil --import /etc/pki/akmods/certs/public_key.der

Reboot and press a key during the short countdown when shim offers MOK management. Choose Enroll MOK, Continue and Yes, enter that password, then pick Reboot. The NVIDIA driver guide has screenshots of each MokManager screen. Back in Fedora, confirm the modules load with Secure Boot still on:

mokutil --sb-state; lsmod | grep -E "^vbox"; systemctl is-active vboxdrv; VBoxManage --version

MokManager needs a keypress at the console, which our November lab could not send, so this output is from the October run of the same sequence on Fedora 45 with RPM Fusion’s 7.2.18 build. All three modules loaded and a test VM registered and deleted cleanly:

SecureBoot enabled
vboxnetadp             32768  0
vboxnetflt             49152  0
vboxdrv               774144  2 vboxnetadp,vboxnetflt
active
7.2.18_RPMFUSIONr175117

Do not switch Secure Boot off to make the error go away. One enrollment covers every later akmod rebuild signed with this key. If a kernel module is not a hard requirement for you, KVM needs none of this: see the KVM and virt-manager guide. The VirtualBox install guide covers the vboxusers group and the Oracle Extension Pack, and the Vagrant with VirtualBox guide builds on this setup.

CUDA from the fedora44 repo

NVIDIA doesn’t use $releasever. Its repo file names the release outright, and there is still no fedora45 directory:

for r in fedora45 fedora44; do printf "%s %s\n" $r $(curl -s -o /dev/null -w "%{http_code}" https://developer.download.nvidia.com/compute/cuda/repos/$r/x86_64/repodata/repomd.xml); done

The probe returned fedora45 404 and fedora44 200. The repo file hardcodes baseurl=https://developer.download.nvidia.com/compute/cuda/repos/fedora44/x86_64, so it never asks for a 45 tree and never 404s, and on our upgraded box it kept loading through the whole 44 to 45 upgrade. The flip side is that nothing will move you to a fedora45 repo when NVIDIA publishes one; the undo table covers that. Add the fedora44 repo file:

sudo dnf config-manager addrepo --from-repofile=https://developer.download.nvidia.com/compute/cuda/repos/fedora44/x86_64/cuda-fedora44.repo

That repo also carries NVIDIA’s own driver packages. If your GPU driver comes from RPM Fusion, which is the path we tested, hide them from this repo the way RPM Fusion’s CUDA howto does. The quotes keep your shell from expanding the globs:

sudo dnf config-manager setopt "cuda-fedora44-$(uname -m).exclude=nvidia-driver*,cuda-drivers*,nvidia-modprobe,nvidia-persistenced,nvidia-settings,nvidia-libXNVCtrl*,nvidia-xconfig,nvidia-open,nvidia-imex,nvidia-kmod-common,libnvidia-fbc,kmod-nvidia-*-dkms,nvidia-fs*,nvidia-gds*,xorg-x11-nvidia*"

Before the exclude, a dnf repoquery on this repo listed nvidia-driver and nvidia-open 615.71.10 plus cuda-drivers 610.57.04. After it, the same query returned only the two cuda-nvcc toolkit packages we asked about.

Compiler support decides whether CUDA works here at all. Fedora 45 ships GCC 16, and nvcc refuses host compilers newer than it knows about. Install only the compiler, the runtime headers and the C++ front end:

sudo dnf -y install cuda-nvcc-13-4 cuda-cudart-devel-13-4 gcc-c++

CUDA 13.4 accepts GCC 16, because its host_config.h only errors out on __GNUC__ > 16. Prove it with a minimal kernel. Open a file:

nano hello.cu

Paste a kernel that does nothing and a host function that prints one line:

#include <cstdio>
__global__ void k(){}
int main(){k<<<1,1>>>(); printf("compiled\n");}

Compile it with the default host compiler, no -allow-unsupported-compiler:

export PATH=/usr/local/cuda-13.4/bin:$PATH
nvcc hello.cu -o hello; echo nvcc_rc=$?; ls -l hello

The compiler exited cleanly and wrote the binary:

nvcc_rc=0
-rwxr-xr-x. 1 mercy mercy 1079568 Nov  3 12:57 hello

The probe, the filtered repo query, the GCC limit line and the compile, in one terminal:

CUDA fedora44 repo on Fedora 45 with driver packages excluded and nvcc compiling against GCC 16

Older toolkits in the same repo carry their own GCC limit, so check the __GNUC__ line in /usr/local/cuda-*/targets/x86_64-linux/include/crt/host_config.h before you pin a CUDA version below 13.4. Our lab VM has no GPU, so we did not install the driver packages from this repo and cannot vouch for them on Fedora 45. The CUDA toolkit on Fedora guide covers the full toolkit, and the RPM Fusion driver path in the Fedora NVIDIA guide is the one we trust on this release. Keep the exclude in place for that setup.

PGDG PostgreSQL without losing your server

The install command from the PostgreSQL project uses rpm -E %fedora, and the F-45 repo RPM still does not exist:

sudo dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/F-$(rpm -E %fedora)-x86_64/pgdg-fedora-repo-latest.noarch.rpm

dnf stops at “Failed to download files” with a Librepo “Status code: 404” error for the F-45-x86_64 path. The F-44 repo RPM installs fine, because it only drops .repo files that use $releasever:

sudo dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/F-44-x86_64/pgdg-fedora-repo-latest.noarch.rpm

Probe the four trees that matter before you choose a fix:

for p in 18/fedora/fedora-45-x86_64 common/fedora/fedora-45-x86_64 testing/18/fedora/fedora-45-x86_64 testing/common/fedora/fedora-45-x86_64; do printf "%s %s\n" $(curl -s -o /dev/null -w "%{http_code}" https://download.postgresql.org/pub/repos/yum/$p/repodata/repomd.xml) $p; done

The stable trees are still missing and the testing trees are not:

404 18/fedora/fedora-45-x86_64
404 common/fedora/fedora-45-x86_64
200 testing/18/fedora/fedora-45-x86_64
200 testing/common/fedora/fedora-45-x86_64

Pinning pgdg18 to the fedora-44 tree looks like it works at first, because the server and contrib packages resolve. Anything linked to Perl does not. Fedora 45 ships perl-libs 5.44.0, which provides libperl.so.5.44, and the Fedora 44 PGDG build of PL/Perl wants the older soname. We asked for that exact build with the pin applied on the command line:

sudo dnf install --assumeno --setopt=pgdg18.enabled=1 --setopt=pgdg18.baseurl=https://download.postgresql.org/pub/repos/yum/18/fedora/fedora-44-x86_64 --setopt=pgdg18-updates-testing.enabled=0 --setopt=skip_broken=0 --repo=pgdg18 --repo=fedora --repo=updates postgresql18-plperl-18.6-4PGDG.f44

dnf cannot satisfy it (output trimmed to the problem lines):

Problem: conflicting requests
  - nothing provides libperl.so.5.42()(64bit) needed by postgresql18-plperl-18.6-4PGDG.f44.x86_64 from pgdg18
  - nothing provides perl(:MODULE_COMPAT_5.42.3) needed by postgresql18-plperl-18.6-4PGDG.f44.x86_64 from pgdg18

It’s the same soname problem VirtualBox hit with libvpx, and with PGDG 18 already installed, a plain dnf install postgresql18-plperl on that pin is worse than an error. dnf skipped the broken Fedora 44 package and proposed Fedora’s own postgresql-plperl, replacing the PGDG server, client and contrib packages, which is the trap described below. Switch to the testing repos and turn the dead stable ones off, all in one override:

sudo dnf config-manager setopt pgdg-common-testing.enabled=1 pgdg18-updates-testing.enabled=1 pgdg-common.enabled=0 pgdg18.enabled=0 pgdg17.enabled=0 pgdg16.enabled=0 pgdg15.enabled=0 pgdg14.enabled=0

Install the server and contrib modules, initialise the cluster, and start it:

sudo dnf -y install postgresql18-server postgresql18-contrib
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
sudo systemctl enable --now postgresql-18

List what landed:

rpm -qa "postgresql*" | sort

Every package is a PGDG build for Fedora 45 (the f45 tag):

postgresql18-18.6-4PGDG.f45.x86_64
postgresql18-contrib-18.6-4PGDG.f45.x86_64
postgresql18-libs-18.6-4PGDG.f45.x86_64
postgresql18-server-18.6-4PGDG.f45.x86_64

A contrib extension proves the server and contrib builds match:

sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" -c "SELECT extname, extversion FROM pg_extension WHERE extname = 'pg_trgm';"

The extension is created and reports its version:

CREATE EXTENSION
 extname | extversion
---------+------------
 pg_trgm | 1.6
(1 row)

A matching pg_trgm version means the contrib modules came from the same PGDG testing build as the server, which is the state the next trap destroys.

The failure mode: dnf replaces the PGDG server with Fedora’s

Keep those testing repos enabled for as long as the server is installed. We switched them off for one command, with PGDG 18 running, and asked for one more extension package:

sudo dnf install --assumeno --setopt=pgdg18-updates-testing.enabled=0 --setopt=pgdg-common-testing.enabled=0 postgresql18-plpython3

dnf found no PGDG build of it. The Fedora postgresql-plpython3 package provides that name, and Fedora’s postgresql-server both provides and obsoletes postgresql18-server. dnf took them:

dnf on Fedora 45 replacing PGDG postgresql18-server with Fedora postgresql-server when the PGDG testing repos are off

Read the “replacing” lines. One -y would have swapped the PGDG 18.6 server, client and contrib packages for the Fedora 18.3 builds, and the damage is immediate. The PGDG server package has a %preun scriptlet (rpm -q --scripts postgresql18-server shows it) that runs systemctl disable and systemctl stop postgresql-18.service on removal, so your database goes down inside that same transaction. The Fedora server ships postgresql.service with PGDATA=/var/lib/pgsql/data, while your cluster lives in /var/lib/pgsql/18/data. Read the transaction summary on every PostgreSQL install. The PostgreSQL on Fedora guide covers the Fedora-packaged route if you would rather not depend on the PGDG testing tree.

With the testing repos enabled, a full sudo dnf upgrade --assumeno on the same box proposed no PostgreSQL change at all. The trap only opens when the PGDG repos that hold your installed builds go away. These are testing builds, with the same 18.6 version as PGDG’s stable Fedora 44 builds, but the PostgreSQL project has not promoted them yet. Put this on a dev box now and on production once the stable Fedora 45 tree exists.

RPM Fusion has no releases/45 tree yet, but nothing breaks, because its repo file reaches the packages through a metalink rather than a fixed path. If you skipped the VirtualBox section, install both release packages now (dnf reports the free one as already installed otherwise), then look at where the metalink points:

sudo dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
dnf repo info rpmfusion-free 2>/dev/null | grep -E "Metalink|Base URL"

The release package is rpmfusion-free-release-45-0.2, and the base URL the metalink hands out ends in development/45/Everything/x86_64/os/:

RPM Fusion free release package on Fedora 45 with the metalink resolving to the development tree and releases returning 404

The URL still serves rpmfusion-*-release-45-0.2. Its free-fedora-45 metalink resolves fine, but the mirror it hands out serves the development/45 tree, because releases/45 still answers 404 on RPM Fusion’s own server. Which repos that package switches on matters just as much. On our box dnf repo list --all showed this state right after the install:

  • rpmfusion-free and rpmfusion-nonfree are enabled, and the free metalink resolves to development/45.
  • rpmfusion-free-updates-testing and rpmfusion-nonfree-updates-testing are enabled.
  • rpmfusion-free-updates and rpmfusion-nonfree-updates are disabled.

The disabled pair looks like the thing to fix, so we counted what is in them before touching anything. This loop enables each stable updates repo for one query only:

for r in rpmfusion-free-updates rpmfusion-nonfree-updates; do printf "%-28s %s packages\n" $r $(dnf repoquery -q --disablerepo="*" --enablerepo=$r --qf "%{name}\n" 2>/dev/null | wc -l); done

Both came back empty. A second query shows which repo answers for the packages people actually install from RPM Fusion, plus the release packages themselves:

dnf repoquery -q --qf "%{name} %{version}-%{release} %{repoid}\n" --latest-limit=1 ffmpeg mesa-va-drivers-freeworld akmod-nvidia rpmfusion-free-release rpmfusion-nonfree-release 2>/dev/null

Our run on the final Fedora 45, with both 45-0.2 release packages installed, returned zero packages for each -updates repo and these sources for the rest:

RPM Fusion 45-0.2 release packages on Fedora 45 with empty updates repos and packages served from updates-testing

So the stable -updates repos are disabled and empty, and the packages are served from the base repos and -updates-testing: ffmpeg 9.0.2 came from rpmfusion-free-updates-testing, while the freeworld Mesa drivers and akmod-nvidia resolved from the base repos. Switching to the stable repos would gain you nothing but an empty repo, so leave the layout as the release package set it. The first upgrade after install offers a newer release package from the testing repo itself:

sudo dnf upgrade --refresh --assumeno

On our upgraded box that was the whole RPM Fusion transaction:

Upgrading:
 rpmfusion-free-release                noarch 0:45-0.3 rpmfusion-free-updates-testing      5.6 KiB
   replacing rpmfusion-free-release    noarch 0:45-0.2 rpmfusion-free                      5.6 KiB
 rpmfusion-nonfree-release             noarch 0:45-0.3 rpmfusion-nonfree-updates-testing   5.8 KiB
   replacing rpmfusion-nonfree-release noarch 0:45-0.2 rpmfusion-nonfree                   5.7 KiB

Installing 45-0.3 changed nothing about which repos are on. dnf repo list still showed rpmfusion-free-updates-testing and rpmfusion-nonfree-updates-testing enabled with both -updates repos off, and the only visible difference is that the 45-0.3 build installs its .repo files under /usr/share/dnf5/repos.d/. Look there if you go hunting for the file. The same behaviour shows up in our Fedora 45 post-install checklist. Don’t disable them by hand: VirtualBox above came from the development tree through exactly this setup. The release packages update through these same testing repos, so a regular sudo dnf upgrade picks up whatever repo layout RPM Fusion publishes next.

Undoing each workaround when the vendor catches up

Every fix above is temporary, and Docker shows the cleanup is real work. Leave a pin in place after the vendor ships Fedora 45 builds and you keep installing packages built for an older release. The signal to undo differs per vendor:

VendorUndo whenUndo
Docker CEAlready true on 3 Nov 2026: dnf repoquery --repo=docker-ce-stable docker-buildx-plugin prints .fc45 buildssudo rm /etc/yum.repos.d/docker-ce-f44-plugins.repo, then sudo dnf upgrade --refresh docker-buildx-plugin
HashiCorpThe probe loop from the diagnosis section returns 200 for 45sudo dnf config-manager unsetopt hashicorp.baseurl
PGDGThe probe returns 200 for both 18/fedora/fedora-45-x86_64 and common/fedora/fedora-45-x86_64sudo dnf config-manager setopt pgdg-common.enabled=1 pgdg18.enabled=1 pgdg-common-testing.enabled=0 pgdg18-updates-testing.enabled=0
Oracle VirtualBoxOracle publishes a 45 tree built against libvpx 1.17Remove the RPM Fusion VirtualBox and akmod-VirtualBox packages first, then sudo dnf config-manager unsetopt virtualbox.enabled
NVIDIA CUDAA fedora45 repo appearsRemove cuda-fedora44.repo, run sudo dnf config-manager unsetopt cuda-fedora44-x86_64.exclude, then add the fedora45 repo file and set the same exclude on its repo ID (dnf repo list shows it)

We ran the HashiCorp undo on the lab box. dnf repo info hashicorp went straight back to the $releasever URL, https://rpm.releases.hashicorp.com/fedora/45/x86_64/stable, which still 404s, so we put the pin back. Do not run the PGDG undo before PGDG publishes the stable 45 tree, or you’re back in the replacement trap above.

Upgrading from Fedora 44 rather than installing fresh? Check the 45 tree of each vendor with the probe loop before you start the Fedora 44 to 45 upgrade. Every repo that builds its URL from $releasever starts asking for the 45 directory as soon as the upgrade runs. Vendor .rpm files you download and install by hand are a separate problem from repo 404s, covered in the NOKEY fix.

Repo audit checklist for a Fedora 45 box

Run this list after any vendor repo change, and again after the next Fedora upgrade. Each line is a condition that should hold on a clean machine:

  1. sudo dnf makecache --refresh prints no “Usable URL not found” line for any enabled repo.
  2. /etc/yum.repos.d/ holds no docker-ce-f44-plugins.repo, and rpm -q docker-buildx-plugin prints an .fc45.x86_64 build.
  3. /etc/dnf/repos.override.d/99-config_manager.repo lists only the pins you can name a reason for: HashiCorp to 44, the disabled Oracle repo, the CUDA exclude and the PGDG testing switch.
  4. The Oracle virtualbox repo is disabled while VirtualBox comes from RPM Fusion.
  5. modinfo -F signer vboxdrv names your akmods key, and mokutil --sb-state still reports Secure Boot enabled.
  6. pgdg18-updates-testing and pgdg-common-testing stay enabled for as long as PGDG 18 is installed.
  7. Fedora’s docker-buildx and moby-engine packages are absent from any Docker CE host.

On our lab box, the final sudo dnf makecache --refresh after all of the fixes above counted zero “Usable URL not found” lines. That is the state to aim for, and the first item on this list is the one to re-run whenever a vendor changes its repos.

Keep reading

How to Upgrade Fedora 44 to Fedora 45 (GUI, CLI and Rollback) Fedora How to Upgrade Fedora 44 to Fedora 45 (GUI, CLI and Rollback) Enable RPM Fusion and Install Multimedia Codecs on Fedora 45 / 44 / 43 Fedora Enable RPM Fusion and Install Multimedia Codecs on Fedora 45 / 44 / 43 Harden Fedora 45 / 44 for Desktop and Server: Complete Guide Fedora Harden Fedora 45 / 44 for Desktop and Server: Complete Guide Switch Fedora From GRUB to systemd-boot With bootctl Fedora Switch Fedora From GRUB to systemd-boot With bootctl DNF5 Cheatsheet for Fedora 45 / 44: Tested Commands and Fixes Fedora DNF5 Cheatsheet for Fedora 45 / 44: Tested Commands and Fixes Install Node.js 22 LTS on RHEL 10 / Rocky Linux 10 / AlmaLinux 10 CentOS Install Node.js 22 LTS on RHEL 10 / Rocky Linux 10 / AlmaLinux 10

Leave a Comment

Press ESC to close