Fedora vs CentOS Stream vs RHEL

How Are They Related?

Fedora tests new features, CentOS Stream previews the next RHEL release, and RHEL provides the stable production environment.

You are choosing a base image and three logos confuse you

You are standing on the download page or staring at a cloud provider's image list. Fedora Workstation, CentOS Stream, and Red Hat Enterprise Linux all claim to be the right choice. A forum thread from three years ago says CentOS is a perfect clone of RHEL. A recent blog post calls CentOS Stream the upstream of RHEL. You installed Fedora six months ago and it works, but now you need a server that won't break when you walk away. You need to know the actual flow of code, not the marketing. You need to pick the distribution that matches your risk tolerance and support requirements.

How the code flows from Fedora to RHEL

Fedora is the upstream testing ground. Red Hat engineers write new features and commit them to Fedora first. Fedora receives the latest kernel, desktop environment, and developer tools. If a package works reliably in Fedora across multiple releases, Red Hat considers it for RHEL. Fedora is the source of truth for features. If a package is not in Fedora, it will not appear in RHEL, with rare exceptions for commercial add-ons.

CentOS Stream sits in the middle. It is not a clone of RHEL. It is a rolling preview of the next RHEL minor release. Stream tracks the development branch of RHEL. When RHEL 9.4 ships, CentOS Stream 9 is already showing you what will be in RHEL 9.5. Stream receives updates continuously. It validates packages at scale before they are locked into RHEL. Stream is the upstream for RHEL. Changes flow from Fedora to Stream, then from Stream to RHEL.

RHEL is the stable production product. It receives security updates and bug fixes. The feature set is locked. RHEL does not get new features until the next major release cycle. RHEL provides long-term support and a fixed environment. You can rely on RHEL to stay consistent for years. RHEL requires a subscription for updates and support. You can install RHEL without a subscription, but you will not receive updates from the official repositories.

The release cadence differs across the three. Fedora releases every six months. The N-2 release goes end-of-life when N+1 ships. Plan upgrades on that cycle. RHEL major releases ship every two years. Minor releases ship every six months. Stream tracks the minor release cycle. Stream 9 exists as long as RHEL 9 is in development. When RHEL 10 development begins, Stream 9 becomes the preview for RHEL 10. Stream does not jump versions until the next RHEL major cycle starts.

Check the repo URLs. The mirror tells the truth.

How to verify which distribution you are running

Here's how to check the release information on your system. The /etc/os-release file contains the standard identification data. This file exists on all modern Fedora-based systems. It shows the pretty name and version ID. Use this file to script checks or verify the environment manually.

cat /etc/os-release # Read the standard release information file
# WHY: This file contains PRETTY_NAME and VERSION_ID, which identify the distro and version
# WHY: Use grep to extract specific fields if you are writing automation scripts
grep PRETTY_NAME /etc/os-release # Show the human-readable name of the distribution

The output tells you exactly what you have. If PRETTY_NAME contains "Fedora Linux", you are on Fedora. If it contains "CentOS Stream", you are on Stream. If it contains "Red Hat Enterprise Linux", you are on RHEL. The version number indicates the release cycle. Fedora 40 is newer than Fedora 39. Stream 9 is the preview for RHEL 9. RHEL 9.4 is a minor release within the RHEL 9 major cycle.

Here's how to inspect the repositories to confirm the package source. The repository configuration reveals where dnf fetches packages. Fedora points to dl.fedoraproject.org. Stream points to mirror.stream.centos.org. RHEL points to cdn.redhat.com when registered. This confirms the supply chain and helps you detect misconfigured repos.

dnf repolist # List all enabled repositories and their package counts
# WHY: This shows the baseurl or metalink, which reveals the actual source of packages
# WHY: Fedora repos point to dl.fedoraproject.org, Stream points to mirror.stream.centos.org
dnf repolist | grep -E "base|appstream" # Filter for the core repositories

Run dnf repolist and check the URLs. If you see dl.fedoraproject.org, you are on Fedora. If you see mirror.stream.centos.org, you are on Stream. If you see cdn.redhat.com, you are on RHEL. If you see a mix, you have a misconfiguration. Fix the repos before installing packages.

Run dnf repolist first. The URLs reveal the supply chain.

Common pitfalls and error patterns

Mixing repositories breaks the system. Do not add Fedora repos to Stream. Do not add Stream repos to RHEL. The package versions will conflict. You will see dependency errors that prevent upgrades. The package manager refuses to proceed when versions clash.

Error: Transaction test error: package python3-libs-3.9.18-1.el9.x86_64 requires libpython3.9.so.1.0()(64bit), but none of the providers can be installed

This error appears when you try to install a package from a repo that conflicts with the base system. The solution is to remove the conflicting repo and clean the cache. Run dnf clean all and dnf upgrade. Never force a transaction with --skip-broken unless you understand the missing dependency. Forcing hides the real problem.

Stream is upstream. It can break. Stream receives changes before RHEL. A package update in Stream might introduce a regression that RHEL will fix before shipping. If you run a database on Stream, you are testing the database driver for the next RHEL release. That is a valid use case for a test server. It is a bad use case for a payroll server. Stream is continuous delivery. Treat it like a continuous integration branch, not a production lock.

Fedora requires regular upgrades. Fedora 40 goes end-of-life when Fedora 42 ships. You must upgrade to stay supported. Use dnf system-upgrade to cross major releases. dnf upgrade --refresh is the normal weekly maintenance command. dnf system-upgrade downloads the new release and reboots into the upgrade. They are different commands. Don't conflate them.

Config files in /etc/ are user-modified. Files in /usr/lib/ ship with the package. Edit /etc/. Never edit /usr/lib/. If you edit /usr/lib/, dnf upgrade will overwrite your changes. This applies to all three distributions. The package manager owns /usr/lib/. You own /etc/.

SELinux denials show up in journalctl -t setroubleshoot with a one-line summary. Read those before disabling SELinux. Disabling SELinux masks the real issue. The audit log tells you exactly which process was denied access. Fix the policy or add a boolean. Don't turn off the security layer.

Snapshot the system before the upgrade. Future-you will thank you.

When to use Fedora, Stream, or RHEL

Use Fedora when you want the latest kernel, desktop environment, and developer tools six months before they appear in enterprise releases. Use CentOS Stream when you need to validate packages against the exact codebase that will become the next RHEL minor release. Use RHEL when you require a fixed feature set, long-term support, and a subscription for compliance or certified hardware. Use Fedora Server when you are running a homelab or a development environment that benefits from newer software than Stream provides. Stay on the current release until the N-2 rule applies. Fedora drops support for the release before last.

Use dnf module list when you need to inspect application streams. Modules group packages into versioned streams. Stream and RHEL rely heavily on modules for application stacks like PHP, Python, or PostgreSQL. Fedora uses modules too, but the experience is slightly different. Modules allow you to switch versions without breaking the base system. Check the module info before switching streams.

dnf module list # List available module streams and their profiles
# WHY: Modules group packages into versioned streams, allowing you to switch PHP or Python versions
# WHY: Stream and RHEL rely heavily on modules for application streams like nodejs or postgresql
dnf module info php # Show details for the php module, including the default stream

RHEL is the target. Fedora is the source. Stream is the bridge.

Where to go next