Nothing stood between "memory is tight" and "processes die at random": the kernel OOM killer only fires after an allocation has already failed, so a machine under pressure thrashes in reclaim until something breaks somewhere fatal — seen in practice as Hyprland taking SIGBUS mid-memcpy from a client shm pool that memory pressure was tearing down. Enable systemd-oomd, which keys on PSI stall time rather than free pages, and mark app.slice — and only app.slice — as its kill candidate. Hyprland runs in session.slice, so the compositor is structurally ineligible as a victim: oomd takes the app that caused the pressure and the session survives. Thresholds (50% stall over 20s, Fedora's desktop defaults) live in an oomd.conf.d drop-in; candidacy ships as a vendor drop-in under /usr/lib/systemd/user so existing users get it on package upgrade with no per-user seeding. New installs enable the daemon from enable-services.sh; a migration covers existing ones, restarting an already-running oomd so it doesn't keep stale thresholds until reboot. Deliberately not earlyoom: it triggers only when free RAM and free swap are both under threshold, so Omarchy's large, mostly-idle swapfiles keep it asleep through exactly this failure. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
21 lines
1.0 KiB
Bash
21 lines
1.0 KiB
Bash
# Enable services only. Installs are followed by reboot, so don't start/reload
|
|
# daemons mid-install. UFW and hardware-gated services stay in their own scripts.
|
|
systemctl enable cups.service
|
|
systemctl enable cups-browsed.service
|
|
systemctl enable avahi-daemon.service
|
|
systemctl enable linux-modules-cleanup.service
|
|
systemctl enable docker.socket
|
|
systemctl enable systemd-resolved.service
|
|
systemctl enable NetworkManager.service
|
|
# Don't let network-online.target (pulled in by cups-browsed) hold up
|
|
# graphical.target waiting for DHCP/Wi-Fi association. Nothing in the session
|
|
# needs to block on the network. Mirrors the systemd-networkd-wait-online mask
|
|
# in install/hardware/network.sh.
|
|
systemctl mask NetworkManager-wait-online.service
|
|
systemctl enable power-profiles-daemon.service
|
|
systemctl enable sddm.service
|
|
# Kill one runaway app scope instead of letting reclaim thrashing take the
|
|
# whole session down. [Install] pulls in systemd-oomd.socket via Also=, which
|
|
# is what the user manager reports app.slice candidacy over.
|
|
systemctl enable systemd-oomd.service
|