I’ve been running Gentoo as my desktop’s main operating system for about a year now, so I consider myself something of an expert. At least, I have enough experience to have an informed opinion on the distro, and it’s pretty mixed. I’ll start by saying I moved from NixOS to Gentoo, pretty much swinging from two ends of the spectrum when it comes to Linux distribution management strategies. On one end you have your entire setup from installed packages to those packages’ configurations defined in a single (or a couple of) files, and on the other you have what is ostensibly Linux from Scratch with less tedium.
And at the time I picked Gentoo as my next distro, I was hungering for digging into Linux, tinkering and tweaking to my heart’s content to get things running the way I wanted. …
I’ve been running Gentoo as my desktop’s main operating system for about a year now, so I consider myself something of an expert. At least, I have enough experience to have an informed opinion on the distro, and it’s pretty mixed. I’ll start by saying I moved from NixOS to Gentoo, pretty much swinging from two ends of the spectrum when it comes to Linux distribution management strategies. On one end you have your entire setup from installed packages to those packages’ configurations defined in a single (or a couple of) files, and on the other you have what is ostensibly Linux from Scratch with less tedium.
And at the time I picked Gentoo as my next distro, I was hungering for digging into Linux, tinkering and tweaking to my heart’s content to get things running the way I wanted. To some degree, I’ve achieved that goal, but I’ve also come to face some unfortunate truths about my abilities, time, and developer tooling as a whole. I absolutely love the freedom Linux and Linux distributions give to explore computing. I literally would not be on the path that I’m on, for better or worse, without it.
Gentoo is an attractive offering in that regard - while packages have been pre-written and roughly configured with sensible defaults, the install process (usually) involves pulling down the source code for the package you want to build and using your own machine to compile it, opening up opportunities for building exactly the features you want, or optimising for your specific CPU architecture, or applying patches on top... really whatever you want. To help with that, Gentoo offers “USE” flags, which come from package maintainers to aid in the tweaking of how a package is built. I won’t get too in the weeds with this, but it’s been very nifty for exploring what a particular package offers in terms of features, whether excluding or including, and having a bit more declaration within the package management. This is also a pain point of mine, but we’ll get back to that.
Gentoo being “build-it-yourself” has another big benefit: it’s fairly trivial to configure, build, and use your own kernel configuration. In general, kernels for distributions are built in the most generic way possible so they work for 99.99% of users. This does, however, mean you could be losing out on some (small) performance gains or storage space. It’s one of those “optimisations you’ll know is there, but doesn’t make that much of a difference to the average person,” but it’s nice. It also means you can experiment with things like Unified Kernel Images, which allows you to boot directly to your kernel from UEFI, removing the need for a bootloader like GRUB or rEFInd. This is especially helpful when you’re a bit crazy and decide to use an “out-of-tree” (not included in the Linux kernel) filesystem as your root. In this case, ZFS - I can build it into the UKI, so I don’t have to fumble with ZFSBootMenu (which fails to boot with my UEFI - no clue why) or GRUB’s ZFS version limitation.
However, it does mean that upgrading the kernel can be a bit tedious and error-prone, especially if jumping between major versions, and this is where I come to something I’ve been alluding to: Gentoo is do-it-yourself. And that means, among other things, upgrading packages can be a pain in the ass if a breaking change has to happen (e.g., upgrading Python versions) or a large package has to rebuild from scratch (like Chromium). Large package rebuilds aren’t much of an issue, but troubleshooting why a package is blocking an upgrade can be. emerge
will usually tell you what you need to fix, but it’s entirely possible that a package is simply incompatible with your version of GCC or Clang, or some other breakage that a package maintainer can’t account for.
If you stick to common or default USE flags, you can often grab a precompiled binary from a Gentoo binary cache host (a relatively recent addition to the ecosystem), but in my case, that doesn’t happen as often as is useful. And as much as I love tinkering and playing with options, I don’t love doing it at unexpected moments. I know that with more experience these big bumps in the road can be smoothed out, but when trying to deal with conflicts or broken packages I end up really regretting opting for Gentoo.
These bumps in the road also make me feel like my install is built on a foundation of sand. I’ve had strange bugs and crashes that I can’t help but feel would be absent on a more opinionated or slower-moving distribution. Granted, some of this may be on me opting for more bleeding-edge “testing” packages (~amd64
), and I fully accept that bleeding edge is quite literal in some cases. But it’s also made it feel less like I’m using a Linux distribution with a shared community and more like I’m on an island of my own making. If something goes wrong, I can usually reach out on the IRC or the issue tracker, but I never quite know for sure if it’s something wrong with the software, the way it was packaged, my particular build, or some combination being funky. And that uncertainty can leave me hesitant to reach out and more frustrated as I try to track down the root cause. And even more frustrating when it does turn out to be an issue with my snowflake install.
I have come very close to giving up on Gentoo altogether and swapping to something else. Things like Universal Blue-based Aurora catch my eye, but might leave less room for tinkering than even NixOS, and is very much a polar opposite to Gentoo. Debian has always been my distribution of choice on the server side (even before leaving NixOS behind), and I have been seriously considering it as a contender as well (using the unstable or testing branches). It’s possible I’ll be making this swap in the near future after tinkering with options in virtual machines, but the effort I expect it to take to make a clean swap (which would include dropping ZFS as my root filesystem, more on that later) makes me hesitate.
Addendum: This is now less of an issue as we now have a spare drive matching my current drive’s capacity, so I could clone the disk then copy everything over. So that’s one less roadblock.
Switching tracks a bit, let’s talk about ZFS as a root filesystem. It hasn’t really been an issue, and in fact has been really helpful in some areas, but it’s an experiment that started when I picked up Gentoo and is worth mentioning. I’m not using any of the pooling features, as I only have one NVMe drive for Linux, but options like compression (or lack thereof) and easily creating and resizing volumes on the fly is much more comfortable than resizing disk partitions (I’m aware the Logical Volume Manager project would probably help here but I’ve never seriously dug into it). It is a bit of a hassle using an out-of-tree (meaning not part of the Linux kernel project) filesystem, as setting up a bootloader takes more effort than usual. And not having multiple disks in the pool does mean I’m leaving some of the perks of ZFS that would make it more worthwhile on the table. I can’t stress how nice the compression is though - my email and main OS install pools are compressed to about half their size.
NAME COMPRESS RATIO USED LUSED DEDUP ATIME
tank zstd 1.78x 665G 1.13T off on
tank/home zstd 1.69x 440G 724G off on
tank/mail zstd 2.19x 916M 1.94G off on
tank/os zstd 2.06x 201G 403G off on
tank/os/gentoo zstd 2.06x 201G 403G off on
tank/vms zle 1.07x 22.6G 24.2G off off
I consider that pretty impressive, anyway. And having already gotten fairly familiar with ZFS on my NAS (first through TrueNAS, and then more directly) I’m pretty good at managing it. Snapshotting the OS install pool before a large upgrade is also a nice trick to have, although in practice I haven’t needed to use a past snapshot.
All in all, my time with Gentoo thus far has had its ups and downs. It’s taught me even more about Linux, which is usually a positive given my career choice, but it’s also left me feeling pretty frustrated at times. I certainly wouldn’t recommend anyone use it as a daily driver unless they’re already deeply familiar with Linux and, more importantly, actually building software. Arch Linux is in many ways the successor to Gentoo, but going from Arch to Gentoo still has a pretty steep learning curve. It would be a bit like running Linux from Scratch as a daily desktop OS, but with a bit less tedium of figuring out what software you needed to build other software.
Have your own experiences you want to share, either with Gentoo or the other distros I mentioned? Feel free to reach out on the fediverse!