I really like how Fedora Silverblue combines the best of atomic, image-based updates and local tweaking with its package layering idea.
However, one major issue many people has had with it is support for the NVIDIA drivers. Given they ares not free software they can’t be shipped with the image, so one imagines using package layering to would be a good way to install it. In theory this works, but unfortunately it often runs into issues, because frequent kernel updates cause there to be no pre-built nvidia module for your particular kernel/driver version.
In a normal Fedora installation this is handled by something called akmods. This is a system where the kernel modules ship as sources which get automatically rebuilt on the target system itself when a new kernel is installed.
Unfortunately this doesn’t quite work on Silverblue, because the system image is immutable. So, I’ve been working recently on making akmods work in silverblue. The approach I’ve taken is having the modules being built during the rpm-ostree update command (in the %post script) and the output of that being integrated into the newly constructed image.
Last week the final work landed in the akmods and kmodtools packages (currently available in updates-testing), which means that anyone can easily experiment with akmods, including the nvidia drivers.
Preparing the system
First we need the latest of everything:
$ sudo rpm-ostree update
The required akmods packages are in updates-testing at the moment, so we’ll enable that for now:
$ sudo vi /etc/yum.repos.d/fedora-updates-testing.repo
... Change enabled to 1 ..
Then we add the rpmfusion repository:
$ sudo rpm-ostree install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-29.noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-29.noarch.rpm
At this point you need to reboot into the new ostree image to enable installation from the new repositories.
$ systemctl reboot
Installing the driver
The akmod-nvidia package in the current rpm-fusion is not built against the new kmodtools, so until it is rebuilt it will not work. This is a temporary issue, but I built a new version we can use until it is fixed.
To install it, and the driver itself we do:
$ sudo rpm-ostree install http://people.redhat.com/alexl/akmod-nvidia-418.43-1.1rebuild.fc29.x86_64.rpm xorg-x11-drv-nvidia
Once the driver in rpm-fusion is rebuilt the custom rpm should not be necessary.
We also need to blacklist the built-in nouveau driver so to avoid driver conflicts:
$ sudo rpm-ostree kargs --append=rd.driver.blacklist=nouveau --append=modprobe.blacklist=nouveau --append=nvidia-drm.modeset=1
Now you’re ready to boot into your fancy new silverblue nvidia experience:
$ systemctl reboot
What about Fedora 30/Rawhide?
All the changes necessary for this to work have landed, but there is no Fedora 30 Silverblue image yet (only a rawhide one), and the rawhide kernel is built with mutex debugging which is not compatible with the nvidia driver.
However, the second we have a Fedora 30 Silverblue image with a non-debug kernel the above should work there too.