Skip to content

Instantly share code, notes, and snippets.

@marhensa
Last active June 24, 2025 01:15
Show Gist options
  • Save marhensa/3777c13be4ddd87c56aee0f16b21338f to your computer and use it in GitHub Desktop.
Save marhensa/3777c13be4ddd87c56aee0f16b21338f to your computer and use it in GitHub Desktop.
Fedora 42 Workstation Post-Installation

Fedora 42 Workstation (GNOME 48) Post-Installation

Various post-installation tasks for a Fedora 42 Workstation setup using GNOME 48, an Nvidia GPU, and Wayland session.

Set the Boot Order (for Dual Boot) and fix the blurry GRUB

# Use lsblk to find Windows EFI partition, note that, 
# this case it's /dev/nvme0n1p1
lsblk
sudo nano /etc/default/grub

Change this value, or add lines and values if they don't exist:

GRUB_TIMEOUT=7
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)"
GRUB_TERMINAL_OUTPUT="gfxterm"
GRUB_GFXMODE=1920x1080x32,1366x768x32,1280x720x32,auto
GRUB_GFXPAYLOAD_LINUX=keep

Build the new GRUB configuration:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Initial System Setup

# Firmware Updates
sudo fwupdmgr refresh --force
sudo fwupdmgr get-updates
sudo fwupdmgr update

# Set a custom hostname
sudo hostnamectl set-hostname xxxx-pc

# Configure system clock for dual-booting with Windows (optional if not dual-booting).
# For following Windows standard, set to 1 (as Windows expects the RTC to be local time).
# For following Linux / MacOS standard (default), set to 0 as it will set the hardware clock to UTC.
sudo timedatectl set-local-rtc '1'
# sudo timedatectl set-local-rtc '0'

# Optional: Disable NetworkManager-wait-online.service to potentially speed up boot
# Be cautious: may affect services that rely on network being up at boot
# sudo systemctl disable NetworkManager-wait-online.service

# Optional: Prevent GNOME Software from auto-starting
sudo mv /etc/xdg/autostart/org.gnome.Software.desktop \
/etc/xdg/autostart/org.gnome.Software.desktop.disabled
# To enable it again:
sudo mv /etc/xdg/autostart/org.gnome.Software.desktop.disabled \
/etc/xdg/autostart/org.gnome.Software.desktop

1. Configure DNF for Faster Downloads

Edit local dnf.conf

sudo nano /etc/dnf/libdnf5.conf.d/80-local.conf
[main]
max_parallel_downloads=10
fastestmirror=true

2. Add Essential Repositories

# Add RPM Fusion (free and non-free)
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

# Optional: Add Terra repository (for extra packages)
# Note: Using --nogpgcheck is generally discouraged. But it seems it can't do without it for Terra
# sudo dnf install --nogpgcheck --repofrompath 'terra,https://repos.fyralabs.com/terra$releasever' -y terra-release

# Add Flathub repository for Flatpak applications
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
# Optional: Remove Fedora's own Flatpak remote if you prefer Flathub exclusively
# flatpak remote-delete fedora

# Refresh system after adding new repositories
sudo dnf upgrade --refresh -y

3. Install NVIDIA Drivers and CUDA Support

# Optional Pre-requisites (usually handled by akmod, but good for Secure Boot setups, manual signing is needed)
# For systems with Secure Boot, you might need to enroll RPM Fusion's keys.
# sudo dnf install -y kernel-devel kernel-headers gcc make dkms

# --- OPTIONAL BUT RECOMMENDED FOR NVIDIA RTX 4000/5000 SERIES AND NEWER ---
# These GPUs can benefit from or may require NVIDIA’s open kernel modules.
# To enable building with open kernel module support via akmod:
# This is a one-time setting. Execute this command BEFORE installing akmod-nvidia.
# sudo mkdir -p /etc/rpm/macros.d/
# echo "%_with_nvidia_open 1" | sudo tee /etc/rpm/macros.d/macros.nvidia-open
# --- End of optional step for newer NVIDIA GPUs ---

Install NVIDIA drivers and CUDA support

sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cuda

Note: If you enabled the nvidia-open macro above (for RTX 4xxx/5xxx), akmod will attempt to build with it.

Enable NVIDIA DRM Kernel Mode Setting (KMS) for Wayland and smoother experience

