diff options
Diffstat (limited to 'sys/btrfs')
| -rw-r--r-- | sys/btrfs/default.nix | 6 | ||||
| -rw-r--r-- | sys/btrfs/mounts.nix | 39 | ||||
| -rw-r--r-- | sys/btrfs/snapper.nix | 73 |
3 files changed, 118 insertions, 0 deletions
diff --git a/sys/btrfs/default.nix b/sys/btrfs/default.nix new file mode 100644 index 0000000..ee76537 --- /dev/null +++ b/sys/btrfs/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./mounts.nix + ./snapper.nix + ]; +} diff --git a/sys/btrfs/mounts.nix b/sys/btrfs/mounts.nix new file mode 100644 index 0000000..133f08f --- /dev/null +++ b/sys/btrfs/mounts.nix @@ -0,0 +1,39 @@ +{ lib, config, pkgs, ... }: +with lib; let + cfg = config.local.btrfs; +in +{ + options.local.btrfs = { + mounts = mkOption { + default = { }; + + type = with lib.types; attrsOf (submodule { + options = { + ssd = mkOption { + type = bool; + }; + + device = mkOption { + type = str; + }; + + subvol = mkOption { + type = str; + }; + }; + }); + }; + }; + + config = mkIf (cfg.mounts != { }) { + fileSystems = + let + btrfsMount = { device, subvol, ssd }: { + inherit device; + fsType = "btrfs"; + options = [ "noatime" "compress=zstd" "subvol=${subvol}" ] ++ optional ssd "ssd"; + }; + in + mapAttrs (_: btrfsMount) cfg.mounts; + }; +} diff --git a/sys/btrfs/snapper.nix b/sys/btrfs/snapper.nix new file mode 100644 index 0000000..27d2779 --- /dev/null +++ b/sys/btrfs/snapper.nix @@ -0,0 +1,73 @@ +{ config, lib, pkgs, ... }: +with lib; let + cfg = config.local.btrfs; +in +{ + options.local.btrfs = { + snapper = mkOption { + type = with lib.types; attrsOf str; + default = { }; + }; + }; + + config = mkIf (cfg.snapper != { }) { + environment.systemPackages = [ pkgs.local.btclone ]; + + services.snapper.configs = + let + snapperConfig = _: subvolume: { + SUBVOLUME = subvolume; + + # 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 = true; + + # cleanup hourly snapshots after some time + TIMELINE_CLEANUP = true; + + # 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.snapper; + }; +} |
