Configuring an OS environment: An intro to Debian + GNU Guix

This is an anecdotal post on how I found myself installing GNU Guix on Sunday, even though my OS competence is such that installing Debian was a little challenge. The moral of this story is: moving towards software freedom even for the non-expert gives so many customizable options that I cannot believe that more people aren’t talking about and experiencing this.

Anecdotal introduction

I have been using a Linux distro for a few years now, but there are certain ‘behaviors’ that can be distracting sometimes, like icons constantly updating (does that mean they are spying?) Also, I am committed to taking steps up the freedom ladder, because so far (e.g. using Emacs for almost everything) has been so rewarding and definitely worth the time in the little learning curve for total beginners like me.

Why Debian? I have a laptop riddled with firmware (am I correct in saying that Microsoft is baked into the hardware?) but I had put Trisquel on it. This meant that the proprietary Wifi card was not read, and I had been planning to get a wifi USB like this or this, via the Free Software Foundation’s Ethical Tech Giving Guide.

But then, a few days ago, I learned that a conference was going to be held via Zoom, which obviously requires Wifi. I also use a VPN, so carefully went through all the Linux options supported. Frankly, I initially thought I would install a distro and delete it after the conference as I would not be surprised if Zoom, even in the browser, leaves all kinds of unfriendly code. However, distros really differ, which is a good thing but means it might take time to make a choice. Debian was the clear winner for me, and as I read the documentation, I quickly began to like it more and more.

Installing Debian

The Debian manual explains how to install it, but there were a few things that I found a little tricky, like determining my laptop’s processor architecture:
, or
uname -p

One of the Debian manuals explains that most processors today are AMD64 – which is the same thing as X86_64. (8 July update: trying to understand compilers has done wonders in illuminating the hardware-software connect. At some point I will write a post and link to it here.)

Another challenge was figuring out which file to download. Even though there is a clear page here, I did not download from there, but from one of the unofficial non-free images including firmware packages.

Because I know that checksum verification can easily fail, I went with the recommended jigdo means for downloading, which was very, very easy and so fast that I was really surprised. It also takes care of the verification process. I did not save this image directly to a USB, because the USB stick needs to be properly formatted first. Here are the instructions on creating a bootable Debian USB flashdrive. You can find out which directory your USB is in by typing:
before and after the USB is inserted: comparing the two outputs will reveal its location. Also, note that to unmount it before formatting, you need to use the appropriate command (it is likely the usb drive is named sdX where X could be a letter or number). Note that the entire drive is unmounted, not just one partition. Finally, note that the command is “umount”, not “unmount”:
<code>sudo umount /dev/sdb

That’s it! When I booted my computer to the USB, and as this is my first time with Debian, I went with the graphical installer, and opted for many of the obvious choices. However, this was the moment when I discovered the beauty of the Debian manual. I do not think that I have ever read such a clear document. More on that in a moment.

I also opted for a graphical interface, and when I was trying to customize it, I found myself unhappy with the software choices. For example, it seems to me (without having looked into it) that some of the browsers are so outdated as to not be fully compatible with Zoom. Sadly, I did not realize this possibility out until after the fact. To give a better example, Emacs is so outdated – I think the version was in the single digits, or something (and we are at 28 now). Looking around at how to get it (so far I have been using a ppa – not compiling yet – but wondered about other options), I came across many forum answers to this question suggesting GNU Guix.

Installing GNU Guix

I looked into the GNU Guix documentation and was amazed at how clear and minimal the pages are. I have never seen anything programming introduced so beautifully. Even though the download page made using it seem so easy, I was still overwhelmed. Could I really, as a non-hacker, use this without messing up my system?

But the GNU Guix documentation insisted that installing it would leave other files on the system untouched.

I have since discovered that Debian (Bullseye) itself has a package for it.

As I did not know that then, I follwed David’s instructions on System Crafters (I really need to get YT in Emacs running as I am sure I would enjoy watching that series, but avoid YT all together as a browser option.)