sudo grubby --update-kernel=ALL --args="nvidia-drm.modeset=1"

IMPORTANT: REBOOT REQUIRED!

sudo reboot

Post-Reboot NVIDIA Checks (Manual)

# Verify nvidia-drm.modeset=1 is in kernel command line
cat /proc/cmdline

# Optional: Manually inspect GRUB configuration (if needed)
# sudo nano /etc/default/grub

# Check if NVIDIA drivers are loaded and GPU is recognized
nvidia-smi

# Scale the UI for High-DPI screen
# You can now set the fractional scaling to your liking: 125%, 150%, 175%, etc. (Settings > Display)

# Personally, I prefer the Large Size Text "trick" (Settings > Accessibility > Seeing > Large Text)
# Using Large Text won't mess with the scaling of content (pictures, video, etc), 
# it just scales the font and the UI will follow.
# For granular Large Text size trick can be done with Gnome Tweaks: `sudo dnf install -y gnome-tweaks`

Experimental: Force Simple KMS for Mutter

(Potential fix for screen freeze and stutter) If you experience occasional screen freezes, cursor stuttering, or other graphical glitches, especially with NVIDIA drivers, forcing Mutter (the GNOME window manager) to use a simpler Kernel Mode Setting (KMS) mode might help. This disables Atomic KMS, which can sometimes be a source of issues.

To apply this experimental change:

sudo nano /etc/profile.d/mutter-kms-simple.sh
# Force Mutter to use simple KMS mode
export MUTTER_DEBUG_FORCE_KMS_MODE='simple'
# Make the script executable:
sudo chmod +x /etc/profile.d/mutter-kms-simple.sh
sudo reboot

To revert this change to default:

sudo rm /etc/profile.d/mutter-kms-simple.sh
sudo reboot

Experimental: Disable the NVIDIA GPU System Processor (GSP)

Disabling it because GSP is offloading some CPU task to GPU, which sometimes hurt GPU performance.

Disabling Hardware-Accelerated GPU Scheduling (HAGS) on Windows 11 are done for the same reason.

sudo nano /etc/modprobe.d/nvidia-gsp-disable.conf

Comment this line:

# options nvidia NVreg_EnableGpuFirmware=0

4. Install Multimedia Codecs & Hardware Video Decoding (VA-API)

# Enable Cisco OpenH264
sudo dnf config-manager setopt fedora-cisco-openh264.enabled=1

# Switch to full ffmpeg
sudo dnf swap -y ffmpeg-free ffmpeg --allowerasing

# Install essential codecs and H/W Video Decoding with VA-API support
sudo dnf install -y openh264 gstreamer1-plugin-openh264 ffmpeg-libs libva libva-utils

# Wrapper that can bridge NVDEC/NVENC with VA-API
sudo dnf install -y libva-nvidia-driver

# Install additional codec
sudo dnf update -y @multimedia --setopt="install_weak_deps=False" --exclude=PackageKit-gstreamer-plugin

# Install additional codec and tools for HiFi Bluetooth Audio
sudo dnf install -y pipewire-codec-aptx libfreeaptx blueman bluez-tools

# Alternative/Broader: Install sound and video group
# sudo dnf group install -y sound-and-video

5. Edit the PipeWire Configuration if your DAC supports High Sample Rate

# If your DAC supports higher than 48 kHz sample rate audio, you can change it from here:
# Change it from user configuration (needs to be copied first)
mkdir -p ~/.config/pipewire && \
cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/pipewire.conf
nano ~/.config/pipewire/pipewire.conf

# Note: Editing from user configuration doesn't work for me, so I edit from the system-wide.
# sudo nano /usr/share/pipewire/pipewire.conf
# If you edit from system-wide, you might need to edit /usr/share/pipewire/pipewire.conf 
# after every PipeWire package updated
## Properties for the DSP configuration.
default.clock.rate          = 96000
default.clock.allowed-rates = [ 44100 48000 96000 192000 384000 ]
# Restart PipeWire for the updated changes
systemctl --user restart pipewire pipewire-pulse wireplumber
# To check the bit rate and sample rate
pw-top
# Note: 
# Spotify will use the media played bit rate and sample rate
# System / Gnome and most other apps will use what you set

6. Install Firefox h264 Plugin & Firefox Settings

# Install Firefox h264 Plugin
sudo dnf install -y mozilla-openh264

