summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/default.nix123
-rw-r--r--sys/fs/btrfs.nix111
-rw-r--r--sys/fs/default.nix21
-rw-r--r--sys/fs/layout.nix77
-rw-r--r--sys/options.nix80
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;
- };
- };
- };
- });
- };
- };
- };
- };
- };
};
}