about summary refs log blame commit diff stats
path: root/system/fileSystemLayouts/default.nix
blob: 408557142d736db38127a3680bbf13cdbfe9fa16 (plain) (tree)
1
2
3
4
5
6
7
8
           

         
       
     
      
                                        

                                                                                
                                            
    
    
                                      
                                                               
                            
                                                                                               
                                                      
                            
                            
                                                                    
                                                      
                        
                            
                                             


                                                                  
                           
                             
                                                                               
                                                           
                                   
                             
                                                    

                                                                    
    


                                 
                                   

























                                                                                                                                                 













                                                            
                                          
                                  





                                                                               
                                                                                                                                










                                                                               


                         
                                                    


                              
                                                              
        
                
                              
                             
                                                                       
        




                                                         

                             
        
      
                     





                                                           
                                                                  
      
    
# vim: ts=2
{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.system.fileSystemLayouts;
  defaultMountOptions = [
    "compress-force=zstd:15" # This saves disk space, at a performance cost
    "noatime" # should have some performance upsides, and I don't use it anyways
    "lazytime" # make time changes in memory
  ];
in {
  options.system.fileSystemLayouts = {
    enable = lib.mkEnableOption (lib.mdDoc "fileSystemLayout");
    mainDisk = lib.mkOption {
      type = lib.types.path;
      example = lib.literalExpression "/dev/disk/by-uuid/0442cb6d-f13a-4635-b487-fa76189774c5";
      description = lib.mdDoc "Path to the main disk";
    };
    efiDisk = lib.mkOption {
      type = lib.types.path;
      example = lib.literalExpression "/dev/disk/by-uuid/5143-6136";
      description = lib.mdDoc "Path to the main disk";
    };
    ssd = lib.mkOption {
      type = lib.types.bool;
      example = lib.literalExpression "true";
      default = false;
      description = lib.mdDoc "Enable ssd specific improvements?";
    };
    swap = {
      uuid = lib.mkOption {
        type = lib.types.str;
        example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89";
        description = lib.mdDoc "The uuid of the swapfile";
      };
      resumeOffset = lib.mkOption {
        type = lib.types.str;
        example = lib.literalExpression "134324224";
        description = lib.mdDoc "The resume offset of the swapfile";
      };
    };
  };

  config = lib.mkIf cfg.enable {
    systemd = {
      services = {
        hibernate-preparation = {
          # TODO check if they work
          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 = {
          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 = lib.mkIf cfg.ssd {
        wantedBy = lib.mkForce [];
        unitConfig = {
          Description = "Discard unused blocks on filesystems from /etc/fstab";
          Documentation = "man:fstrim(8)";
          ConditionVirtualization = "!container";
        };
        serviceConfig = {
          Type = "oneshot";
          ExecStart = "${pkgs.util-linux}/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";
        fsType = "tmpfs";
        options = ["defaults" "size=4G" "mode=755"];
      };
      "/nix" = {
        device = cfg.mainDisk;
        fsType = "btrfs";
        options = ["subvol=nix-store"] ++ defaultMountOptions;
      };
      "/srv" = {
        device = cfg.mainDisk;
        fsType = "btrfs";
        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";
      };
    };
    swapDevices = [];
    zramSwap = {
      enable = true;
      priority = 10; # needs to be higher than harware-swap
    };
    boot.kernelParams = [
      "resume=UUID=${cfg.swap.uuid}"
      "resume_offset=${cfg.swap.resumeOffset}"
      "zswap.enabled=0" # zswap and zram are not really compatible
    ];
  };
}