# Enable the h264 plugin on Firefox settings

# While you at it, also set this:
# Go to `about:config` and set:
# layers.acceleration.force-enabled → true
# media.ffmpeg.vaapi.enabled → true
# gfx.webrender.all → true

If you want Brave Browser

# If you want also remove Firefox completely
# sudo dnf remove -y mozilla-openh264 firefox && rm -rf ~/.mozilla/firefox/ ~/.cache/mozilla/
curl -fsS https://dl.brave.com/install.sh | sudo sh

# For better Wayland experience, go to `brave://flags` and set:
# ozone-platform-hint → Wayland
# wayland-ui-scaling → Enabled
# wayland-linux-drm-syncobj → Enabled

If you want Microsoft Edge Browser (for some reason, likely it has great PDF tools)

# To install Microsoft Edge
sudo wget https://packages.microsoft.com/yumrepos/edge/config.repo -O /etc/yum.repos.d/microsoft-edge.repo
sudo dnf makecache
sudo dnf install microsoft-edge-stable

# For better Wayland experience, go to `edge://flags` and set:
# ozone-platform-hint → Wayland
# wayland-ui-scaling → Enabled
# wayland-linux-drm-syncobj → Enabled

# To remove Microsoft Edge
sudo dnf remove microsoft-edge-stable
sudo rm /etc/yum.repos.d/microsoft-edge.repo
sudo dnf makecache
rm -rf ~/.config/microsoft-edge/

7. Install Oh My Posh (Shell Customization)

# Install Oh My Posh
curl -s https://ohmyposh.dev/install.sh | bash -s

# Install a font for Oh My Posh (it will install Nerd Font variants)
oh-my-posh font install
# Choose Nerd Font(s) you want to install/try

# Refresh font cache
fc-cache -fv

# Set your terminal fonts to use the Nerd variants.
# It has "Nerd" on its name.

# Configure Oh My Posh for Bash (add to ~/.bashrc)
omp_theme='eval "$(oh-my-posh init bash --config /home/$USER/.cache/oh-my-posh/themes/slimfat.omp.json)"' \
&& sed -i '/oh-my-posh init bash/d' ~/.bashrc \
&& echo "" >> ~/.bashrc \
&& echo "$omp_theme" >> ~/.bashrc \
&& exec bash

# For upgrade
oh-my-posh upgrade --force

8. Install GNOME Utilities

sudo dnf install -y gnome-tweaks gnome-extensions-app

9. Install Applications

Apps from Fedora/RPM Fusion Repositories

# Something essentials
sudo dnf install -y seahorse gnome-sound-recorder meld fastfetch btrfs-assistant btrbk ncdu # etc ...

# For Development and stuff
sudo dnf group install -y development-tools c-development && sudo dnf install -y cmake clang

Apps from Flathub Store (Install via GNOME Software or flatpak install)

These are examples, install them manually.

  • Extension Manager (Essential for installing Gnome Extensions below)
  • Czkawka (Apps to check differences of files and folders)

GNOME Extensions (Install via Extension Manager or extensions.gnome.org)

These are examples, install them manually.

  • Dash to Panel Windows-like taskbar with lots of customization
  • Vitals shows hardware resource usage
  • Hide Accessibility Menu useful if using the Large Text "trick" instead of fractional scaling
  • Tiling Assistant unlocks 4 regions of window tiling
  • Caffeine button to temporarily prevent sleep / suspend
  • Coverflow Alt-Tab 3D card effect for switching between windows
  • Desktop Cube 3D cube effect for workspace overview / switching
  • Compiz alike magic lamp effect jelly effect when minimizing a window
  • Compiz window effect jelly effect of a window
  • Burn My Windows TV shutdown effect on closing a window

Apps from Custom/Third-Party Repositories

OnlyOffice

# Optional: Remove LibreOffice if replacing OnlyOffice
sudo dnf remove -y libreoffice\*

# Install OnlyOffice Desktop Editors
sudo dnf install -y \
https://download.onlyoffice.com/install/desktop/editors/linux/onlyoffice-desktopeditors.x86_64.rpm

Visual Studio Code (VSCode)

# Import Microsoft GPG Key
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

# Add VSCode repository
echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\nautorefresh=1\ntype=rpm-md\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" | sudo tee /etc/yum.repos.d/vscode.repo > /dev/null

