Size zram the way Fedora does

zram-size = min(ram, 8192) is Fedora's default since F34, where
zram-fraction=1.0 with max-zram-size=8192 has run on desktops for five
years. The previous min(ram / 2, 8192) halved that on every machine
below 16G with nothing behind the fraction; at 16G and above the two
already agree.

A changed size only reaches a running device on the next boot, so the
migration resizes an empty device now and asks for a reboot otherwise.
It asks the generator what the config evaluates to rather than
repeating the expression here, and does neither when the device already
matches.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
David Heinemeier Hansson
2026-07-26 12:58:02 -07:00
co-authored by Claude Opus 5
parent f01acc1de9
commit 187c2ecf7f
3 changed files with 159 additions and 5 deletions
+38
View File
@@ -0,0 +1,38 @@
echo "Resize zram to match the shipped config"
# 90-omarchy.conf changed the device size. The migration that first applied the
# zram tuning is one-shot, so machines that already ran it have the new file on
# disk and the old device still running; nothing would pick the size up until
# something else rebooted them.
zram_disksize=${OMARCHY_ZRAM_DISKSIZE:-/sys/block/zram0/disksize}
swaps=${OMARCHY_SWAPS:-/proc/swaps}
# The size is an expression, and the generator is the only thing that evaluates
# it. Ask it what the shipped config comes to rather than repeating the
# arithmetic here, where the two would drift apart on the next tuning change.
units=$(mktemp -d)
trap 'rm -rf "$units"' EXIT
desired_mb=$(/usr/lib/systemd/system-generators/zram-generator "$units" 2>&1 |
grep -oP '/dev/zram0 with \K[0-9]+') || true
actual_bytes=$(cat "$zram_disksize" 2>/dev/null) || actual_bytes=0
# A device already at the right size needs neither a restart nor a reboot,
# whether an earlier boot picked the config up or another user got here first.
if [[ -n $desired_mb && $actual_bytes == $((desired_mb * 1024 * 1024)) ]]; then
exit 0
fi
if sudo systemctl daemon-reload; then
# Resizing swaps the device off first, which faults every stored page back
# into memory. That's only cheap while it's empty, so a device under
# pressure keeps its old size until the next boot.
zram_used=$(awk '$1 == "/dev/zram0" {print $4}' "$swaps")
if [[ ${zram_used:-0} == 0 ]] && sudo systemctl restart dev-zram0.swap; then
exit 0
fi
fi
omarchy-state set reboot-required