From 1b5eb56269683dc1eb033e3acae616a013aaca9b Mon Sep 17 00:00:00 2001 From: ene Date: Mon, 20 Mar 2023 18:42:26 +0100 Subject: Feat(system): Enable swap & zram swap & hibernate --- system/fileSystemLayouts/default.nix | 85 +++++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 7 deletions(-) (limited to 'system/fileSystemLayouts') diff --git a/system/fileSystemLayouts/default.nix b/system/fileSystemLayouts/default.nix index 215f01d0..f6d374d7 100644 --- a/system/fileSystemLayouts/default.nix +++ b/system/fileSystemLayouts/default.nix @@ -1,3 +1,4 @@ +# vim: ts=2 { config, lib, @@ -23,9 +24,65 @@ in { example = literalExpression "/dev/disk/by-uuid/5143-6136"; description = lib.mdDoc "Path to the main disk"; }; + ssd = mkOption { + type = lib.types.bool; + example = literalExpression "true"; + default = false; + description = lib.mdDoc "Enable ssd specific improvements?"; + }; + swap = { + uuid = mkOption { + type = lib.types.str; + example = literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; + description = lib.mdDoc "The uuid of the swapfile"; + }; + resumeOffset = mkOption { + type = lib.types.int; + example = literalExpression "134324224"; + description = lib.mdDoc "The resume offset of the swapfile"; + }; + }; }; config = mkIf cfg.enable { + systemd = mkIf cfg.ssd { + timers.fstrim = { + wantedBy = ["timers.target"]; + wants = ["fstrim.service"]; + unitConfig = { + Description = "Discard unused blocks once a week"; + Documentation = "man:fstrim"; + ConditionVirtualization = "!container"; + ConditionPathExists = "!/etc/initrd-release"; + }; + timerConfig = { + OnCalendar = "weekly"; + AccuracySec = "1h"; + Persistent = "true"; + RandomizedDelaySec = "6000"; + }; + }; + services.fstrim = { + unitConfig = { + Description = "Discard unused blocks on filesystems from /etc/fstab"; + Documentation = "man:fstrim(8)"; + ConditionVirtualization = "!container"; + }; + serviceConfig = { + Type = "oneshot"; + ExecStart = "/usr/bin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported"; + PrivateDevices = "no"; + PrivateNetwork = "yes"; + PrivateUsers = "no"; + ProtectKernelTunables = "yes"; + ProtectKernelModules = "yes"; + ProtectControlGroups = "yes"; + MemoryDenyWriteExecute = "yes"; + SystemCallFilter = "@default @file-system @basic-io @system-service"; + }; + }; + }; + fileSystems = { "/" = { device = "none"; @@ -43,17 +100,31 @@ in { neededForBoot = true; options = ["subvol=persistent-storage"] ++ defaultMountOptions; }; + "/swap" = { + device = cfg.mainDisk; + fsType = "btrfs"; + neededForBoot = true; + options = ["subvol=swap"] ++ defaultMountOptions; + }; "/boot" = { device = cfg.efiDisk; fsType = "vfat"; }; - #"${config.users.users.soispha.home}" = { # TODO this causes infinite recursion - # "/home" = { - # device = "none"; - # fsType = "tmpfs"; # Can be stored on normal drive or on tmpfs as well - # options = ["defaults" "size=4G" "mode=755"]; - # }; }; - swapDevices = []; + 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 + } + ]; + zramSwap = { + enable = true; + priority = 10; # needs to be higher than harware-swap + }; + boot.kernelParams = [ + "resume=UUID=${cfg.swap.uuid}" + "resume_offset=${cfg.swap.resumeOffset}" + ]; }; } -- cgit 1.4.1