Fedora Silverblue Setup Guide
Fedora Linux
Feel free to contact me if you have any question with these instructions! Either through email or on the website’s GitHub repository.
Many of the contents here are borrowed from Willi Mutschler. However, since I work with Fedora Silverblue rather than Fedora Workstation, many of the installation steps would be different due to the immutable nature of Silverblue. For that reason, I think this post would still show it’s value.
The version used is Fedora Silverblue 39 at the time this post is written. Most of the softwares are probably more personal and economists-oriented.
Background Info for Silverblue
Silverblue differs from the normal Fedora Workstation as it is immutable, meaning the system files are read-only and updates are installed as a whole. Put it more technically, /
and /usr
and everything below it is read-only, while stuffs under /var
are user-changeable. For more information, please consult Fedora Docs.
This means Silverblue needs to install applications and packages differently from Workstation, i.e. dnf install
will not work, more specifically, there are 3 ways to do it.
Flatpak
Flatpak is the predominant way to install applications, as it places each application into a sandbox, aligning with the immutable approach of the Silverblue.
It is generally recommended to add Flathub repo to gain access to more applications, for instructions to do that, please consult Fedora Doc.
Toolbox
Toolbox creates an isolated container to install packages and softwares, it is almost like a emulator of the host system, or like a self-contained system that is attached to the host system.
To create a toolbox, you can use the command:
create toolbox --container [name of container]
After entering the toolbox
toolbox eneter [name of container]
It is possible to use the normal Fedora/RHEL command.
Layering
Layering is against the immutable approach of the system, but, many packages benefits from layering as it is layer upon the system and has a more direct connection with the system. I would recommend only install very necessary packages using layering, like graphics card drivers etc.
To layer a package onto the system:
rpm-ostree install [package name]
To uninstall a layered package:
rpm-ostree uninstall [package name]
Graphics
Wayland & Xorg
Fedora uses Wayland as default and will depreciate Xorg gradually, but in practice the experience is quite awful if you have a Nvidia card with drivers not properly set up. However, lately advancement from Nvidia side has made Wayland quite usable, providing you installed all the drivers.
Use Xorg
By using Xorg session, I can solve most displaying issues with VSCode and Obsidian (Both installed through Flatpak). To use Xorg instead of Wayland, uncomment WaylandEnable=false
and add DefaultSession=gnome-xorg.desktop
to the [daemon] section of /etc/gdm/custom.conf
sudo nano /etc/gdm/custom.conf
# [daemon]
# WaylandEnable=false
# DefaultSession=gnome-xorg.desktop
# Cuda libs for Xorg
rpm-ostree install xorg-x11-drv-nvidia-cuda
rpm-ostree install xorg-x11-drv-nvidia-cuda-libs
And then reboot for the change to take effect.
Nvidia & Wayland
To install the proprietary Nvidia driver
rpm-ostree update
# Nvidia proprieatary driver
rpm-ostree install akmod-nvidia
# The Nvidia proprieatary driver doesn't support VAAPI, but there is a wrapper that can bridge NVDEC/NVENC with VAAPI
rpm-ostree install nvidia-vaapi-driver
# Provides more codec for video streaming
rpm-ostree install libavcodec-freeworld
After all the installations, follow the instruction and reboot the system
systemctl reboot
Softwares
Foliate
I really like this handy software to read my .epub
books, but it has some problem accessing the graphics card or some sort, resulting in the page not being able to render properly. I think the problem mostly lies with the fact of lack of permission.
The simplest way to fix this issue is to disable GPU acceleration for Foliate, to do that.
- Install
Flatseal
either by GUI or command line - Disable the GPU acceleration option for Foliate
- Problem fixed!
Since Foliate is not a very demanding software, even without GPU acceleration the whole thing runs smoothly enough for me to not search for other solutions.
MATLAB
Installation
Always refer to the official installation guide for more info.
-
After the downloading the MATLAB installation file, unzip it with
unzip matlab_R2023b_glnxa64.zip -d matlab_R2023b_glnxa64
-
Navigate to
matlab_R2023b_glnxa64
directory and launch the installer with./install
-
Install MATLAB under
/var
directory so you have full permission, the way I do it is/var/home/$USER/bin
Desktop Entry
Here is a reference for what you need to put in for the desktop entry
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/var/home/$USER/bin/MATLAB/R2023b/bin/matlab -desktop
Name=MATLAB R2023b
Icon=/var/home/$USER/bin/MATLAB/bin/glnxa64/cef_resources/matlab_icon.png
Categories=Development;Math;Science
Comment=Scientific computing environment
StartupNotify=true
StartupWMClass=sun-awt-X11-XFramePeer
MimeType=text/x-matlab
Libraries
Although Willi Mutschler suggests that it is better to use system libraries instead of MATLAB’s shipped libraries, as it solves most issues with MATLAB. During my experiment, this is not the case as with Silverblue, MATLAB does not have the access to system level files and is unable to utilize the system libraries. Thus, there is no need to exclude the shipped packages with MATLAB, in fact, you need to copy some packages from system to MATLAB directories for Dynare to work properly, as it cannot access system level file either.
Dynare
Dynare needs to be compiled from source on a Fedora-based system, and the method to do it is slightly different in Silverblue.
Fundamental packages
In order to compile Dynare, we need to install several packages, I would recommend install these packages in a toolbox to align with the immutable approach.
toolbox create --container Dynare-compile
# Enter the toolbox
toolbox enter Dynare-compile
Install all the packages inside this toolbox
# Minimal packages (use --disable-doc and --disable-octave flags)
sudo dnf install -y gcc gcc-g++ gfortran boost-devel gsl-devel lapack lapack-devel matio-devel openblas openblas-devel suitesparse-devel bison flex make autoconf automake redhat-rpm-config
# Octave packages (use --disable-doc flag)
sudo dnf install -y octave octave-devel octave-statistics octave-io octave-optim octave-control
# Documentation packages
sudo dnf install -y texlive-scheme-minimal texlive-collection-publishers texlive-collection-latexextra texlive-collection-fontsextra texlive-collection-latexrecommended texlive-collection-science texlive-collection-plaingeneric texlive-lm python3-sphinx latexmk mathjax doxygen
Next, compile solicot
and x13as
, although I am not very sure the use of x13as
as it is not directly involved in the compiling. The code below are from Dynare compiling instruction for Fedora, CentOS or RHEL on GitLab.
# compile slicot from source and put it into /home/$USER/dynare/slicot/lib/
mkdir -p /var/home/$USER/dynare/slicot
cd /var/home/$USER/dynare/slicot
wget https://deb.debian.org/debian/pool/main/s/slicot/slicot_5.0+20101122.orig.tar.gz
tar xf slicot_5.0+20101122.orig.tar.gz
cd slicot-5.0+20101122
make FORTRAN=gfortran OPTS="-O2 -fPIC -fdefault-integer-8" LOADER=gfortran lib
mkdir -p /var/home/$USER/dynare/slicot/lib
cp slicot.a /var/home/$USER/dynare/slicot/lib/libslicot64_pic.a #for MATLAB
cp slicot.a /var/home/$USER/dynare/slicot/lib/libslicot_pic.a #for octave
# compile x13as from source and put it into /usr/bin/
mkdir -p /var/home/$USER/dynare/x13as
cd /var/home/$USER/dynare/x13as
wget https://www2.census.gov/software/x-13arima-seats/x13as/unix-linux/program-archives/x13as_asciisrc-v1-1-b60.tar.gz
tar xf x13as_asciisrc-v1-1-b60.tar.gz
sed -i "s|-static| |" makefile.gf # this removes '-static' in the makefile.gf
make -f makefile.gf FFLAGS="-O2 -std=legacy" PROGRAM=x13as
sudo cp x13as /usr/bin/
Compile Dynare
Once the perquisite packages are sorted, we can start to compile Dynare.
cd /var/home/$USER/dynare
# This uses the current unstable branch
git clone --recurse-submodules https://git.dynare.org/dynare/dynare.git unstable
cd unstable
# Direct Dynare to your MATLAB path
meson setup -Dmatlab_path=/var/home/$USER/bin/MATLAB -Dfortran_args="[ '-B', '/var/home/$USER/dynare/slicot/lib']" -Dbuildtype=debugoptimized build-matlab
meson compile -C build-matlab
ninja -C build-matlab
meson install -C build-matlab
These steps shall give you a nearly workable Dynare, expect now it needs the latest libstdc++.so.6
and libstdc++.so.6.0.32
packages shipped with the system. As I mentioned before, Silverblue makes MATLAB lack the access to use the system shipped packages, rather, we have to rely on those shipped with MATLAB.
To do this, we first move the libstdc++.so.6
and libstdc++.so.6.0.32
packages came with MATLAB to an exclude folder and the copy-paste the one from our system into MATLAB.
export MATLAB_ROOT=/var/home/$USER/bin/MATLAB
cd /var/home/$USER/bin/MATLAB/sys/os/glnxa64
mkdir -p exclude
mv libstdc++* exclude/
cd /lib64
cp libstdc++.so.6 /var/home/$USER/bin/MATLAB/sys/os/glnxa64
cp libstdc++.so.6.0.32 /var/home/$USER/bin/MATLAB/sys/os/glnxa64
This should give you a running Dynare, simply add Dynare into the directory in MATLAB after.
LaTeX
I use LaTeX with VSCode for all my writings, but to use this combo is a bit harder in Silverblue. My approach is to install LaTeX in a toolbox and then let VSCode (and LaTeX Workshop) communicate with LaTeX stored inside the toolbox.
Install TeX Live
# Create the LaTeX container
toolbox create --container LaTeX
toolbox enter LaTeX
# Add the Tex Live repository if needed
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/texlive/fedora/
# Instal the package
sudo dnf install texlive texlive-scheme-full texlive-extra-utils
# Update the packages
sudo dnf update texlive*
# Verify the installation
tex --version
VSCode and LaTeX Workshop extension
Simply use the flatpak to install VSCode, the community maintained version works fine for me, or you could work a way to install the official one by layering or through toolbox.
After installing VSCode, use the extension shop to install LaTeX Workshop extension.
Once LaTeX Workshop is install, we need to configure it so that it can communicate with LaTeX in the toolbox, for that, we need to edit the settings.json
of VSCode
Change the corresponding entries in the settings.json
to be
// Only if you use LaTeX Utilities extension for word count etc.
"latex-utilities.countWord.path": "host-spawn",
"latex-utilities.countWord.args": ["toolbox", "run", "--container", "LaTeX", "texcount"],
// Required for LaTeX Workshop
"latex-workshop.latex.tools": [
{
"name": "latexmk",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"latexmk",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"%DOC%"
],
"env": {}
},
{
"name": "lualatexmk",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"latexmk",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-lualatex",
"-outdir=%OUTDIR%",
"%DOC%"
],
"env": {}
},
{
"name": "xelatexmk",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"latexmk",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-xelatex",
"-outdir=%OUTDIR%",
"%DOC%"
],
"env": {}
},
{
"name": "latexmk_rconly",
"command": "latexmk",
"args": [
"%DOC%"
],
"env": {}
},
{
"name": "pdflatex",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"pdflatex",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
],
},
{
"name": "bibtex",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"bibtex",
"%DOCFILE%"
],
"env": {}
},
{
"name": "rnw2tex",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"Rscript",
"-e",
"knitr::opts_knit$set(concordance = TRUE); knitr::knit('%DOCFILE_EXT%')"
],
"env": {}
},
{
"name": "jnw2tex",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"julia",
"-e",
"using Weave; weave(\"%DOC_EXT%\", doctype=\"tex\")"
],
"env": {}
},
{
"name": "jnw2texminted",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"julia",
"-e",
"using Weave; weave(\"%DOC_EXT%\", doctype=\"texminted\")"
],
"env": {}
},
{
"name": "pnw2tex",
"command": "host-spaFeel free to contact me if you have any question with these instructions!wn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"pweave",
"-f",
"tex",
"%DOC_EXT%"
],
"env": {}
},
{
"name": "pnw2texminted",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"pweave",
"-f",
"texminted",
"%DOC_EXT%"
],
"env": {}
},
{
"name": "tectonic",
"command": "host-spawn",
"args": [
"toolbox",
"run",
"--container",
"LaTeX",
"tectonic",
"--synctex",
"--keep-logs",
"%DOC%.tex"
],
"env": {}
}
],
"latex-workshop.linting.chktex.enabled": true,
"latex-workshop.linting.chktex.exec.path": "host-spawn",
"latex-workshop.linting.chktex.exec.args": [
"toolbox",
"run",
"--container",
"LaTeX",
"chktex",
"-wall",
"-n22",
"-n30",
"-e16",
"-q"
],
This would allow LaTeX Workshop to communicate with LaTeX.