summary refs log tree commit diff
path: root/nixos/modules/virtualisation/amazon-options.nix
diff options
context:
space:
mode:
authorGraham Christensen <graham@grahamc.com>2021-08-25 09:38:46 -0400
committerGraham Christensen <graham@grahamc.com>2021-08-25 10:42:35 -0400
commitbd38b059eae05871579b2dfd51cd41d058b6a1ec (patch)
treeec8236c3aa59535ed61e0856960b48c177d0a0ca /nixos/modules/virtualisation/amazon-options.nix
parent076f6e2d948259e18ddac8e562c62b5b53de9fe6 (diff)
downloadnixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.tar
nixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.tar.gz
nixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.tar.bz2
nixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.tar.lz
nixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.tar.xz
nixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.tar.zst
nixpkgs-bd38b059eae05871579b2dfd51cd41d058b6a1ec.zip
NixOS/amazonImageZfs: init
Introduce an AWS EC2 AMI which supports aarch64 and x86_64 with a ZFS
root.

This uses `make-zfs-image` which implies two EBS volumes are needed
inside EC2, one for boot, one for root. It should not matter which
is identified `xvda` and which is `xvdb`, though I have always
uploaded `boot` as `xvda`.
Diffstat (limited to 'nixos/modules/virtualisation/amazon-options.nix')
-rw-r--r--nixos/modules/virtualisation/amazon-options.nix54
1 files changed, 53 insertions, 1 deletions
diff --git a/nixos/modules/virtualisation/amazon-options.nix b/nixos/modules/virtualisation/amazon-options.nix
index 2e807131e93..698edcd835a 100644
--- a/nixos/modules/virtualisation/amazon-options.nix
+++ b/nixos/modules/virtualisation/amazon-options.nix
@@ -1,7 +1,46 @@
 { config, lib, pkgs, ... }:
-{
+let
+  inherit (lib) types;
+in {
   options = {
     ec2 = {
+      zfs = {
+        enable = lib.mkOption {
+          default = false;
+          internal = true;
+          description = ''
+            Whether the EC2 instance uses a ZFS root.
+          '';
+        };
+
+        datasets = lib.mkOption {
+          description = ''
+            Datasets to create under the `tank` and `boot` zpools.
+
+            **NOTE:** This option is used only at image creation time, and
+            does not attempt to declaratively create or manage datasets
+            on an existing system.
+          '';
+
+          default = {};
+
+          type = types.attrsOf (types.submodule {
+            options = {
+              mount = lib.mkOption {
+                description = "Where to mount this dataset.";
+                type = types.nullOr types.string;
+                default = null;
+              };
+
+              properties = lib.mkOption {
+                description = "Properties to set on this dataset.";
+                type = types.attrsOf types.string;
+                default = {};
+              };
+            };
+          });
+        };
+      };
       hvm = lib.mkOption {
         default = lib.versionAtLeast config.system.stateVersion "17.03";
         internal = true;
@@ -18,4 +57,17 @@
       };
     };
   };
+
+  config = lib.mkIf config.ec2.zfs.enable {
+    networking.hostId = lib.mkDefault "00000000";
+
+    fileSystems = let
+      mountable = lib.filterAttrs (_: value: ((value.mount or null) != null)) config.ec2.zfs.datasets;
+    in lib.mapAttrs'
+      (dataset: opts: lib.nameValuePair opts.mount {
+        device = dataset;
+        fsType = "zfs";
+      })
+      mountable;
+  };
 }