You are choosing between a distro that moves every six months and one that promises to stay put until 2031. On a fresh VM that choice shows up in specific places: Fedora 45 boots about 1.3 seconds slower, carries a compiler and an OpenSSL that are a full major version ahead, and ships Podman in the base image. Ubuntu 26.04 LTS boots faster, runs a Rust sudo and Rust coreutils by default, and its Python build finished a pure Python benchmark in about 30% less time in our runs. Everything else is closer than the version numbers suggest.
This Fedora 45 vs Ubuntu 26.04 comparison was measured, not collected from release notes. Two cloud VMs with identical vCPU, RAM and disk ran on the same Proxmox host, each fully updated, and we timed boots, metadata refreshes and the same package install on both. The sections below cover the changes Fedora 45 brings, support lifecycles, package management, toolchains, security defaults, containers and the desktop. If you are still on the previous pair, the Fedora 44 vs Ubuntu 26.04 comparison covers that matchup. The Fedora side is Fedora 45, and Ubuntu is the 26.04.1 point release.
Fedora 45 vs Ubuntu 26.04 at a glance
Every row in this table comes from the two lab VMs unless it says otherwise. Ubuntu is the 26.04.1 point release.
| Area | Fedora 45 (cloud image) | Ubuntu 26.04.1 LTS (cloud image) |
|---|---|---|
| Kernel after updates | 7.2.7-300.fc45 | 7.0.0-34-generic |
| Boot time, systemd-analyze total (median of 3) | 7.57 s | 6.22 s |
| RAM used at idle | 497 MiB | 457 MiB |
| Packages in the base image | 541 rpm | 693 deb |
| Root filesystem | Btrfs, zstd:1 compression | ext4 |
| Disk used after first boot | 1.1 GiB | 2.9 GiB |
| Package manager | dnf5 5.4.5 | apt 3.2.0 |
| Cold metadata refresh (3 runs) | 10.7 to 12.1 s | 8.8 to 15.0 s |
| Mandatory access control | SELinux, Enforcing | AppArmor, 180 profiles (104 enforcing) |
| Firewall running in the cloud image | None (firewalld not installed) | None (ufw inactive) |
| sudo and coreutils | GNU sudo, GNU coreutils | sudo-rs, uutils coreutils (Rust) |
| Containers in the base image | Podman 6.1.2 preinstalled | Nothing; Podman 5.7.0 in the archive |
| Swap | zram, 3.8 GiB | None |
| Support ends | November 24, 2027 (scheduled) | May 2031 standard, 2036 with Ubuntu Pro |
How the two VMs were set up
Both guests got 2 vCPUs with cpu: host, 4 GiB of RAM and a 20 GiB disk on the same ZFS pool, on a host with an 11th Gen Intel Core i7. The Fedora VM came from the official Fedora 45 Cloud Base image, the Ubuntu VM from the 26.04 server cloud image, and cloud-init finished its first-boot work on both before anything was measured. Each got a full dnf upgrade or apt full-upgrade, then three reboots for the boot numbers.
Two differences are baked into the images and could not be equalized. The Fedora template boots UEFI on a q35 machine with Secure Boot keys enrolled, while the Ubuntu template boots SeaBIOS on i440fx. The host was also shared with other lab VMs during the run, so the CPU benchmarks further down report the best of several runs and should be read as directional. Boot, memory, package and version data are not affected by that noise.
The Fedora VM after updates:

And the Ubuntu 26.04 VM with the same commands, where the AppArmor and sudo-rs lines replace the SELinux and Podman ones:

