GNU Guix Package manager & OS

Table of Contents

I have been using GNU Guix for about a year now. I use the Guix System OS on my second laptop and the server this website is on, but I also use the package manager on my main Debian laptop.

1. Guix shell

guix shell is definitely one of the top features of Guix. It allows you to quickly download any program and run it. Compared to apt or such, where downloading one package is an arduous process and might just break your system because of a conflict or something else, it is quick, reliable and has no side effects on your system besides the files made by the program (which can be eliminated via the usage of --container).

2. Profiles

The other feature that I consistently use, is profiles. My computer has several profiles, such as the emacs profile that contains all emacs-related packages, chromium profile with ungoogled chromium and ublock origin, latex that just contains TexLive, &c. It allows you to partition packages and manage them all separately as if they were on a different machine. I very rarely update my emacs profile, because there is no point; but reasonably often I add some packages to my guix-home profile. With a traditional package manager, I would have to update all of them to update one package, but now I don't have to.

The way I use profiles is primarily through manifests, which are just lists of packages. For example, my chromium manifest looks like this:

(specifications->manifest '("ungoogled-chromium" "ublock-origin-chromium"))

I keep all profiles under a $HOME/profiles directory, which makes it easy to activate them at startup (by running the $PROFILE/etc/profile script; note that this requires GUIX_PROFILE to be bound to that profile).

I can run guix package -m chrome.scm -p ~/profiles/chrome to update or reinstall it. These manifests are a great way to manage packages - I both keep track and partition the packages amongst them reasonably. They also allow arbitrary Guile code execution, which offers some interesting possibilities for install-time scripts.

guix time-machine interacts with profiles nicely. If a build is broken, you can go back a few commits with guix time-machine and install a package from that commit.

It also offers rollback capabilities using the guix package interface.

3. GuixSD on a server

Using Guix on a server is a decent experience. It's reasonably difficult to manage, but once you have it working, it works fairly well. Writing services is easy once you get the hang of it; I have about 3 custom services that modify various parts of the system. One great thing about them is that they're more or less isolated from each other.

If you're willing to put in the work to write the system definition, it's much easier to maintain compared to a standard Debian or whatnot; where you just have a mess of files, usually but not always located somewhere deep in etc. In Guix, if something is not working, there's just one place to look - the configuration file.

guix system really shines on the server. I have a single directory on my computer which contains the entire server. If I had to move it to a different machine, it'd be as easy as just installing Guix there and typing in guix system reconfigure.

I also use guix deploy so that I don't need to rsync the files over from my computer to the server, I can edit them comfortably on my computer and simply deploy them on the server. The manual states that it's intended for multiple machine deployments, but it's useful even for a single one.

Usually, the biggest problem with Guix services is that there is relatively little of them available. There's a decent amount of them covering most use-cases, but of course not all. Writing your own services is practically necessary if you're running a Guix server. Luckily it's not too difficult once you get the gist of it. I have 3 or so custom services, which are mostly just simple daemons, and those are fairly easy to write.