nixos/activation/bootspec: init bootspec support (RFC-0125)

This commit is contained in:
Cole Helbling 2021-07-28 14:10:02 -07:00 committed by Cole Helbling
parent 0b8b0c65cc
commit 942dcd238b
3 changed files with 61 additions and 0 deletions

1
.github/CODEOWNERS vendored
View file

@ -78,6 +78,7 @@
/nixos/doc/manual/man-nixos-option.xml @nbp
/nixos/modules/installer/tools/nixos-option.sh @nbp
/nixos/modules/system @dasJ
/nixos/modules/system/activation/bootspec.nix @grahamc @cole-h
# NixOS integration test driver
/nixos/lib/test-driver @tfc

View file

@ -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;
}

View file

@ -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}
'';