summaryrefslogtreecommitdiffstats
path: root/nixos/maintainers
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/maintainers
parent076f6e2d948259e18ddac8e562c62b5b53de9fe6 (diff)
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/maintainers')
-rw-r--r--nixos/maintainers/scripts/ec2/amazon-image-zfs.nix12
-rw-r--r--nixos/maintainers/scripts/ec2/amazon-image.nix107
2 files changed, 92 insertions, 27 deletions
diff --git a/nixos/maintainers/scripts/ec2/amazon-image-zfs.nix b/nixos/maintainers/scripts/ec2/amazon-image-zfs.nix
new file mode 100644
index 000000000000..32dd96a7cb7e
--- /dev/null
+++ b/nixos/maintainers/scripts/ec2/amazon-image-zfs.nix
@@ -0,0 +1,12 @@
+{
+ imports = [ ./amazon-image.nix ];
+ ec2.zfs = {
+ enable = true;
+ datasets = {
+ "tank/system/root".mount = "/";
+ "tank/system/var".mount = "/var";
+ "tank/local/nix".mount = "/nix";
+ "tank/user/home".mount = "/home";
+ };
+ };
+}
diff --git a/nixos/maintainers/scripts/ec2/amazon-image.nix b/nixos/maintainers/scripts/ec2/amazon-image.nix
index 677aff4421e0..cb9fbfd86039 100644
--- a/nixos/maintainers/scripts/ec2/amazon-image.nix
+++ b/nixos/maintainers/scripts/ec2/amazon-image.nix
@@ -4,6 +4,7 @@ with lib;
let
cfg = config.amazonImage;
+
in {
imports = [ ../../../modules/virtualisation/amazon-image.nix ];
@@ -53,15 +54,7 @@ in {
};
};
- config.system.build.amazonImage = import ../../../lib/make-disk-image.nix {
- inherit lib config;
- inherit (cfg) contents format name;
- pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
- partitionTableType = if config.ec2.efi then "efi"
- else if config.ec2.hvm then "legacy+gpt"
- else "none";
- diskSize = cfg.sizeMB;
- fsType = "ext4";
+ config.system.build.amazonImage = let
configFile = pkgs.writeText "configuration.nix"
''
{ modulesPath, ... }: {
@@ -72,24 +65,84 @@ in {
${optionalString config.ec2.efi ''
ec2.efi = true;
''}
+ ${optionalString config.ec2.zfs.enable ''
+ ec2.zfs.enable = true;
+ networking.hostId = "${config.networking.hostId}";
+ ''}
}
'';
- postVM = ''
- extension=''${diskImage##*.}
- friendlyName=$out/${cfg.name}.$extension
- mv "$diskImage" "$friendlyName"
- diskImage=$friendlyName
-
- mkdir -p $out/nix-support
- echo "file ${cfg.format} $diskImage" >> $out/nix-support/hydra-build-products
-
- ${pkgs.jq}/bin/jq -n \
- --arg label ${lib.escapeShellArg config.system.nixos.label} \
- --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
- --arg logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$diskImage" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
- --arg file "$diskImage" \
- '$ARGS.named' \
- > $out/nix-support/image-info.json
- '';
- };
+
+ zfsBuilder = import ../../../lib/make-zfs-image.nix {
+ inherit lib config configFile;
+ inherit (cfg) contents format name;
+ pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
+
+ includeChannel = true;
+
+ bootSize = 1000; # 1G is the minimum EBS volume
+
+ rootSize = cfg.sizeMB;
+ rootPoolProperties = {
+ ashift = 12;
+ autoexpand = "on";
+ };
+
+ datasets = config.ec2.zfs.datasets;
+
+ postVM = ''
+ extension=''${rootDiskImage##*.}
+ friendlyName=$out/${cfg.name}
+ rootDisk="$friendlyName.root.$extension"
+ bootDisk="$friendlyName.boot.$extension"
+ mv "$rootDiskImage" "$rootDisk"
+ mv "$bootDiskImage" "$bootDisk"
+
+ mkdir -p $out/nix-support
+ echo "file ${cfg.format} $bootDisk" >> $out/nix-support/hydra-build-products
+ echo "file ${cfg.format} $rootDisk" >> $out/nix-support/hydra-build-products
+
+ ${pkgs.jq}/bin/jq -n \
+ --arg label ${lib.escapeShellArg config.system.nixos.label} \
+ --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
+ --arg root_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$bootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
+ --arg boot_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$rootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
+ --arg root "$rootDisk" \
+ --arg boot "$bootDisk" \
+ '$ARGS.named' \
+ > $out/nix-support/image-info.json
+ '';
+ };
+
+ extBuilder = import ../../../lib/make-disk-image.nix {
+ inherit lib config configFile;
+
+ inherit (cfg) contents format name;
+ pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package
+
+ fsType = "ext4";
+ partitionTableType = if config.ec2.efi then "efi"
+ else if config.ec2.hvm then "legacy+gpt"
+ else "none";
+
+ diskSize = cfg.sizeMB;
+
+ postVM = ''
+ extension=''${diskImage##*.}
+ friendlyName=$out/${cfg.name}.$extension
+ mv "$diskImage" "$friendlyName"
+ diskImage=$friendlyName
+
+ mkdir -p $out/nix-support
+ echo "file ${cfg.format} $diskImage" >> $out/nix-support/hydra-build-products
+
+ ${pkgs.jq}/bin/jq -n \
+ --arg label ${lib.escapeShellArg config.system.nixos.label} \
+ --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
+ --arg logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$diskImage" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
+ --arg file "$diskImage" \
+ '$ARGS.named' \
+ > $out/nix-support/image-info.json
+ '';
+ };
+ in if config.ec2.zfs.enable then zfsBuilder else extBuilder;
}