How I fell in love with Gentoo Linux, and why you (probably) shouldn’t use it.

I’ve been using Linux for what is essentially my entire life. I was never satisfied with any distribution, mostly because they’re ultimately all pretty much the same with a different package manager and repositories. Gentoo changed that.

Warning: nonsensical blogpost ahead! These are the words of an utterly insane nerd that cares way too much.

TL:DR, Every distro is essentially just Arch or Debian, if you want anything else, you should use Gentoo. Compile times suck, 5000 billion dead SSDs to Clang temporary files, but last system update gave me 8 extra FPS in Team Fortress 2 and Wayland isn’t real to my laptop and X11 isn’t real to my desktop, so clearly it’s worth it or something.

The (my) problem with Linux.

Linux has always had one massive flaw for me, and that was the issue of, ironically enough, how it can lack modularity. Now, I know, experimented users will find me crazy for saying this. But I want you to really think about it. Why is it that we all use Debian for our servers (if you use a BSD, you’re already too far gone, and if you use Nix, don’t you have a Mastodon instance to administrate?). Why is it that we all tell newbies to install Mint, and people who want to get into gaming to install Arch (or whatever flavor of the year is the current Arch fork. I’ve been loving CachyOS so far. Just don’t use Manjaro). Why is it that RHEL is for the serious enterprise grade servers and Fedora for people who want a Linux distribution that isn’t based on Debian and don’t want the trouble associated with Arch?

I’ll tell you why, it’s because our distributions are, ultimately, all the same in concept. They are a singular distribution. They provide you with one experience, and that’s all you get. Debian will make you use a stable system with field-tested packages that won’t change for a while. Fedora will make you use a relatively recent set of packages all in an integrated system based on RHEL. Arch will let you pick from a few choices for different components, sure, but they’re all expected to run with each other. Arch’s default KDE is made to be ran with Arch’s default NetworkManager and Arch’s default SystemD, and even if you chose to replace these components, they will still be Arch’s so that they may interface with Arch’s KDE.

Now, I realize that this is a “me” problem. People actively WANT this. And I can’t blame them. The idea of one cohesive desktop is precisely what makes Windows and Mac OS so appealing. Debian wouldn’t be as stable without this philosophy, and Arch sure as hell wouldn’t be able to just run pacman -Rns gnome-meta && pacman -S xfce4-meta and log out and back in to a completely different desktop environment that works just as well. Being opinionated is not a bad thing for most people, and that is not an insult at all. Having a system that does what you expect it to is perfectly fine…

… But oh my, do I HATE that! But to understand why, let me try and explain my use case for my main distribution.

What I use Linux for.

My personal use case revolves around four computers. This may sound excessive, but consider that they each have a real use in my workflow.

The first is my main machine. I use it for fairly heavy gaming and intensive software development. I want it to be as bleeding edge as possible, I want my drivers out of the Git repository if I can. I need it to have the latest and greatest in performance improvements, and to be full of the latest performance tweaks possible.

The second is my laptop. I use it for work, essentially exclusively. It needs to be relatively up to date so that I have access to all of the features I need, while still being stable enough to feel comfortable running a system update before going to my job or classes without fearing needing to troubleshoot. It needs to be optimized for a laptop-oriented workflow, which includes a lot of non-standard stuff (I need to use X11 over Wayland, as the only comfortable laptop DE I’ve found is I3WM alongside XFCE) and power efficiency focused components and kernel settings.

The third is my server. It is… a server. It has to be optimized for latency, and has to be rock solid. It needs to work with advanced security features such as SELinux and never, EVER break on updates. Breaking changes on updates should essentially NEVER happen. It should also be relatively minimal to save resources and be well-organized enough to be able to go from powering on to having all of my services and timed services running every time without fail.

The final one is my tiny Raspberry Pi B3. I use this little baby as a minimal, low-power computer that is meant to only interface with remote stuff. Right now, it’s job is to make a proper smart TV out of a dumb TV. (never buy smart TVs by the way, they’re awful for so many reasons!), and as such, it needs to be optimized for the absolute LEAST resources used at all costs, whether it be CPU, memory or storage. It only has one gig’ of ram and a really awful CPU, after all.

