about summary refs log tree commit diff stats
path: root/system/fileSystemLayouts/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'system/fileSystemLayouts/default.nix')
-rw-r--r--system/fileSystemLayouts/default.nix85
1 files changed, 78 insertions, 7 deletions
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}"
+    ];
   };
 }