Package counts and disk usage in those two captures are higher than in the table because they were taken after the benchmark packages were installed.
1. Release cadence and support lifecycle
This is the row that decides most server deployments before any benchmark does. Fedora releases every six months and supports each release until about four weeks after the second release that follows it. For Fedora 45 the schedule puts that on November 24, 2027, which matches the SUPPORT_END field in its os-release. Running Fedora means one major upgrade a year at minimum.
Canonical gives the LTS release five years of standard security maintenance for the main archive, then Expanded Security Maintenance through Ubuntu Pro for another five, and a paid Legacy add-on on top. Canonical’s release cycle page lists the dates:
| Coverage | Fedora 45 | Ubuntu 26.04 LTS |
|---|---|---|
| Release | October 20, 2026 (scheduled) | April 23, 2026 |
| Standard security updates end | November 24, 2027 | May 2031 |
| Extended coverage | None; upgrade to Fedora 46 or 47 | ESM to May 2036 (Ubuntu Pro, free on 5 machines) |
| Longest possible coverage | About 13 months | May 2041 with the Legacy add-on |
| Upgrade tool | dnf system-upgrade | do-release-upgrade |
Fedora upgrades are the less scary of the two in practice, because each jump is small. An in-place Fedora 44 to 45 upgrade on our lab worked with the stock commands. Ubuntu LTS upgrades cross two years of changes at once, as the 24.04 to 26.04 upgrade shows.
2. Kernel, boot time and memory
Fedora tracks the upstream kernel closely, so its updated VM ran a 7.2 kernel while Ubuntu stays on its 7.0 series for the life of the release (hardware enablement kernels arrive later through the HWE stack). Boot time was collected with systemd-analyze after each of three reboots:
systemd-analyze
The three Fedora 45 boots, one line each:
Startup finished in 920ms (kernel) + 2.368s (initrd) + 4.278s (userspace) = 7.567s
Startup finished in 1.126s (kernel) + 2.394s (initrd) + 4.066s (userspace) = 7.586s
Startup finished in 897ms (kernel) + 2.335s (initrd) + 4.047s (userspace) = 7.281s
On the same host, Ubuntu was faster in the kernel and initrd stages on every boot and faster overall on the last two. Its first boot came straight after the kernel update:
Startup finished in 593ms (kernel) + 2.038s (initrd) + 5.425s (userspace) = 8.058s
Startup finished in 579ms (kernel) + 2.039s (initrd) + 3.605s (userspace) = 6.224s
Startup finished in 517ms (kernel) + 1.994s (initrd) + 3.290s (userspace) = 5.803s
The medians are 7.57 s for Fedora and 6.22 s for Ubuntu. At the median Ubuntu is ahead by about 0.34 s in the kernel stage, 0.33 s in the initrd and 0.46 s in userspace (each stage taken as its own median). systemd-analyze reports no firmware stage on either VM, so UEFI firmware time is not in these totals. The Fedora template boots UEFI with Secure Boot on q35 and the Ubuntu one boots SeaBIOS on i440fx, so some effect on the kernel stage is possible but unproven. The initrd gap is a distro difference too, since Fedora builds its initramfs with dracut and Ubuntu with initramfs-tools.
Memory was read two minutes after the third boot with only each image’s default services running, which is 16 running service units on Fedora and 21 on Ubuntu:
free -m | sed -n 2p
grep -E 'MemAvailable|Unevictable' /proc/meminfo
Fedora 45 first, then Ubuntu:
Mem: 3880 497 3408 0 282 3383
MemAvailable: 3464360 kB
Unevictable: 97756 kB
Mem: 3910 457 3394 0 275 3453
MemAvailable: 3536260 kB
Unevictable: 9580 kB
A 40 MiB idle difference does not matter on any real machine. The Unevictable line is the interesting one: Fedora 45 pins about 95 MiB that the kernel cannot reclaim, against about 9 MiB on Ubuntu. We saw the same pinned memory when comparing Fedora 44 and Fedora 45 directly, so it is a Fedora 45 trait and not a quirk of this VM. Fedora also enables zram swap (a compressed swap device sized to RAM, 3.8 GiB here) while the Ubuntu cloud image runs with no swap at all.
3. Package management: dnf5 vs apt 3
Both package managers are fast now. The cold metadata test deletes the local cache and refreshes every enabled repository:
sudo dnf clean all && time sudo dnf makecache
sudo rm -rf /var/lib/apt/lists/* && time sudo apt-get update
Fedora took 12.1, 11.3 and 10.7 seconds and Ubuntu 13.1, 8.8 and 15.0 seconds. Both depend far more on the mirror than on the tool, and neither is consistently ahead. The on-disk cache differs more: 80 MiB of dnf5 metadata against 150 MiB of apt lists.
The install test used the same nine packages on both (a compiler, make, git, vim, tmux, htop, jq, pip and nginx), only the vim package name differs:
sudo dnf -y install gcc make git vim-enhanced tmux htop jq python3-pip nginx
sudo apt-get -y install gcc make git vim tmux htop jq python3-pip nginx
Fedora pulled fewer dependencies for the same request:
| Same 9-package install | Fedora 45 | Ubuntu 26.04 |
|---|---|---|
| Packages installed | 18 | 49 |
| Download size | 73 MiB | 82.3 MB |
| Disk added | 225 MiB | 291 MB |
| Wall time | 14.8 s | 15.2 s |
Two behaviours are worth knowing before you script against either. Ubuntu phases updates: right after our full upgrade, apt list --upgradable still showed four packages being held back for a staged rollout. Our Fedora 45 VM came up with updates-testing enabled, so check dnf repo list before you script updates against it. Fedora also moved its stock repo files out of /etc/yum.repos.d/, which ships empty on Fedora 45; the dnf5 cheat sheet covers the commands that replace the old habits.
Third-party repos are where the release timing bites. On the day we tested, Docker published a repository for Ubuntu 26.04 (resolute) but returned 404 for Fedora 45, and VirtualBox had no Fedora 45 repo either. Third-party vendors often publish Fedora repos some time after the release, so curl the repo URL before building automation on it. Fedora’s own moby-engine package covers Docker in the meantime.
4. Toolchains and language runtimes
Fedora is a full year ahead on most of the stack. Versions below were read from the installed binaries where the package was installed, and from dnf repoquery or apt-cache policy otherwise:
| Component | Fedora 45 | Ubuntu 26.04 |
|---|---|---|
| GCC | 16.2.1 | 15.2.0 |
| LLVM / Clang | 23.1.2 | 21.1.6 |
| glibc | 2.44 | 2.43 |
| systemd | 262 | 259 |
| OpenSSL | 4.0.2 (openssl3-libs 3.5.8 for compatibility) | 3.5.5 |
| Python (default) | 3.15.0rc2 | 3.14.4 |
| Other Python versions | 3.10 to 3.14 packaged in parallel | Default only (deadsnakes PPA for others) |
| Go | 1.27.1 | 1.26 |
| Rust | 1.98.1 | 1.93.1 |
| Node.js | 22 default, 24 and 26 as nodejs24 / nodejs26 | 22.22.1 |
| OpenJDK | 25.0.4 | 25.0.4 |
| PHP | 8.5.11 | 8.5.4 |
| PostgreSQL | 18.3 | 18.6 |
| MariaDB | 12.3.2 | 11.8.6 |
| nginx | 1.30.5 | 1.28.3 |
| Apache httpd | 2.4.68 | 2.4.66 |
| Perl | 5.44.0 | 5.40.1 |
| Git | 2.55.0 | 2.53.0 |
| ansible-core | 2.22.0 beta 1 | 2.20.1 |
The OpenSSL row is the one that breaks things. OpenSSL 4 removes deprecated APIs, so software built against 3.x needs a rebuild or the openssl3-libs compatibility package that Fedora 45 ships alongside it. Ubuntu stays on the 3.5 LTS branch for the whole release. The Python row is worth checking on your own machine: our Fedora 45 VM had a 3.15 release candidate, so run python3 --version before you rely on it. Fedora’s parallel Python packages (python3.12, python3.13 and so on from the main repo) are a real advantage for anyone testing across versions without pyenv, and the Fedora dev environment guide uses them.
We also built the same zstd source release with each distro’s compiler, three runs each. Best times were 15.3 s on both, with the spread (up to 17.7 s) driven by the shared host, so GCC 16 against GCC 15 is a draw for build speed. The resulting zstd binaries differed by 560 bytes.
The surprise came from Python. A pure Python n-body simulation (500,000 steps, CPU bound, no C extensions) ran noticeably faster on Ubuntu. To separate the interpreter build from the OS, each VM also ran the other distro’s Python inside a Podman container on the same kernel:
| n-body, 500,000 steps (best of 6) | On the Fedora 45 VM | On the Ubuntu 26.04 VM |
|---|---|---|
| Fedora’s Python build | 2.25 s (3.15rc2, host) | 2.40 s (3.14, fedora:45 container) |
| Ubuntu’s Python build | 1.63 s (3.14, ubuntu:26.04 container) | 1.57 s (3.14, host) |
The gap follows the Python build, not the kernel or the distro around it: Ubuntu’s interpreter finished in 27 to 34% less time on both VMs. Fedora’s own python3.14 package was just as slow as its 3.15 release candidate, so the release candidate is not the cause. The visible build difference is linkage. Fedora’s /usr/bin/python3 is an 11 KB stub linked against a shared libpython, while Ubuntu’s is a 7.4 MB binary with the interpreter linked in:
ldd "$(readlink -f /usr/bin/python3)" | grep libpython
ls -l "$(readlink -f /usr/bin/python3)"
On Fedora 45 the interpreter pulls in the shared library:
libpython3.15.so.1.0 => /lib64/libpython3.15.so.1.0 (0x00007f0d13e00000)
-rwxr-xr-x. 1 root root 11560 Sep 3 00:00 /usr/bin/python3.15
Ubuntu’s ldd prints no libpython line, and the file itself is the whole interpreter:
-rwxr-xr-x 1 root root 7477160 Aug 20 10:41 /usr/bin/python3.14
Fedora’s build flags also include extra hardening such as _GLIBCXX_ASSERTIONS, though we did not isolate what that costs. One benchmark on a shared host does not make a verdict on real workloads (web apps spend most of their time in C extensions and I/O), but if you run CPU-heavy pure Python, test it on both.
5. Security defaults
Fedora confines services with SELinux in enforcing mode, Ubuntu with AppArmor, and both work without the reader touching anything. The practical difference is in troubleshooting: SELinux denials show up in the audit log and need ausearch and booleans (the SELinux survival guide covers the common ones), while AppArmor problems are usually a profile in complain or enforce mode (see AppArmor on Ubuntu 26.04).
| Default | Fedora 45 cloud | Ubuntu 26.04 cloud |
|---|---|---|
| MAC framework | SELinux Enforcing | AppArmor, 104 of 180 profiles enforcing |
| Host firewall | Not installed (Fedora Server installs firewalld) | ufw installed, inactive |
| nftables ruleset at boot | Empty | Empty |
| SSH password login | Off (50-cloud-init.conf drop-in) | Off (60-cloudimg-settings.conf drop-in) |
| Root SSH | prohibit-password | prohibit-password |
| Listening beyond SSH and DNS stub | LLMNR on TCP/UDP 5355 | Nothing |
| ptrace_scope | 1 | 1 |
| sudo | GNU sudo 1.9.17p2 | sudo-rs 0.2.13 (GNU sudo kept as sudo.ws) |
| Package signatures | rpm refuses unsigned or NOKEY packages | apt refuses unsigned repos |
The LLMNR listener is the one finding worth acting on. Fedora’s systemd-resolved answers LLMNR name queries on port 5355 on all interfaces, and with no firewall in the cloud image that port is reachable from the network. Ubuntu ships resolved with LLMNR off. Before the fix, ss shows systemd-resolved on 5355 over TCP and UDP for IPv4 and IPv6:
sudo ss -tulnp | grep 5355
Four sockets, all bound to every address:
udp UNCONN 0 0 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=538,fd=12))
udp UNCONN 0 0 [::]:5355 [::]:* users:(("systemd-resolve",pid=538,fd=14))
tcp LISTEN 0 4096 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=538,fd=13))
tcp LISTEN 0 4096 [::]:5355 [::]:* users:(("systemd-resolve",pid=538,fd=15))
A resolved drop-in turns it off without touching the main config file. Create it and restart the service:
sudo mkdir -p /etc/systemd/resolved.conf.d
printf "[Resolve]\nLLMNR=no\n" | sudo tee /etc/systemd/resolved.conf.d/no-llmnr.conf
sudo systemctl restart systemd-resolved
Run the same ss check again and it prints nothing. resolved itself confirms the protocol is off:
resolvectl status | grep -m1 Protocols
The minus sign in front of LLMNR is the part that matters:
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Installing firewalld is the other route, and the firewalld zones guide walks through it. Fedora Server (the ISO install, not the cloud image) already ships firewalld with only SSH, Cockpit and DHCPv6 client open.
The signature row is new with Fedora 45: a plain rpm -i on a package whose signing key is not imported now fails instead of printing a warning. Ubuntu’s move to Rust userland is the other side of the same coin. sudo is sudo-rs (GNU sudo stays installed as /usr/bin/sudo.ws behind the alternatives system) and ls, cp and friends come from uutils coreutils, which reduces memory safety risk in setuid code but occasionally differs from GNU behaviour in edge-case flags. Scripts that parse sudo -V output or rely on obscure GNU options are the ones to test.
6. Containers and virtualization
Fedora puts Podman in the cloud image itself, and Fedora 45 moves it to the Podman 6 series. Ubuntu leaves the container runtime to you and packages the Podman 5 series. Underneath, the stack is identical on both: netavark networking, crun, cgroup v2 and overlay storage, as reported by podman info.
| Package | Fedora 45 | Ubuntu 26.04 |
|---|---|---|
| Podman | 6.1.2 (installed) | 5.7.0 |
| Docker engine (distro package) | moby-engine 29.7.2 | docker.io 29.1.3 |
| podman-compose | 1.6.0 | 1.5.0 |
| Buildah | 1.45.1 | 1.42.1 |
| containerd | 2.3.5 | 2.2.2 |
| Docker CE upstream repo | Not published for Fedora 45 yet (404) | Published for resolute |
Podman 6 drops slirp4netns, so older rootless setups that still pin it fail on Fedora 45 until they move to pasta. Rootless containers ran on both with no extra setup; both VMs pulled and ran Alpine, Ubuntu and Fedora images for the Python test above. One thing caught us on the Ubuntu VM: a rootless container started from an SSH session died when that session closed. For long-running rootless containers on either distro, enable linger with sudo loginctl enable-linger $USER or run them as Quadlet units. For Compose workflows on Fedora, the podman-compose guide applies unchanged.
7. Desktop editions
We measured the cloud images, not the desktops, so this section sticks to what each project ships and what we saw on our own Fedora 45 Workstation install. Both desktops are GNOME on Wayland only; neither offers a GNOME on Xorg session any more.
| Desktop default | Fedora 45 Workstation | Ubuntu 26.04 Desktop |
|---|---|---|
| GNOME | GNOME 51 | GNOME 50 with Ubuntu’s dock and Yaru theme |
| Filesystem | Btrfs with zstd:1 for / and /home, ext4 /boot | ext4 |
| App store formats | RPM plus Flatpak (Flathub through the third-party repositories switch) | deb plus Snap in App Center |
| Terminal | Ptyxis | Ptyxis |
| Codecs | Patent-free set; full codecs via RPM Fusion | Optional third-party codecs at install time |
Fedora ships each new GNOME release within weeks of upstream, and Fedora 45 Workstation also switches the virtual consoles to kmscon and replaces gnome-keyring with oo7. The Fedora 45 install guide shows both installers screen by screen. Ubuntu’s advantage is proprietary software: Snap packages and Canonical’s NVIDIA driver handling mean less setup for Steam, Spotify or CUDA, where Fedora needs RPM Fusion.
Where each one falls short
Fedora 45 falls short on time. Thirteen months of support means an upgrade every year, and third-party repos can trail a new release: Docker and VirtualBox had no Fedora 45 repos when we tested. Its cloud image also leaves LLMNR exposed with no firewall, and its Python build was the slower one in our tests. If you need a box that nobody touches until 2031, Fedora is the wrong tool.
Ubuntu 26.04 falls short on freshness. Its compiler, LLVM, OpenSSL, MariaDB and systemd are a year or more behind Fedora and will stay there, so anything that needs GCC 16, OpenSSL 4 or current Rust means PPAs, Snap or containers. The Rust sudo and coreutils are a bet that most scripts will never notice, and the ones that do will notice at a bad time. Phased updates also mean two identical servers can briefly run different package versions.
For most people the split is simple. Pick Ubuntu 26.04 for servers, fleets and anything with a support contract. Pick Fedora 45 for developer workstations and homelab machines where current toolchains and a new GNOME matter more than a five-year freeze.