about summary refs log tree commit diff
path: root/nixos/modules/system
diff options
context:
space:
mode:
authorCole Helbling <cole.helbling@determinate.systems>2021-07-28 14:10:02 -0700
committerCole Helbling <cole.e.helbling@outlook.com>2022-12-08 13:50:03 -0800
commit942dcd238b49ecd3020e75d0a193e9eedf45a0ab (patch)
tree7983e930f741e0d595a07cf556ce36084a74f98c /nixos/modules/system
parent0b8b0c65cc999625ad0047e027330df376a6d705 (diff)
nixos/activation/bootspec: init bootspec support (RFC-0125)
Diffstat (limited to 'nixos/modules/system')
-rw-r--r--nixos/modules/system/activation/bootspec.nix50
-rw-r--r--nixos/modules/system/activation/top-level.nix10
2 files changed, 60 insertions, 0 deletions
diff --git a/nixos/modules/system/activation/bootspec.nix b/nixos/modules/system/activation/bootspec.nix
new file mode 100644
index 0000000000000..c38f675cea27b
--- /dev/null
+++ b/nixos/modules/system/activation/bootspec.nix
@@ -0,0 +1,50 @@
+# Note that these schemas are defined by RFC-0125.
+# This document is considered a stable API, and is depended upon by external tooling.
+# Changes to the structure of the document, or the semantics of the values should go through an RFC.
+#
+# See: https://github.com/NixOS/rfcs/pull/125
+{ config, pkgs, lib, children }:
+let
+  schemas = {
+    v1 = rec {
+      filename = "boot.v1.json";
+      json =
+        pkgs.writeText filename
+          (builtins.toJSON
+            {
+              schemaVersion = 1;
+
+              kernel = "${config.boot.kernelPackages.kernel}/${config.system.boot.loader.kernelFile}";
+              kernelParams = config.boot.kernelParams;
+              initrd = "${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}";
+              initrdSecrets = "${config.system.build.initialRamdiskSecretAppender}/bin/append-initrd-secrets";
+              label = "NixOS ${config.system.nixos.codeName} ${config.system.nixos.label} (Linux ${config.boot.kernelPackages.kernel.modDirVersion})";
+
+              specialisation = lib.mapAttrs
+                (childName: childToplevel: {
+                  bootspec = "${childToplevel}/${filename}";
+                })
+                children;
+            });
+
+      generator = ''
+        ${pkgs.jq}/bin/jq '
+          .toplevel = $toplevel |
+          .init = $init
+          ' \
+          --sort-keys \
+          --arg toplevel "$out" \
+          --arg init "$out/init" \
+          < ${json} \
+          > $out/${filename}
+      '';
+    };
+  };
+in
+{
+  # This will be run as a part of the `systemBuilder` in ./top-level.nix. This
+  # means `$out` points to the output of `config.system.build.toplevel` and can
+  # be used for a variety of things (though, for now, it's only used to report
+  # the path of the `toplevel` itself and the `init` executable).
+  writer = schemas.v1.generator;
+}
diff --git a/nixos/modules/system/activation/top-level.nix b/nixos/modules/system/activation/top-level.nix
index 55ff98db53829..9237c1c2f6e51 100644
--- a/nixos/modules/system/activation/top-level.nix
+++ b/nixos/modules/system/activation/top-level.nix
@@ -9,6 +9,14 @@ let
         "${config.system.boot.loader.kernelFile}";
       initrdPath = "${config.system.build.initialRamdisk}/" +
         "${config.system.boot.loader.initrdFile}";
+
+      bootSpec = import ./bootspec.nix {
+        inherit
+          config
+          pkgs
+          lib
+          children;
+      };
     in ''
       mkdir $out
 
@@ -79,6 +87,8 @@ let
 
       echo -n "${toString config.system.extraDependencies}" > $out/extra-dependencies
 
+      ${bootSpec.writer}
+
       ${config.system.extraSystemBuilderCmds}
     '';