{pkgs, config, ...}: let ###### interface options = { swapDevices = pkgs.lib.mkOption { default = []; example = [ { device = "/dev/hda7"; } { device = "/var/swapfile"; } { label = "bigswap"; } ]; description = " The swap devices and swap files. These must have been initialised using mkswap. Each element should be an attribute set specifying either the path of the swap device or file (device) or the label of the swap device (label, see mkswap -L). Using a label is recommended. "; }; }; ###### implementation inherit (pkgs) utillinux lib; swapDevices = config.swapDevices; devicesByPath = map (x: x.device) (lib.filter (x: x ? device) swapDevices); devicesByLabel = map (x: x.label) (lib.filter (x: x ? label) swapDevices); in { require = [options]; services.extraJobs = [{ name = "swap"; job = '' start on startup start on new-devices script for device in ${toString devicesByPath}; do ${utillinux}/sbin/swapon "$device" || true done for label in ${toString devicesByLabel}; do ${utillinux}/sbin/swapon -L "$label" || true done # Remove swap devices not listed in swapDevices. # !!! disabled because it doesn't work with labels #for used in $(cat /proc/swaps | grep '^/' | sed 's/ .*//'); do # found= # for device in $ {toString swapDevices}; do # if test "$used" = "$device"; then found=1; fi # done # if test -z "$found"; then # ${utillinux}/sbin/swapoff "$used" || true # fi #done end script ''; }]; }