I spent some time answering a post on r/gentoo titled "Ideal size for my root partition while having a separate home partition?", in part just to analyze my own system a bit to reconfirm my priors.

Reposting it here for posterity.


My "daily driver" is really a 64GB VM with a single partition using btrfs; no subvolumes or anything. I run mate. I have a bunch of the usual stuff installed (emacs, chromium, firefox, gimp, audacity), but it's fairly light-weight.

Filesystem         Size  Used Avail Use% Mounted on
/dev/sda3           64G   53G   11G  83% /

Here's the top-level breakout:

[2025-12-08T08:46:46 root@water:/]# du --max-depth=1 --human-readable --exclude=./home/jsled/earth --exclude=./home/jsled/text --exclude=./proc | sort --human-numeric-sort --reverse | head -8
51G     .
23G     ./home
14G     ./usr
8.2G    ./var
5.7G    ./opt
39M     ./boot
30M     ./etc
13M     ./root

/opt deserves some unpacking:

[2025-12-08T08:53:55 root@water:/opt]# du --max-depth=1 --human-readable | sort --human-numeric-sort --reverse
5.7G    .
685M    ./zoom
560M    ./rust-bin-1.89.0
550M    ./rust-bin-1.88.0
549M    ./rust-bin-1.87.0
531M    ./rust-bin-1.86.0
502M    ./rust-bin-1.84.1
495M    ./rust-bin-1.85.1
494M    ./rust-bin-1.83.0
438M    ./Signal
374M    ./google
301M    ./Bitwarden
286M    ./firefox

I'm not sure why /home is so large, since "everything" of interest are mounts against my NAS (/home/jsled/earth, /home/jsled/text) … oh, yeah, it's almost all cached data:

[2025-12-08T08:48:50 root@water:~]# du --max-depth=1 --human-readable --exclude=./earth --exclude=./text | sort --human-numeric-sort --reverse  | head -10
23G     .
8.4G    ./.mozilla
5.2G    ./.local
3.9G    ./.cache
2.1G    ./phoenix
2.0G    ./.config
362M    ./.npm
231M    ./zoom
169M    ./.emacs.d
159M    ./.zoom

And an aborted local Steam install…

[2025-12-08T08:49:05 root@water:~]# cd .local
[2025-12-08T08:49:14 root@water:~/.local]# du --max-depth=1 --human-readable | sort --human-numeric-sort --reverse  | head -10
5.2G    ./share
5.2G    .
12K     ./state
[2025-12-08T08:51:23 root@water:~/.local/share]# du --max-depth=1 --human-readable | sort --human-numeric-sort --reverse  | head -10
5.2G    .
4.8G    ./Steam

But, again, that's /home, which you'll put on a separate subvol/partition anyways, so not your concern, here.

The key things for / are:

14G     ./usr
8.2G    ./var
5.7G    ./opt

These sum to ~27GB. A 32GB / will likely be regularly tight; you'll need to make sure log rotation is in place / journald is configured to be bounded (it is by default), and maybe wipe /var/cache/distfiles if you run out of space. Keep an eye on /var/log/portage/, too, if you've enabled PORTAGE_ELOG_SYSTEM="save"; I run sudo /bin/bash -c 'cd /var/log/portage; rm $(find -mtime +90)' after updates to keep it bounded.

I'd suggest 48 or 64GB.

I'd echo the others: don't partition unless you have a compelling reason to do so, use a modern filesystem (btrfs) that supports logical volume management and subvolumes. Copy-on-write filesystems are great.

Portage is configured to compile out of tmpfs / /dev/shm:

[2025-12-08T09:08:56 jsled@water:~]$ grep "TMPDIR" /etc/portage/make.conf
PORTAGE_TMPDIR=/dev/shm

Which works for 99% of packages well, but you're going to want some non-tmpfs space for compiling large packages…

[2025-12-08T08:56:04 root@water:~]# cat /etc/portage/package.env
dev-lang/rust           notmpfs.conf
dev-lang/spidermonkey   notmpfs.conf
sys-devel/gcc           notmpfs.conf
media-libs/opus         opus.conf
[2025-12-08T08:56:09 root@water:~]# cat $(find /etc/portage/ -iname notmpfs.conf)
PORTAGE_TMPDIR="/var/tmp/notmpfs"

But you could easily put that directory outside of /, too.

Obviously if your system is regularly memory-constrained, that approach won't work for you. Even still, /tons/ of packages need just a few(-hundred) MB to unpack and compile, so the "compile in tmpfs" approach still works well.


Published

Category

Posts

Tags

Contact