break
+def copy_repart_definitions(context: Context) -> None:
+ if ArtifactOutput.repart_definitions not in context.config.split_artifacts:
+ return
+
+ if context.config.output_format == OutputFormat.esp:
+ definitions = [context.workspace / "esp-definitions"]
+ elif context.config.output_format.is_extension_or_portable_image():
+ definitions = [extension_or_portable_image_repart_definitions(context)]
+ elif (d := context.workspace / "repart-definitions").exists():
+ definitions = [d]
+ elif context.config.output_format == OutputFormat.disk:
+ definitions = context.config.repart_dirs
+ else:
+ definitions = []
+
+ if not definitions:
+ return
+
+ for d in definitions:
+ copy_tree(d, context.config.output_dir_or_cwd() / context.config.output_split_repart_definitions)
+
+
def calculate_sha256sum(context: Context) -> None:
if not context.config.checksum:
return
(context.staging / context.config.output_split_roothash).write_text(roothash.partition("=")[2])
-def make_extension_or_portable_image(context: Context, output: Path) -> None:
+def extension_or_portable_image_repart_definitions(context: Context) -> Path:
if context.config.verity == Verity.disabled or (
context.config.verity == Verity.auto
and (not context.config.verity_key or not context.config.verity_certificate)
else:
unsigned = ""
- r = context.resources / f"repart/definitions/{context.config.output_format}{unsigned}.repart.d"
+ return context.resources / f"repart/definitions/{context.config.output_format}{unsigned}.repart.d"
+
+
+def make_extension_or_portable_image(context: Context, output: Path) -> None:
+ definitions = extension_or_portable_image_repart_definitions(context)
cmdline: list[PathString] = [
"systemd-repart",
"--seed", str(context.config.seed) if context.config.seed else "random",
"--empty=create",
"--size=auto",
- "--definitions", workdir(r),
+ "--definitions", workdir(definitions),
workdir(output),
] # fmt: skip
options: list[PathString] = [
"--become-root",
"--bind", output.parent, workdir(output.parent),
*context.rootoptions(readonly=True),
- "--ro-bind", r, workdir(r),
+ "--ro-bind", definitions, workdir(definitions),
] # fmt: skip
if not context.config.architecture.is_native():
copy_uki(context)
copy_vmlinuz(context)
copy_initrd(context)
+ copy_repart_definitions(context)
if context.config.output_format == OutputFormat.tar:
make_tar(context.root, context.staging / context.config.output_with_format, sandbox=context.sandbox)
roothash = enum.auto()
os_release = enum.auto()
kernel_modules_initrd = enum.auto()
+ repart_definitions = enum.auto()
@staticmethod
def compat_no() -> list["ArtifactOutput"]:
def output_split_kernel_modules_initrd(self) -> str:
return f"{self.output}.kernel-modules-initrd"
+ @property
+ def output_split_repart_definitions(self) -> str:
+ return f"{self.output}.repart.d"
+
@property
def output_nspawn_settings(self) -> str:
return f"{self.output}.nspawn"
self.output_split_roothash,
self.output_split_os_release,
self.output_split_kernel_modules_initrd,
+ self.output_split_repart_definitions,
self.output_nspawn_settings,
self.output_checksum,
self.output_signature,
`SplitArtifacts=`, `--split-artifacts=`
: The artifact types to split out of the final image. A comma-delimited
list consisting of `uki`, `kernel`, `initrd`, `os-release`, `prcs`, `partitions`,
- `roothash`, `kernel-modules-initrd` and `tar`. When building a bootable image `kernel`
+ `roothash`, `kernel-modules-initrd`, `repart-definitions` and `tar`. When building a bootable image `kernel`
and `initrd` correspond to their artifact found in the image (or in the UKI),
while `uki` copies out the entire UKI. If `pcrs` is specified, a JSON
file containing the pre-calculated TPM2 digests is written out, according
initrd inspection tools don't properly handle multiple initrds appended to each
other.
+ When `repart-definitions` is specified, a directory containing the used repart
+ definition files is written to the output directory. If multiple directories are
+ configured via `RepartDirectories=`, they are merged, with later directories
+ taking priority over earlier ones when files with identical names exist.
+
By default `uki`, `kernel` and `initrd` are split out.
`RepartDirectories=`, `--repart-directory=`