As you can see, I have four completely different use cases for each of my devices. My main machine needs to have optimized repositories, my laptop needs to Just Work, my server needs absolute stability and my Pi needs to not spontaneously combust from trying to display a JPEG.

I want you to think about what the mainstream answer to all of this would be. The typical answer would most likely be to install an optimized Arch-based distribution for my main machine (most likely CachyOS, I’ve used it before moving to Gentoo), Fedora on my laptop, Debian on my server and Alpine or Void on my Pi. Now, most people would read this and go “yep, sounds about right!”. Others would tell me to use Arch for everything (Arch on servers is horrendous for servers that don’t update from experience). Another crowd would call it a skill issue and tell me to use one distribution for all of this and deal with the consequences of having to customize it so much. Me, though? I HATE it.

What Gentoo has that others don’t.

Congratulations, you’ve made it to “the point”!

I don’t want to learn four different ways to do the same thing. I don’t want to learn four different package managers and the quirks of the official repositories. I don’t want to have to deal with awful, bloated cross-distribution solutions like appimages and snaps to use the right version of the right software, and I sure as hell don’t want to have to use something as annoying and useless as Nix (maybe I’ll write a blog post explaining why I have such a bad opinion of the very concept of Nix and Guix).

I want to use one distribution that does all of this well. One that can pin releases to a stable version for a package and update to the very bleeding edge for another package, at the same time. I want a distribution that allows me to completely disable Wayland for my laptop and completely disable X11 for my desktop. I want a distribution that will treat SystemD as a first-class citizen due to how great it is for servers and daily drivers but still treat another init system just the same for my little Pi that can’t run anything more than Pong. I want a distribution that will fully support SELinux and allow me to turn on whatever spin foil hat craziness I think my nobody self needs but also let me disable any and all security mitigations for the sake of squeezing out just one extra frame from my AAA slop game.

The truth is that no mainstream distribution can do this. Well, for a good reason! Packages must be built around one model system. Most people will need their Kernel with basic optimizations but also want security. And it would be completely unfeasible to host so many versions of different packages with so many tweaks and make sure that it all works together. I’ve heard that the Fedora and CachyOS team already struggle enough to handle x86_64 v1 and x86_64 v3 repositories, on top of Fedora dropping support for X altogether recently.

But guess what, this isn’t a dream. It’s EXACTLY what Gentoo Linux is useful for. You see, Gentoo isn’t your typical distribution. It doesn’t provide you with your packages ready to go, instead, it is based on sources. Gentoo gives you the raw source code and asks you to figure it out. The downside is that, obviously, this requires tinkering and time to compile (my 5th gen Ryzen 7 takes a whole hour to install Firefox!). But the upside is that you get to pick EXACTLY what you want or need for every single thing. Don’t want X11 or Wayland? It literally takes a whole two characters to completely disable X11, -X. That’s it. You type this in in the right place in a config file, and EVERY package that you build will no longer be made to support X11. Want to compile everything with AGGRESSIVE optimizations that maintainers BEG you not to enable? Just add -O3 -flto -fgraphite ! Do you hate SystemD for any reason other than absolutely requiring minimalism? Well, you’re most likely wrong, but you can do it!

Gentoo lets you do whatever you want because it lets you build your own local system. Every Gentoo system is different. My hyperstable hypersecure server and my bleeding edge desktop are technically both running Gentoo, and yet they’re so different. I only have to know one set of tools, the portage system, and it will go ahead and build my own system as I want it to!

Okay, sure, Nix/Guix users, you can have this win. [If you’re not one, no need to read this part]

Gentoo does not handle etc generation nor does it promise a true “pure” system. Those are two things that Portage doesn’t do. But at the same time, USE flags are just so damn good and well implemented that it really makes up for it IMO. I’d much rather configure my packages like I did since 2012 and only have to deal with what features I am enabling than learning an entire programming language to turn a simple one line /etc file change into like five gorillion lines of glorified JSON or Lisp. Sometimes I think about a world in which Portage works using a declarative system, then I realize that I have no use case for it, I can just install it all procedurally and edit /etc myself. Besides, each of my setups is so different that I won’t just copy paste an install to another… and if I wanted to, I can make my own Stage 3. Either way, Portage and Nix are two opposite sides of the same football field, so no hate <3

