by M95D | 2026-01-11 17:52:23+00:00
TLDR: Installation is a pain, initial configuration is a pain and there's always something more to tweak, update is a lesser pain, but still a pain.

Installation is done by booting a liveCD, manually partitioning your storage, unpacking a Gentoo STAGE3 archive, chrooting in it, doing basic configuration such as network, timezone, portage (package manager) base profile and servers, etc., compiling and installing a kernel and then rebooting into the new system.

Then you get to play with /etc/portage/make.conf which is the root configuration of the package manager. You get to set CPU instruction sets (CPU_FLAGS), gcc CFLAGS flags, MAKE flags, video card targets, acceptable package licenses, global USE flags (those are simplified ./configure arguments that usually apply to several packages), which Apache modules get built, which qemu targets get built, etc. These are all env vars that portage (the package manager) uses to build packages for your system.

The more you use Gentoo, the more features of make.conf you discover. Never ending fun.

Then, you start installing packages and updates (same procedure):

1) You start the update by reviewing USE flags for each added/updated package - several screens of dense text.

For example, PHP has these USE flags: https://packages.gentoo.org/packages/dev-lang/php - mouse hover to see what they do. You get to play with them in /etc/portage/package.use and there's no end to tweaking them.

If you have any form of OCD, stay away from Gentoo or this will be your poison forever!

2) Then the compilation begins and that takes hours or days depending on what you install and uses a lot of CPU and either storage I/O or memory (if you have lots of memory, you can compile in tmpfs a lot faster).

I'm not sure this is OK to compile the updates on a live server, especially during busy hours, but Gentoo has alternatives, including binary packages (recently added), building packages remotely on another system (distcc), even on a different arch (crossdev). You could run an ARM server and build packages for it on a x86 workstation by temporarily moving the root disk there (or SD card for a Raspberry). I didn't use "steve", so I can't tell you what wonderful thing that tool can do, yet.

3) Depending on architecture, some less used packages may fail to compile. You get to manually debug that and submit bug reports. You can also add patches to /etc/portage/patches/<package> that will automatically be applied when the package is built, and that includes the kernel.

I recommend you to run emerge with --keep-going to have the package manager continue after an error with the remaining packages.

4) When each package is done compiling, it's installed automatically. There are no automatic reboots or anything. The files are replaced live, both executables and libraries. Running services continue to use old files from memory until you restart them or reboot manually - they will appear red/yellow in htop until you do.

There were a few times, very very few, when I had crashes in new packages that were succesfuly built. It only happened on armv7, which is a practically abandoned platform everywhere. In those cases you can revert to the old ones and mask the bugged version to prevent it from being updated to next time.

5) Last step is to review the config changes. dispatch-conf will present a diff of all proposed changes to .ini and .cfg files for all updated packages. You get to review, accept, reject the changes or manually edit the files.

That's all. Simple. :)