I will note that the installer script was not identical to the description in the Systems Crafters tutorial, but everything went well and I was able to follow the order of the steps. I love how that tutorial uses Emacs as the first GNU Guix package download example!

I had to stop at that step, though, and am figuring a few things out. The tutorial – as does the GNU Guix package installer! – asks us to configure our profile. This is where I enjoyed the Debian documentation. I learned about Enivornment profiles and Dot files. Look at this example from that last page:
Why is .bashrc a separate file from .bash_profile, then? This is done for mostly historical reasons, when machines were extremely slow compared to today’s workstations. Processing the commands in .profile or .bash_profile could take quite a long time, especially on a machine where a lot of the work had to be done by external commands (pre-bash). So the difficult initial set-up commands, which create environment variables that can be passed down to child processes, are put in .bash_profile. The transient settings and aliases which are not inherited are put in .bashrc so that they can be re-read by every subshell. Let’s take a moment to review.
I used the following command to see all files and hidden files, drives, and folders:
<code>ls -a
I used the following command to see what was inside some of those files, like .bashrc and .bash_profile, e.g.:
<code>$cat ~/.bash_profile

I learned that because I opted for a graphical interface, this changes the way that bash works, specifically (and maybe my wording here will be wrong) my shell environment is in .bashrc, and I will need to modify that to be able to customize .bash_profile and .profile without messing up any loading paths. I need to be extra sure about this because breaking something at startup would render the computer unusable. But I suppose I could just do a fresh reinstall if that happens.

I will update this page when I figure this part out. 8 July update: I’ve gone down the rabbit hole of trying to understand how compilers work in an attempt to take a bottom-up (or, low-level to high) approach to understanding the gist of how different functions, processes, and languages, etc. interrelate. This is clarifying so many other things for me (including contributing to an understanding of how Emacs works) – definitely recommended! March 2023 update:I reinstalled the same Debian install image and installed Guix following David’s instructions on System Crafters and got everything running. I installed a GUI again. But on one of the reboots, the GUI got all wonky. I assume the problem is firmware blobs because on the journey to getting everything running ‘just right’, I reinstalled Debian a few times and the graphical installer would sometimes give different prompts. The same computer now runs a nonfree Linux OS without these problems.

I would just like to note that using Debian + GNU Guix is a very clear, actionable step towards the free computing I yearned for when I installed Trisquel. I think that Debian + GNU Guix is better than Trisquel on machines with non-free hardware because GNU Guix can teach one the programming that would take full advantage of the “freedom” (to customize, share, extend, study) in “free software”.

Here are some other great resources on GNU Guix: Comments on this 2020 HN post, a debconf18 talk on My Crush on GNU Guix, and a BoilingSteam post on loving Arch but moving to GNU Guix.

Closing words

It is exciting to be able to customize one’s computing environment. This is exactly what computing is meant to do – work for us, not make us into automatons that serve its processes – which is what happens when we use standardized software, which is a very huge business.

The starting point of this exercise in freedom was being informed with under a week’s notice that I would need Zoom to attend a conference. I had Trisquel on a non-free machine, which meant the Wifi did not work, so I needed another workaround that still pointed towards freedom. I first installed Debian, then GNU Guix, and discovered that even as a complete beginner, I will be able to configure my environment so that it will be “just right”. I am in awe of the very hard work of the Debian and GNU Guix programmers who have made their programs so accessible to beginners, and making the freedom to customize computing also accessible. This is amazing!

The conference I attended over Zoom included much incisive critique about Zoom – things that I never considered, like how people’s agency is stripped if they are forcibly moved to breakout rooms, for example. As I do not use Zoom in my teaching, and have configured my use of video conferencing very differently (e.g. 1, 2, 3, 4, 5), this was not relevant to me. But my recent experience with GNU Guix is opening my eyes to potential for other tools we could make available to these Zoom users, so that teachers can cultivate not experiences in loss of agency but in practicing freedom.

Thank you to all the programmers, maintainers, developers, and free software community members who are keeping the vision and practice of freedom alive.

Page generated 02J12. Last edited 03E13.