# Check for updates from the new repo and install VSCode
sudo dnf check-update
sudo dnf install -y code

# Optional VSCode Customization: Native Title Bar
# In VSCode "Preferences: Open User Settings (JSON)"
# Add: "window.titleBarStyle": "native"
# Restart VSCode.

Spotify

# Add Negativo17 Spotify repository
sudo curl -o /etc/yum.repos.d/fedora-spotify.repo https://negativo17.org/repos/fedora-spotify.repo

# Install Spotify
sudo dnf install -y spotify

Steam & Gaming Software

# Install Steam 
sudo dnf install -y steam

# Install ProtonUp-Qt (it's a Proton Manager) from Flathub or via bash
flatpak install flathub net.davidotek.pupgui2
# Install latest GE-Proton

# Enable Steam Play Compatibility (for playing Steam Windows Games)
# Settings > Compatibility > Enable Steam Play for all other titles
# Use the installed GE-Proton as default

# Install Heroic Games Launcher (for EPIC, GOG, and Amazon Games)
sudo dnf copr enable atim/heroic-games-launcher
sudo dnf install heroic-games-launcher-bin
Sharing Steam Library from Dual Boot Setup

If you use your NTFS drive of Steam Library, SYMLINK your compatdata in your library!

WARNING! ACHTUNG! You don't want to end up corrupting your NTFS drive.

  • Create a folder in your home directory, wherever it is, as long as it's inside ~ (your home folder):
    mkdir -p ~/whatever-folder-you-prefer/compatdata
  • Link it to /ntfs-mounted-library/steamapps/compatdata. (Make sure the compatdata folder doesn't exist or delete it first if it's already populated.)
    ln -s ~/whatever-folder-you-prefer/compatdata /mnt/path-to/ntfs-mounted-library/steamapps/compatdata

compatdata contains compatibility files and folders to run games on Linux, a bunch of "fake" Windows folders (C:\Users, C:\Windows, C:\Program Files, etc.), "fake" drives (C: D: E:, etc), which sometimes the way it works may create some restricted characters (like for example, a colon :) that can't be used as a file/folder name on an NTFS drive.

10. Preload for Faster App Launch (slightly use RAM usage)

sudo dnf copr enable kylegospo/preload -y && sudo dnf install preload -y && sudo systemctl enable --now preload

11. Install uv - Multiple Python Version and Environments on Same Machine (and it's fast too!)

wget -qO- https://astral.sh/uv/install.sh | sh

# To update
uv self update

# Install Python
uv python install 3.12
# Or multiple downloads at once
uv python install 3.10.8 3.11 3.12
# Note: if you don't specify `y` in 3.x.y, it will find the latest version

# Reinstall Python
uv python install --reinstall

# To create an environment with a specific Python version
cd /path/to/your/project
uv venv .venv --python 3.12 --seed

# To activate the virtual environment
cd /path/to/your/project
source .venv/bin/activate

# To install packages that utilize the blazing-fast Rust-based pip package manager
# Activate the virtual environment
uv pip install some-packages

# You can still use pip (as long as `--seed` is used when creating the environment)
# Activate the virtual environment
pip install some-packages

# Important Note: The cache is located at: ~/.cache/uv
# To utilize the fast speed of uv,
# make sure the project and cache are on the same physical partition
# or in the same subvolume (if btrfs)

# To clean the uv pip cache:
uv cache clean
# To clean the pip cache, activate the virtual environment first.
source .venv/bin/activate
pip cache purge

12. Final System Update and Cleanup

sudo dnf autoremove -y
sudo dnf clean all
sudo dnf upgrade --refresh -y

13. Optional: Force Disable Sleep / Suspend while SSH at GDM Lockscreen

You might want this even you don't use SSH thingy, because suspend is buggy now with Nvidia GPU anyway!

sudo mkdir -p /etc/systemd/sleep.conf.d && \
sudo tee /etc/systemd/sleep.conf.d/sus-hib-off.conf << EOF
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
EOF

sudo systemctl daemon-reload
sudo systemctl restart systemd-logind.service
sudo reboot

# To revert it back to normal
# sudo rm /etc/systemd/sleep.conf.d/sus-hib-off.conf
# sudo systemctl daemon-reload
# sudo systemctl restart systemd-logind.service
# sudo reboot

Source:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment