The scenario
You just finished a clean install of Fedora Workstation. The desktop is responsive, the terminal behaves exactly as expected, and the package manager resolves dependencies without complaint. You open Steam, click play on a modern Windows title, and the game crashes immediately with a missing Vulkan layer error. Or perhaps your NVIDIA GPU refuses to initialize because the open-source Nouveau driver is still holding the hardware hostage. The system is secure and stable by design, but gaming requires stepping outside those defaults without breaking the package manager or leaving your kernel module stack in a broken state.
What is actually happening
Fedora ships with a strict commitment to free and open-source software. That means proprietary GPU firmware, closed-source game launchers, and Windows compatibility layers are intentionally excluded from the base repositories. The kernel includes the Nouveau driver for NVIDIA hardware, but it lacks the performance and feature set required for modern gaming. AMD and Intel GPUs rely on Mesa, which is included, but the Vulkan ICD files and hardware acceleration codecs often need explicit installation. Proton, Valve's compatibility layer, translates Windows API calls to Linux equivalents using Wine and DXVK. It works best when the underlying graphics stack is fully configured and the correct runtime libraries are available.
Fedora separates these components into third-party repositories like RPM Fusion and Flatpak runtimes to maintain its upstream alignment. You are not fixing a broken system. You are adding the missing pieces that the base distribution intentionally leaves out. The package manager handles the integration, but you need to tell it where to look and which components to pull. A botched driver installation can leave you unable to boot into the graphical session. Run the repository setup first, verify the metadata, and then install the hardware-specific packages.
The setup procedure
Enable the third-party repositories before touching any drivers. Fedora's default repos will not resolve proprietary dependencies, and forcing an install without them will leave your system in a half-configured state.
Here's how to add RPM Fusion and refresh the package metadata so dnf can resolve dependencies correctly.
sudo dnf install -y 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
# WHY: Adds the RPM Fusion free and non-free repositories to your dnf configuration. Fedora does not ship proprietary codecs or closed drivers by default. These repos provide the missing packages without replacing the base system.
sudo dnf upgrade --refresh
# WHY: Forces dnf to pull fresh metadata from the newly added repositories. Skipping this step causes dependency resolution failures when installing packages from RPM Fusion.
dnf upgrade --refresh is the normal weekly maintenance command. dnf system-upgrade is for crossing major Fedora releases. They are different commands. Don't conflate them.
Install the graphics stack next. The commands differ based on your GPU vendor. Run only the block that matches your hardware.
Here's how to install the NVIDIA proprietary driver and the Vulkan loader.
sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cuda
# WHY: akmod-nvidia compiles the proprietary kernel module against your currently running kernel. This avoids the manual dkms setup and survives kernel updates automatically. The cuda package provides the compute libraries many modern games expect.
sudo dnf install -y mesa-vulkan-drivers vulkan-tools
# WHY: Even on NVIDIA hardware, Mesa provides the Vulkan ICD loader and fallback layers. vulkan-tools gives you the vulkaninfo command for verification.
Here's how to install the AMD or Intel graphics stack.
sudo dnf install -y mesa-vulkan-drivers vulkan-tools
# WHY: AMD and Intel GPUs rely entirely on the open-source Mesa stack. This package installs the Vulkan drivers, OpenGL libraries, and the necessary firmware blobs for modern architectures.
Config files in /etc/ are user-modified. Files in /usr/lib/ ship with the package. Edit /etc/. Never edit /usr/lib/. The driver packages place their configuration in /etc/X11/ and /etc/vulkan/. Leave those alone unless you are troubleshooting a specific rendering issue.
Install the launchers and compatibility runtimes last. Steam provides the native client, and Proton GE supplies the patched compatibility layer that many Windows games require.
Here's how to pull Steam and the community-maintained Proton runtime.
sudo dnf install -y steam proton-ge-bin
# WHY: Steam provides the native Linux client and the built-in Proton compatibility tool. proton-ge-bin is a community-maintained fork that includes newer DXVK and Wine patches, which many Windows games require to run correctly on Linux.
Reboot before you debug. Half the time the symptom is gone.
Verify the configuration
Check the graphics stack before launching any games. The Vulkan loader must recognize your GPU, and the driver must be active in the kernel.
Here's how to verify that the Vulkan ICD is registered and reporting the correct device.
vulkaninfo | grep deviceName
# WHY: Queries the Vulkan loader for registered devices. If this command returns nothing, the ICD files are missing or the driver failed to load.
Here's how to check the NVIDIA kernel module status.
lsmod | grep nvidia
# WHY: Lists loaded kernel modules. You should see nvidia, nvidia_uvm, and nvidia_drm. Missing modules indicate a failed akmod build or a secure boot conflict.
If you see [FAILED] Failed to start Xorg.service during boot, your display manager probably references a missing driver or a conflicting configuration. Run journalctl -xe to read the actual error before guessing. The x flag adds explanatory text and the e flag jumps to the end. Most sysadmins type journalctl -xeu <unit> muscle-memory style.
Launch Steam and verify the Proton version. Open the Steam settings, navigate to the Compatibility section, and enable Steam Play for all titles. Select the Proton GE version from the dropdown. The client will download the runtime on first launch.
Run journalctl first. Read the actual error before guessing.
Common pitfalls and error messages
The most frequent failure occurs when the Nouveau driver conflicts with the proprietary NVIDIA stack. The kernel will refuse to load both modules simultaneously. You will see a boot hang or a fallback to the low-resolution software renderer.
NVRM: The NVIDIA driver has detected that the Nouveau kernel module is loaded.
NVRM: The NVIDIA driver requires that Nouveau is not loaded.
The conflict is intentional. Read the next paragraph before forcing. Add rd.driver.blacklist=nouveau modprobe.blacklist=nouveau to your GRUB command line, then regenerate the configuration with sudo grub2-mkconfig -o /boot/grub2/grub.cfg. The blacklist prevents the open-source driver from claiming the hardware during early boot.
SELinux denials show up in journalctl -t setroubleshoot with a one-line summary. Read those before disabling SELinux. Steam and Proton run in confined contexts by default. If a game fails to launch with a permission error, check the audit log. The system will suggest a policy module to install. Running sudo ausearch -m avc -ts recent surfaces the exact denial. Apply the recommended fix instead of switching to permissive mode.
Missing audio codecs cause silent games or crashes in titles that rely on FAudio. The rpmfusion-nonfree repository provides the necessary packages. Install pipewire-alsa and pipewire-pulse if your audio server is not routing correctly. Fedora uses PipeWire as the default audio server. Legacy PulseAudio packages will conflict with it.
firewall-cmd --reload after every rule change. Otherwise the runtime config and the persistent config diverge. Steam requires outbound access on port 27017 and 443. If your firewall blocks those, the client will time out during authentication.
Trust the package manager. Manual file edits drift, snapshots stay.
When to use which launcher or runtime
Use Steam when you want native Linux titles and Valve's built-in Proton compatibility layer. Use Heroic Games Launcher when you manage Epic Games Store or GOG libraries and prefer a lightweight, open-source frontend. Use Lutris when you need granular control over Wine prefixes, custom scripts, or non-Steam Windows titles. Stick to the native RPM packages when you want tight integration with the system package manager and automatic updates. Use Flatpak runtimes when you need sandboxed environments that isolate game dependencies from the host system.