You install Fedora on a machine with an NVIDIA GPU and reach the login screen
The session selector only shows GNOME on X11. You want Wayland for smoother scrolling, better multi-monitor scaling, and modern pointer behavior. The option is missing because Fedora defaults to X11 when it detects proprietary NVIDIA drivers. The system is protecting you from a broken display pipeline, but you can safely override it.
What's actually happening
Wayland relies on kernel mode setting to control the display controller. The open-source Nouveau driver implements this directly. The proprietary NVIDIA driver historically kept mode setting in userspace to avoid stepping on its own display stack. Fedora respects that boundary and hides the Wayland session until you explicitly tell the kernel to hand over display control to the NVIDIA DRM module. Adding the nvidia-drm.modeset=1 parameter flips that switch. The kernel loads the NVIDIA driver, claims the GPU, and exposes a standard DRM interface that GNOME can use to start a Wayland compositor.
Think of the display pipeline like a theater. The kernel is the stage manager. The DRM module is the lighting director. The compositor is the stage crew. Without mode setting enabled, the lighting director refuses to talk to the stage manager. The crew cannot set up the lights. The show defaults to a static backdrop. Enabling the parameter gives the lighting director a direct line to the stage manager. The crew gets the signals they need. The stage comes alive.
The fix
You need two things. The proprietary driver package and the kernel parameter. Fedora uses grubby to manage boot parameters instead of editing GRUB configuration files by hand. This keeps your boot loader consistent across kernel updates. The package manager calls grubby automatically when a new kernel ships. You should use the same tool.
First, install the driver. The akmod-nvidia package compiles the kernel module on your first boot using the currently running kernel headers. This avoids the manual DKMS setup that breaks during kernel updates. The build process requires a C compiler and the kernel development files.
sudo dnf install akmod-nvidia xorg-x11-drv-nvidia-cuda kernel-devel kernel-headers # WHY: akmod builds the module automatically on boot. kernel-devel provides the headers it needs.
sudo dnf install gcc make # WHY: akmod requires a C compiler and build tools to compile the module against your kernel.
sudo dnf upgrade --refresh # WHY: Ensures all base packages are current before the akmod service attempts to compile against the kernel headers.
Next, tell the kernel to enable DRM mode setting for the NVIDIA driver. The grubby command applies the parameter to every installed kernel at once. You do not need to edit /etc/default/grub or run grub2-mkconfig. Fedora's package manager handles GRUB updates through grubby automatically. Editing /etc/default/grub directly creates drift between the file and the actual boot entries.
sudo grubby --update-kernel=ALL --args="nvidia-drm.modeset=1" # WHY: --update-kernel=ALL targets every kernel in /boot. --args appends the parameter to the existing boot line.
sudo grubby --info=ALL | grep "nvidia-drm" # WHY: Confirms the parameter was written to the boot configuration. You should see it listed under kernel args.
Reboot the system. The akmod service will compile the NVIDIA module during the boot process. You will see a brief delay while the build completes. This is normal and only happens once per kernel update. The service runs in the background and logs its progress to the journal.
sudo reboot # WHY: The kernel parameter only takes effect on boot. The akmod service also needs a fresh kernel environment to compile.
Check the boot logs if the system takes longer than usual. The module compilation happens early in the boot sequence. Trust the package manager. Manual file edits drift, snapshots stay.
Verify it worked
Log in and check your session type. The environment variable $XDG_SESSION_TYPE reports the display server your desktop environment is currently using. GNOME sets this variable before launching the shell.
echo $XDG_SESSION_TYPE # WHY: Prints wayland if GNOME started successfully. Prints x11 if the system fell back to the legacy server.
loginctl show-session $(loginctl | awk 'NR==2{print $1}') -p Type # WHY: loginctl queries the session manager directly. This method works even if the shell variable is unset.
You can also verify that the kernel module loaded with mode setting enabled. The journalctl output will show the DRM subsystem claiming the GPU. The kernel logs are the most reliable source of truth for driver initialization.
journalctl -k --grep=nvidia-drm | tail -n 5 # WHY: -k filters kernel messages. --grep isolates the NVIDIA DRM module. tail shows the most recent load events.
dmesg | grep -i "drm" | tail -n 3 # WHY: dmesg provides a quick snapshot of kernel ring buffer messages. Useful for rapid verification.
Look for a line containing NVIDIA: GPU ... is using DRM mode setting. If you see it, the kernel parameter is active. GNOME will now offer the Wayland session at the login screen. Select it and log in. Run journalctl -xe first. Read the actual error before guessing.
Common pitfalls and what the error looks like
The most common failure is a missing kernel module build. If akmod cannot find the kernel headers, the boot process drops to an emergency shell or falls back to the Nouveau driver. You will see this in the journal:
nvidia-drm: module verification failed: signature and/or required key missing - tainting kernel
This message appears when Secure Boot is enabled and the module is not signed. Fedora's akmod workflow does not sign third-party modules automatically. You must either disable Secure Boot in the firmware settings or use the kmod-nvidia package instead. The kmod package ships pre-compiled binaries for the current kernel. It does not require a compiler. It also does not rebuild automatically when a new kernel ships. You must reinstall it after every kernel update.
Another frequent issue is multi-GPU systems. If your machine has both an integrated Intel or AMD GPU and a discrete NVIDIA card, the kernel parameter applies to the NVIDIA card only. GNOME may still default to X11 if it detects a hybrid setup. You can force Wayland by ensuring the discrete GPU is properly powered and recognized. Check the PCI bus enumeration in the journal.
lspci -k | grep -A 3 -i nvidia # WHY: Shows the NVIDIA device and the kernel driver currently bound to it. Confirms the hardware is visible to the system.
If the Wayland session crashes immediately after login, check the GNOME logs. The compositor may be failing to initialize the GPU context. PipeWire and the audio server also rely on the display server for session management. A broken display server breaks everything downstream.
journalctl -u gdm -xe --since "5 minutes ago" # WHY: -u gdm isolates the display manager logs. -x adds explanatory hints. -e jumps to the end. --since limits the output to recent events.
Look for EGL or GLX initialization failures. Switch back to X11 temporarily. Update your firmware. Retry. Reboot before you debug. Half the time the symptom is gone.
When to use this vs alternatives
Use Wayland when you want modern compositing, proper HiDPI scaling, and secure pointer confinement for password fields. Use X11 when you run legacy applications that rely on X11 forwarding or global screen capture tools that do not support PipeWire. Use the open-source Nouveau driver when you need out-of-the-box Wayland support without proprietary dependencies. Stay on the default X11 session if you are troubleshooting a broken display pipeline and need a stable baseline.