How to do a Release Upgrade on Linux System

System upgrade is only officially supported and tested over 2 releases at most (e.g. from 38 to 40).
When upgrading across more than two releases, you may need to import the GPG key for the release you want to update to. You can do this with:
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-N-primary

# Performing system upgrade
sudo dnf -y install dnf-plugin-system-upgrade # require plugin for DNF4
sudo dnf --refresh upgrade
sudo dnf system-upgrade download --releasever=41
sudo dnf system-upgrade reboot

# Clean packages cache
sudo dnf system-upgrade clean
sudo dnf clean packages

# Optional post-upgrade tasks
sudo dnf install rpmconf
sudo rpmconf -a

# Update GRUB bootloader on BIOS systems
sudo mount | grep "/boot "
sudo grub2-install /dev/sda

# Clean-up retired packages, Upgrades across more than two releases are not supported.
sudo dnf install remove-retired-packages
remove-retired-packages

# Clean-up old packages
sudo dnf repoquery --duplicates
sudo dnf remove --duplicates
sudo dnf remove $(sudo dnf repoquery --extras --exclude=kernel,kernel-\*,kmod-\*)
sudo dnf autoremove

# Clean-up old kernels
cat >/tmp/cleanup_old_kernel.sh <<"EOF"
#!/usr/bin/env bash

old_kernels=($(dnf repoquery --installonly --latest-limit=-1 -q))
if [ "${#old_kernels[@]}" -eq 0 ]; then
echo "No old kernels found"
exit 0
fi

if ! dnf remove "${old_kernels[@]}"; then
echo "Failed to remove old kernels"
exit 1
fi

echo "Removed old kernels"
exit 0
EOF

chmod +x /tmp/cleanup_old_kernel.sh
sudo /tmp/cleanup_old_kernel.sh

# Clean-up old keys trusted for RPM package signing
sudo dnf install clean-rpm-gpg-pubkey
sudo clean-rpm-gpg-pubkey

# Clean-up old symlinks
sudo dnf install symlinks
sudo symlinks -r /usr | grep dangling
sudo symlinks -r -d /usr

# Update rescue kernel
sudo rm /boot/*rescue*
sudo kernel-install add "$(uname -r)" "/lib/modules/$(uname -r)/vmlinuz"
sudo dnf install dracut-config-rescue
sudo apt update && sudo apt upgrade
sudo sed -i '/^Prompt/s/Prompt=.*/Prompt=normal/' /etc/update-manager/release-upgrades
sudo do-release-upgrade