diff --git a/nixos/modules/image/repart-image.nix b/nixos/modules/image/repart-image.nix index 41f68a0282ac..cc4c2211e3d3 100644 --- a/nixos/modules/image/repart-image.nix +++ b/nixos/modules/image/repart-image.nix @@ -30,7 +30,7 @@ , imageFileBasename , compression , fileSystems -, partitionsJSON +, finalPartitions , split , seed , definitionsDirectory @@ -110,7 +110,9 @@ in env = mkfsEnv; - inherit partitionsJSON definitionsDirectory; + inherit finalPartitions definitionsDirectory; + + partitionsJSON = builtins.toJSON finalAttrs.finalPartitions; # relative path to the repart definitions that are read by systemd-repart finalRepartDefinitions = "repart.d"; @@ -136,7 +138,7 @@ in patchPhase = '' runHook prePatch - amendedRepartDefinitionsDir=$(${amendRepartDefinitions} $partitionsJSON $definitionsDirectory) + amendedRepartDefinitionsDir=$(${amendRepartDefinitions} <(echo "$partitionsJSON") $definitionsDirectory) ln -vs $amendedRepartDefinitionsDir $finalRepartDefinitions runHook postPatch diff --git a/nixos/modules/image/repart-verity-store.nix b/nixos/modules/image/repart-verity-store.nix index 3f341ca421f2..e8706a5f79d0 100644 --- a/nixos/modules/image/repart-verity-store.nix +++ b/nixos/modules/image/repart-verity-store.nix @@ -163,21 +163,20 @@ in createEmpty = false; }).overrideAttrs ( - finalAttrs: previousAttrs: - let - copyUki = "CopyFiles=${config.system.build.uki}/${config.system.boot.loader.ukiFile}:${cfg.ukiPath}"; - in - { + finalAttrs: previousAttrs: { + # add entry to inject UKI into ESP + finalPartitions = lib.recursiveUpdate previousAttrs.finalPartitions { + ${cfg.partitionIds.esp}.contents = { + "${cfg.ukiPath}".source = "${config.system.build.uki}/${config.system.boot.loader.ukiFile}"; + }; + }; + nativeBuildInputs = previousAttrs.nativeBuildInputs ++ [ pkgs.systemdUkify verityHashCheck + pkgs.jq ]; - postPatch = '' - # add entry to inject UKI into ESP - echo '${copyUki}' >> $finalRepartDefinitions/${cfg.partitionIds.esp}.conf - ''; - preBuild = '' # check that we build the final image with the same intermediate image for # which the injected UKI was built by comparing the UKI cmdline with the repart output @@ -194,6 +193,24 @@ in chmod +w ${config.image.repart.imageFileBasename}.raw ''; + # replace "TBD" with the original roothash values + preInstall = '' + mv -v repart-output{.json,_orig.json} + + jq --slurp --indent -1 \ + '.[0] as $intermediate | .[1] as $final + | $intermediate | map(select(.roothash != null) | { "uuid":.uuid,"roothash":.roothash }) as $uuids + | $final + $uuids + | group_by(.uuid) + | map(add) + | sort_by(.offset)' \ + ${config.system.build.intermediateImage}/repart-output.json \ + repart-output_orig.json \ + > repart-output.json + + rm -v repart-output_orig.json + ''; + # the image will be self-contained so we can drop references # to the closure that was used to build it unsafeDiscardReferences.out = true; diff --git a/nixos/modules/image/repart.nix b/nixos/modules/image/repart.nix index b2f03d96ad35..544779cd6e9b 100644 --- a/nixos/modules/image/repart.nix +++ b/nixos/modules/image/repart.nix @@ -318,14 +318,12 @@ in format (lib.mapAttrs (_n: v: { Partition = v.repartConfig; }) cfg.finalPartitions); - partitionsJSON = pkgs.writeText "partitions.json" (builtins.toJSON cfg.finalPartitions); - mkfsEnv = mkfsOptionsToEnv cfg.mkfsOptions; in pkgs.callPackage ./repart-image.nix { systemd = cfg.package; - inherit (cfg) name version imageFileBasename compression split seed sectorSize; - inherit fileSystems definitionsDirectory partitionsJSON mkfsEnv; + inherit (cfg) name version imageFileBasename compression split seed sectorSize finalPartitions; + inherit fileSystems definitionsDirectory mkfsEnv; }; meta.maintainers = with lib.maintainers; [ nikstur willibutz ];