Another incredible upside is that I am currently in a journey to self-host everything I can. I’ve had to deal with constant internet outages during a period of my life where I had to work a lot for my engineering finals and also get work done. You don’t know what pain is until you have a quantum mechanics exam tomorrow and it’s been a week since you’ve been able to look up stuff online while your school’s library has been closed for renovations for a MONTH and oh gods what even is a wave function- Either way, I want everything locally and offline now. The fact that Gentoo is source-based means that for all of my systems, I only need to host a private mirror for Gentoo’s sources (called distfiles)! I don’t need a mirror of the Fedora + Debian + Arch + Alpine packages, I need a singular Gentoo repository holding everything I could ever need. For context, Debian alone needs a solid 2Tb of storage nowadays. Arch is closer to 1.2Tb. Alpine is more niche so 600Gb are enough. But Gentoo, for all of my systems, with every options available AND bootstrap CD images or tarballs is a “whopping” 800Gb! For more software than I could ever use! That is very reasonable for a home server to handle.

Me, personally, what convinced me was wanting to use old (better) versions of GTK, but I still wanted to have everything updated. I also needed an older version of XFCE but but but I also needed a GCC compiled with JIT for reasons that I honestly don’t recall. I wanted to use the CachyOS kernel but I also also also wanted PulseAudio completely nuked from my system. That’s when it clicked that no distribution was going to be able to satisfy these specific needs. And then Gentoo came around and gave me the option to do exactly this.

The Gentoo way to do things, and why I don’t recommend it to everyone.

Gentoo is… different. With great modularity comes great choices. The truth is that there are two ways to view all of this. You can think of it as being allowed to pick and chose everything you want, or as being forced to pick and chose everything that you need. For some, like me, Gentoo is a blessing, allowing you to make your own distribution at home, tailor-made to your needs and featuring an excellent package management system to keep it updated, combining the convenience of Arch and the DIY aspect of LFS. For others, this is a curse, being annoyed that you need to recompile your entire system and take eight hours waiting with an unusable system running at 100% CPU usage because you forgot to enable a feature that is taken for granted everywhere else.

The cost of all of this power is the time spent reading up on which features are needed to be manually enabled, which ones you can disable etc. On top of that, you need the time to learn how a Linux system works and why you’d even want any of the things you probably didn’t even notice were given out to you by typical binary-based distributions. And the elephant in the room, compile times. Oh my, compile times. I love my installs to death, but the fact that it took me less time to look up how to set up cross-compilation and automated syncing of cross-compiled packages between my server and my Pi than to just install GCC says it all. Installing a barebones, bootable Gentoo install takes as much effort and know-how as bootstrapping Arch (that is to say, it’s as easy as partitioning and using the “install the base system please” command). And yet, while installing Arch from scratch takes me about 10 minutes, installing Gentoo is closer to two hours. And if you want to recompile your entire bootstrap system so that it actually follows your options, get ready to double that at best.

Now, yes, there now are binary packages and you can set up your system to use them… But at this point, just use Arch. Or any other distribution, really. The truth is that as awesome as the idea of using Gentoo sounds, maintaining it is just not worth it unless you really, really have a use case for it. As a free software fanatic and someone who wants one tool to manage vastly different use cases, Gentoo is worth it. For most people? Well, one Clang + LLVM compilation failed at 90% for an out of memory error should be enough to turn them away from source-based distributions forever.

Don’t use Gentoo. If you want to, welcome!

I cannot emphasize enough how I absolutely do NOT recommend Gentoo to ANYONE that isn’t at least comfortable with how most Linux systems work on every level short of the actual source code. If you do not know how the boot process works from the kernel bootloading to Firefox being able to display itself on your screen, RUN. But if you know enough to think that you can learn on the fly, if you want to make and maintain your own Linux distribution without the pain of making your own package manager and maintaining your own repositories, if you think that the hour you just spent recompiling GCC and your kernel with LTO are worth the 2% FPS gains in games, if you think that all of this tinkering is worth booting into XFCE and seeing a total of 18 processes running using 90Mb of ram (That was the state of my Pi before I turned it into a media center!), and if you think that compiling every single bit of your system yourself is worth it in order to read every single line of code that you run, then all I can tell you is welcome to the gang. It’s hard to go back. And once you spend enough time updating, you kind of stop caring about how long it takes 🙂