diff options
| author | Alejandro Soto <alejandro@34project.org> | 2022-08-08 03:53:33 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2022-08-08 03:55:09 -0600 |
| commit | 829102167e61ece218c33b83141b81b78cdf6087 (patch) | |
| tree | c904377da29368698be9edfbf5f3d23332533648 /sys | |
| parent | f86be644309028046732c254fb5d0e80bc58dfff (diff) | |
sys/fs: move fs config out of sys/default.nix
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/default.nix | 123 | ||||
| -rw-r--r-- | sys/fs/btrfs.nix | 111 | ||||
| -rw-r--r-- | sys/fs/default.nix | 21 | ||||
| -rw-r--r-- | sys/fs/layout.nix | 77 | ||||
| -rw-r--r-- | sys/options.nix | 80 |
5 files changed, 215 insertions, 197 deletions
diff --git a/sys/default.nix b/sys/default.nix index b3cb34b..1a35d92 100644 --- a/sys/default.nix +++ b/sys/default.nix @@ -3,7 +3,11 @@ with lib; let cfg = config.local; in { - imports = [ "${modulesPath}/installer/scan/not-detected.nix" ./options.nix ]; + imports = [ + "${modulesPath}/installer/scan/not-detected.nix" + ./fs + ./options.nix + ]; config = { nixpkgs.overlays = [ self.overlay ]; @@ -24,9 +28,6 @@ in { }; boot = { - # !!! - tmpOnTmpfs = true; - loader = (if cfg.loader == "grub" then { grub = { enable = true; @@ -101,54 +102,6 @@ in { intel = mkIf (cfg.cpuVendor == "intel") ucode; }; - fileSystems = let - inherit (cfg) fs; - btrfs = { device, subvol, ssd, ... }: { - inherit device; - fsType = "btrfs"; - options = [ "noatime" "compress=zstd" "subvol=${subvol}" ] ++ optional ssd "ssd"; - }; - in mapAttrs (_: btrfs) cfg.fs.btrfs // { - "/boot" = { - inherit (cfg.fs.boot) device; - fsType = "vfat"; - options = [ "noatime" "umask=027" ]; - }; - }; - - local.fs.btrfs = let - sysHddBtrfs = layout: { - "/" = { - inherit (layout.sys) device ssd; - subvol = layout.sys.root; - }; - - "/toplevel" = { - inherit (layout.sys) device ssd; - subvol = layout.sys.toplevel; - }; - - "/hdd" = { - inherit (layout.hdd) device; - subvol = "/"; - ssd = false; - }; - - "/home" = { - inherit (layout.hdd) device; - subvol = layout.hdd.home; - ssd = false; - snapper = "home"; - }; - }; - - inherit (cfg.fs) layout; - - layoutMaps = [ sysHddBtrfs ]; - layoutOpts = [ layout.sysHddBtrfs ]; - valid = filter ({ snd, ... }: snd != null) (zipLists layoutMaps layoutOpts); - in optionalAttrs (valid != []) ((head valid).fst (head valid).snd); - time.timeZone = "America/Costa_Rica"; networking = { @@ -175,9 +128,7 @@ in { displayManager.startx.enable = true; }; - environment.systemPackages = [ - pkgs.local.btclone pkgs.dhcpcd pkgs.git - ]; + environment.systemPackages = [ pkgs.dhcpcd pkgs.git ]; services.udev.packages = [ pkgs.android-udev-rules @@ -220,68 +171,6 @@ in { ]; }; - local.snapperSubvols = let - snapperEntry = path: opts: { name = opts.snapper; value = path; }; - validEntry = _: opts: opts.snapper != null; - in mapAttrs' snapperEntry (filterAttrs validEntry cfg.fs.btrfs); - - services.snapper.configs = let - snapperConfig = _: subvolume: { - inherit subvolume; - - extraConfig = '' - # btrfs qgroup for space aware cleanup algorithms - QGROUP="" - - # fraction of the filesystems space the snapshots may use - SPACE_LIMIT="0.5" - - # fraction of the filesystems space that should be free - FREE_LIMIT="0.2" - - # users and groups allowed to work with config - ALLOW_USERS="" - ALLOW_GROUPS="" - - # sync users and groups from ALLOW_USERS and ALLOW_GROUPS to .snapshots - # directory - SYNC_ACL="no" - - # start comparing pre- and post-snapshot in background after creating - # post-snapshot - BACKGROUND_COMPARISON="yes" - - # run daily number cleanup - NUMBER_CLEANUP="yes" - - # limit for number cleanup - NUMBER_MIN_AGE="1800" - NUMBER_LIMIT="100" - NUMBER_LIMIT_IMPORTANT="10" - - # create hourly snapshots - TIMELINE_CREATE="yes" - - # cleanup hourly snapshots after some time - TIMELINE_CLEANUP="yes" - - # limits for timeline cleanup - TIMELINE_MIN_AGE="1800" - TIMELINE_LIMIT_HOURLY="24" - TIMELINE_LIMIT_DAILY="7" - TIMELINE_LIMIT_WEEKLY="4" - TIMELINE_LIMIT_MONTHLY="12" - TIMELINE_LIMIT_YEARLY="10" - - # cleanup empty pre-post-pairs - EMPTY_PRE_POST_CLEANUP="yes" - - # limits for empty pre-post-pair cleanup - EMPTY_PRE_POST_MIN_AGE="1800" - ''; - }; - in mapAttrs snapperConfig cfg.snapperSubvols; - networking.firewall.allowedTCPPorts = [ 2234 ]; programs = { diff --git a/sys/fs/btrfs.nix b/sys/fs/btrfs.nix new file mode 100644 index 0000000..87c9fca --- /dev/null +++ b/sys/fs/btrfs.nix @@ -0,0 +1,111 @@ +{ lib, config, pkgs, ... }: +with lib; let + cfg = config.local; +in { + options.local = with lib.types; { + snapperSubvols = mkOption { + type = attrsOf str; + default = {}; + }; + + fs.btrfs = mkOption { + default = []; + + type = attrsOf (submodule { + options = { + device = mkOption { + type = str; + }; + + subvol = mkOption { + type = str; + }; + + ssd = mkOption { + type = bool; + }; + + snapper = mkOption { + type = nullOr str; + default = null; + }; + }; + }); + }; + }; + + config = { + environment.systemPackages = optional (cfg.snapperSubvols != {}) pkgs.local.btclone; + + fileSystems = let + inherit (cfg) fs; + btrfs = { device, subvol, ssd, ... }: { + inherit device; + fsType = "btrfs"; + options = [ "noatime" "compress=zstd" "subvol=${subvol}" ] ++ optional ssd "ssd"; + }; + in mapAttrs (_: btrfs) cfg.fs.btrfs; + + local.snapperSubvols = let + snapperEntry = path: opts: { name = opts.snapper; value = path; }; + validEntry = _: opts: opts.snapper != null; + in mapAttrs' snapperEntry (filterAttrs validEntry cfg.fs.btrfs); + + services.snapper.configs = let + snapperConfig = _: subvolume: { + inherit subvolume; + + extraConfig = '' + # btrfs qgroup for space aware cleanup algorithms + QGROUP="" + + # fraction of the filesystems space the snapshots may use + SPACE_LIMIT="0.5" + + # fraction of the filesystems space that should be free + FREE_LIMIT="0.2" + + # users and groups allowed to work with config + ALLOW_USERS="" + ALLOW_GROUPS="" + + # sync users and groups from ALLOW_USERS and ALLOW_GROUPS to .snapshots + # directory + SYNC_ACL="no" + + # start comparing pre- and post-snapshot in background after creating + # post-snapshot + BACKGROUND_COMPARISON="yes" + + # run daily number cleanup + NUMBER_CLEANUP="yes" + + # limit for number cleanup + NUMBER_MIN_AGE="1800" + NUMBER_LIMIT="100" + NUMBER_LIMIT_IMPORTANT="10" + + # create hourly snapshots + TIMELINE_CREATE="yes" + + # cleanup hourly snapshots after some time + TIMELINE_CLEANUP="yes" + + # limits for timeline cleanup + TIMELINE_MIN_AGE="1800" + TIMELINE_LIMIT_HOURLY="24" + TIMELINE_LIMIT_DAILY="7" + TIMELINE_LIMIT_WEEKLY="4" + TIMELINE_LIMIT_MONTHLY="12" + TIMELINE_LIMIT_YEARLY="10" + + # cleanup empty pre-post-pairs + EMPTY_PRE_POST_CLEANUP="yes" + + # limits for empty pre-post-pair cleanup + EMPTY_PRE_POST_MIN_AGE="1800" + ''; + }; + in mapAttrs snapperConfig cfg.snapperSubvols; + }; +} diff --git a/sys/fs/default.nix b/sys/fs/default.nix new file mode 100644 index 0000000..9f2f646 --- /dev/null +++ b/sys/fs/default.nix @@ -0,0 +1,21 @@ +{ lib, config, ... }: +with lib; let + cfg = config.local; +in { + imports = [ ./btrfs.nix ./layout.nix ]; + + options.local.fs.boot.device = with lib.types; mkOption { + type = str; + }; + + config = { + # !!! + boot.tmpOnTmpfs = true; + + fileSystems."/boot" = { + inherit (cfg.fs.boot) device; + fsType = "vfat"; + options = [ "noatime" "umask=027" ]; + }; + }; +} diff --git a/sys/fs/layout.nix b/sys/fs/layout.nix new file mode 100644 index 0000000..999492d --- /dev/null +++ b/sys/fs/layout.nix @@ -0,0 +1,77 @@ +{ lib, config, ... }: +with lib; let + cfg = config.local; +in { + options.local.fs.layout = with lib.types; { + sysHddBtrfs = mkOption { + default = null; + + type = nullOr (submodule { + options = { + sys = { + device = mkOption { + type = str; + }; + + ssd = mkOption { + type = bool; + }; + + root = mkOption { + type = str; + }; + + toplevel = mkOption { + type = str; + }; + }; + + hdd = { + device = mkOption { + type = str; + }; + + home = mkOption { + type = str; + }; + }; + }; + }); + }; + }; + + config = { + local.fs.btrfs = let + sysHddBtrfs = layout: { + "/" = { + inherit (layout.sys) device ssd; + subvol = layout.sys.root; + }; + + "/toplevel" = { + inherit (layout.sys) device ssd; + subvol = layout.sys.toplevel; + }; + + "/hdd" = { + inherit (layout.hdd) device; + subvol = "/"; + ssd = false; + }; + + "/home" = { + inherit (layout.hdd) device; + subvol = layout.hdd.home; + ssd = false; + snapper = "home"; + }; + }; + + inherit (cfg.fs) layout; + + layoutMaps = [ sysHddBtrfs ]; + layoutOpts = [ layout.sysHddBtrfs ]; + valid = filter ({ snd, ... }: snd != null) (zipLists layoutMaps layoutOpts); + in optionalAttrs (valid != []) ((head valid).fst (head valid).snd); + }; +} diff --git a/sys/options.nix b/sys/options.nix index 789b489..c266fd5 100644 --- a/sys/options.nix +++ b/sys/options.nix @@ -36,11 +36,6 @@ in { type = listOf str; }; - snapperSubvols = mkOption { - type = attrsOf str; - default = {}; - }; - crypt = { toplevel = mkOption { default = null; @@ -85,80 +80,5 @@ in { }); }; }; - - fs = { - boot.device = mkOption { - type = str; - }; - - btrfs = mkOption { - default = []; - - type = attrsOf (submodule { - options = { - device = mkOption { - type = str; - }; - - subvol = mkOption { - type = str; - }; - - ssd = mkOption { - type = bool; - }; - - snapper = mkOption { - type = nullOr str; - default = null; - }; - }; - }); - }; - - layout = mkOption { - default = {}; - - type = submodule { - options = { - sysHddBtrfs = mkOption { - default = null; - - type = nullOr (submodule { - options = { - sys = { - device = mkOption { - type = str; - }; - - ssd = mkOption { - type = bool; - }; - - root = mkOption { - type = str; - }; - - toplevel = mkOption { - type = str; - }; - }; - - hdd = { - device = mkOption { - type = str; - }; - - home = mkOption { - type = str; - }; - }; - }; - }); - }; - }; - }; - }; - }; }; } |
