From 37056f6b9c6e268ad0febf414ee6f10048534836 Mon Sep 17 00:00:00 2001 From: ene Date: Tue, 4 Apr 2023 08:07:54 +0200 Subject: Fix(system/fsl): Use swapfile only for hibernate --- system/fileSystemLayouts/default.nix | 73 ++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 25 deletions(-) (limited to 'system') diff --git a/system/fileSystemLayouts/default.nix b/system/fileSystemLayouts/default.nix index 3edf0a79..1676d993 100644 --- a/system/fileSystemLayouts/default.nix +++ b/system/fileSystemLayouts/default.nix @@ -2,9 +2,9 @@ { config, lib, + pkgs, ... -}: -with lib; let +}: let cfg = config.system.fileSystemLayouts; defaultMountOptions = [ "compress-force=zstd:15" # This saves disk space, at a performance cost @@ -13,40 +13,68 @@ with lib; let ]; in { options.system.fileSystemLayouts = { - enable = mkEnableOption (mdDoc "fileSystemLayout"); - mainDisk = mkOption { + enable = lib.mkEnableOption (lib.mdDoc "fileSystemLayout"); + mainDisk = lib.mkOption { type = lib.types.path; - example = literalExpression "/dev/disk/by-uuid/0442cb6d-f13a-4635-b487-fa76189774c5"; + example = lib.literalExpression "/dev/disk/by-uuid/0442cb6d-f13a-4635-b487-fa76189774c5"; description = lib.mdDoc "Path to the main disk"; }; - efiDisk = mkOption { + efiDisk = lib.mkOption { type = lib.types.path; - example = literalExpression "/dev/disk/by-uuid/5143-6136"; + example = lib.literalExpression "/dev/disk/by-uuid/5143-6136"; description = lib.mdDoc "Path to the main disk"; }; - ssd = mkOption { + ssd = lib.mkOption { type = lib.types.bool; - example = literalExpression "true"; + example = lib.literalExpression "true"; default = false; description = lib.mdDoc "Enable ssd specific improvements?"; }; swap = { - uuid = mkOption { + uuid = lib.mkOption { type = lib.types.str; - example = literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; + example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; description = lib.mdDoc "The uuid of the swapfile"; }; - resumeOffset = mkOption { + resumeOffset = lib.mkOption { type = lib.types.str; - example = literalExpression "134324224"; + example = lib.literalExpression "134324224"; description = lib.mdDoc "The resume offset of the swapfile"; }; }; }; - config = mkIf cfg.enable { - systemd = mkIf cfg.ssd { - timers.fstrim = { + config = lib.mkIf cfg.enable { + systemd = { + services = { + hibernate-preparation = { + wantedBy = ["systemd-hibernate.service"]; + unitConfig = { + Description = "Enable swap file and disable zram before hibernate"; + Before = "systemd-hibernate.service"; + }; + serviceConfig = { + Type = "oneshot"; + User = "root"; + ExecStart = "${pkgs.dash}/bin/dash -c \"${pkgs.util-linux}/bin/swapon /swap/swapfile && ${pkgs.util-linux}/bin/swapoff /dev/zram0\""; + }; + }; + hibernate-resume = { + wantedBy = ["hibernate.target"]; + unitConfig = { + Description = "Disable swap after resuming from hibernation"; + After = "hibernate.target"; + }; + serviceConfig = { + Type = "oneshot"; + User = "root"; + ExecStart = "${pkgs.util-linux}/bin/swapoff /swap/swapfile"; + }; + }; + systemd-hibernate.serviceConfig.Environment = "SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1"; + systemd-logind.serviceConfig.Environment = "SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1"; + }; + timers.fstrim = lib.mkIf cfg.ssd { wantedBy = ["timers.target"]; wants = ["fstrim.service"]; unitConfig = { @@ -62,7 +90,7 @@ in { RandomizedDelaySec = "6000"; }; }; - services.fstrim = { + services.fstrim = lib.mkIf cfg.ssd { unitConfig = { Description = "Discard unused blocks on filesystems from /etc/fstab"; Documentation = "man:fstrim(8)"; @@ -70,7 +98,7 @@ in { }; serviceConfig = { Type = "oneshot"; - ExecStart = "/usr/bin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported"; + ExecStart = "${pkgs.util-linux}/bin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported"; PrivateDevices = "no"; PrivateNetwork = "yes"; PrivateUsers = "no"; @@ -111,13 +139,7 @@ in { fsType = "vfat"; }; }; - swapDevices = [ - { - device = "/swap/swapfile"; - discardPolicy = "both"; # TODO this is the default in swapon, so it should be fine? - priority = 1; # should not be used, aside of hibernate - } - ]; + swapDevices = []; zramSwap = { enable = true; priority = 10; # needs to be higher than harware-swap @@ -125,6 +147,7 @@ in { boot.kernelParams = [ "resume=UUID=${cfg.swap.uuid}" "resume_offset=${cfg.swap.resumeOffset}" + "zswap.enabled=0" # zswap and zram are not really compatible ]; }; } -- cgit 1.4.1