From efc80d7d89d40f54b76e0efcf83578c6b074906e Mon Sep 17 00:00:00 2001 From: David Arnold Date: Sat, 5 Nov 2022 15:17:35 -0500 Subject: types: init swap --- example/swap.nix | 52 +++++++++++++++++++++++++++++++++++++++++++++++ module.nix | 1 + tests/swap.nix | 19 +++++++++++++++++ types.nix | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 example/swap.nix create mode 100644 tests/swap.nix diff --git a/example/swap.nix b/example/swap.nix new file mode 100644 index 0000000..0693caa --- /dev/null +++ b/example/swap.nix @@ -0,0 +1,52 @@ +{ disks ? [ "/dev/vdb" ], ... }: { + disk = { + vdb = { + device = builtins.elemAt disks 0; + type = "disk"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { + type = "partition"; + name = "ESP"; + start = "1MiB"; + end = "100MiB"; + bootable = true; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + } + { + name = "root"; + type = "partition"; + start = "100MiB"; + end = "-1G"; + part-type = "primary"; + bootable = true; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + }; + } + { + name = "root"; + type = "partition"; + start = "-1G"; + end = "100%"; + part-type = "primary"; + bootable = true; + content = { + type = "swap"; + randomEncryption = true; + }; + } + ]; + }; + }; + }; +} + diff --git a/module.nix b/module.nix index 9b568be..1a8a000 100644 --- a/module.nix +++ b/module.nix @@ -42,5 +42,6 @@ in { # Remember to add config keys here if they are added to types fileSystems = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "fileSystems" (types.diskoLib.config cfg.devices))); boot = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "boot" (types.diskoLib.config cfg.devices))); + swapDevices = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "swapDevices" (types.diskoLib.config cfg.devices))); }; } diff --git a/tests/swap.nix b/tests/swap.nix new file mode 100644 index 0000000..fa090f8 --- /dev/null +++ b/tests/swap.nix @@ -0,0 +1,19 @@ +{ pkgs ? (import { }) +, makeDiskoTest ? (pkgs.callPackage ./lib.nix { }).makeDiskoTest +}: +makeDiskoTest { + disko-config = ../example/swap.nix; + extraTestScript = '' + machine.succeed("mountpoint /"); + machine.succeed("swapon --show >&2"); + machine.succeed(""" + lsblk --json | + ${pkgs.jq}/bin/jq -e '.blockdevices[] | + select(.name == "vda") | + .children[] | + select(.name == "vda3") | + .children[0].mountpoints[0] == "[SWAP]" + ' + """); + ''; +} diff --git a/types.nix b/types.nix index 2ed3ccc..87a34a9 100644 --- a/types.nix +++ b/types.nix @@ -18,13 +18,13 @@ rec { # option for valid contents of partitions (basically like devices, but without tables) partitionType = mkOption { - type = types.nullOr (diskoLib.subType { inherit btrfs filesystem zfs mdraid luks lvm_pv; }); + type = types.nullOr (diskoLib.subType { inherit btrfs filesystem zfs mdraid luks lvm_pv swap; }); default = null; }; # option for valid contents of devices deviceType = mkOption { - type = types.nullOr (diskoLib.subType { inherit table btrfs filesystem zfs mdraid luks lvm_pv; }); + type = types.nullOr (diskoLib.subType { inherit table btrfs filesystem zfs mdraid luks lvm_pv swap; }); default = null; }; @@ -547,6 +547,62 @@ rec { }; }); + swap = types.submodule ({ config, ... }: { + options = { + type = mkOption { + type = types.enum [ "swap" ]; + internal = true; + }; + randomEncryption = mkOption { + type = types.bool; + default = false; + }; + _meta = mkOption { + internal = true; + readOnly = true; + type = types.functionTo diskoLib.jsonType; + default = dev: { + }; + }; + _create = mkOption { + internal = true; + readOnly = true; + type = types.functionTo types.str; + default = dev: '' + mkswap ${dev} + ''; + }; + _mount = mkOption { + internal = true; + readOnly = true; + type = types.functionTo diskoLib.jsonType; + default = dev: { + fs.${dev} = '' + if ! $(swapon --show | grep -q '^${dev} '); then + swapon ${dev} + fi + ''; + }; + }; + _config = mkOption { + internal = true; + readOnly = true; + default = dev: [{ + swapDevices = [{ + device = dev; + randomEncryption = config.randomEncryption; + }]; + }]; + }; + _pkgs = mkOption { + internal = true; + readOnly = true; + type = types.functionTo (types.listOf types.package); + default = pkgs: [ pkgs.util-linux ]; + }; + }; + }); + lvm_pv = types.submodule ({ config, ... }: { options = { type = mkOption { @@ -1158,7 +1214,7 @@ rec { type = types.enum [ "disk" ]; }; device = mkOption { - type = optionTypes.absolute-pathname; # TODO check if subpath of /dev ? + type = optionTypes.absolute-pathname; # TODO check if subpath of /dev ? - No! eg: /.swapfile }; content = diskoLib.deviceType; _meta = mkOption { -- cgit v1.2.3