SRCDIR="/work/src",
CHROOT_SRCDIR="/work/src",
PACKAGEDIR="/work/packages",
+ ARTIFACTDIR="/work/artifacts",
SCRIPT="/work/prepare",
CHROOT_SCRIPT="/work/prepare",
MKOSI_UID=str(INVOKING_USER.uid),
Mount(script, "/work/prepare", ro=True),
Mount(json, "/work/config.json", ro=True),
Mount(context.root, "/buildroot"),
+ Mount(context.artifacts, "/work/artifacts"),
*context.config.distribution.package_manager(context.config).mounts(context),
],
options=["--dir", "/work/src", "--chdir", "/work/src"],
SRCDIR="/work/src",
CHROOT_SRCDIR="/work/src",
PACKAGEDIR="/work/packages",
+ ARTIFACTDIR="/work/artifacts",
SCRIPT="/work/build-script",
CHROOT_SCRIPT="/work/build-script",
MKOSI_UID=str(INVOKING_USER.uid),
Mount(context.root, "/buildroot"),
Mount(context.install_dir, "/work/dest"),
Mount(context.staging, "/work/out"),
+ Mount(context.artifacts, "/work/artifacts"),
*(
[Mount(context.config.build_dir, "/work/build")]
if context.config.build_dir
SRCDIR="/work/src",
CHROOT_SRCDIR="/work/src",
PACKAGEDIR="/work/packages",
+ ARTIFACTDIR="/work/artifacts",
MKOSI_UID=str(INVOKING_USER.uid),
MKOSI_GID=str(INVOKING_USER.gid),
MKOSI_CONFIG="/work/config.json",
Mount(json, "/work/config.json", ro=True),
Mount(context.root, "/buildroot"),
Mount(context.staging, "/work/out"),
+ Mount(context.artifacts, "/work/artifacts"),
*context.config.distribution.package_manager(context.config).mounts(context),
],
options=["--dir", "/work/src", "--chdir", "/work/src"],
SRCDIR="/work/src",
CHROOT_SRCDIR="/work/src",
PACKAGEDIR="/work/packages",
+ ARTIFACTDIR="/work/artifacts",
SCRIPT="/work/finalize",
CHROOT_SCRIPT="/work/finalize",
MKOSI_UID=str(INVOKING_USER.uid),
Mount(json, "/work/config.json", ro=True),
Mount(context.root, "/buildroot"),
Mount(context.staging, "/work/out"),
+ Mount(context.artifacts, "/work/artifacts"),
*context.config.distribution.package_manager(context.config).mounts(context),
],
options=["--dir", "/work/src", "--chdir", "/work/src"],
if context.config.output_format not in (OutputFormat.disk, OutputFormat.directory):
return False
- if not any(gen_kernel_images(context)):
+ if not any((context.artifacts / "io.mkosi.initrd").glob("*")) and not any(gen_kernel_images(context)):
return False
return True
return cmdline + context.config.kernel_command_line
+def finalize_initrds(context: Context) -> list[Path]:
+ if any((context.artifacts / "io.mkosi.microcode").glob("*")):
+ initrds = sorted((context.artifacts / "io.mkosi.microcode").iterdir())
+ elif microcode := build_microcode_initrd(context):
+ initrds = [microcode]
+ else:
+ initrds = []
+
+ if context.config.initrds:
+ initrds += context.config.initrds
+ elif any((context.artifacts / "io.mkosi.initrd").glob("*")):
+ initrds += sorted((context.artifacts / "io.mkosi.initrd").iterdir())
+ else:
+ initrds += [build_default_initrd(context)]
+
+ return initrds
+
+
def install_type1(
context: Context,
kver: str,
dst.mkdir(parents=True, exist_ok=True)
entry.parent.mkdir(parents=True, exist_ok=True)
- microcode = build_microcode_initrd(context)
kmods = build_kernel_modules_initrd(context, kver)
cmdline = finalize_cmdline(context, finalize_roothash(partitions))
else:
kimg = Path(shutil.copy2(context.root / kimg, dst / "vmlinuz"))
- initrds = [Path(shutil.copy2(microcode, dst.parent / "microcode.initrd"))] if microcode else []
- initrds += [
- Path(shutil.copy2(initrd, dst.parent / initrd.name))
- for initrd in (context.config.initrds or [build_default_initrd(context)])
- ]
+ initrds = [Path(shutil.copy2(initrd, dst.parent / initrd.name)) for initrd in finalize_initrds(context)]
initrds += [Path(shutil.copy2(kmods, dst / "kernel-modules.initrd"))]
with entry.open("w") as f:
return
else:
- microcode = build_microcode_initrd(context)
-
- initrds = [microcode] if microcode else []
- initrds += context.config.initrds or [build_default_initrd(context)]
-
+ initrds = finalize_initrds(context)
if context.config.kernel_modules_initrd:
initrds += [build_kernel_modules_initrd(context, kver)]
return
for kver, _ in gen_kernel_images(context):
- microcode = build_microcode_initrd(context)
- initrds = [microcode] if microcode else []
- initrds += context.config.initrds or [build_default_initrd(context)]
+ initrds = finalize_initrds(context)
+
if context.config.kernel_modules_initrd:
kver = next(gen_kernel_images(context))[0]
initrds += [build_kernel_modules_initrd(context, kver)]
`Initrds=`, `--initrd`
-: Use user-provided initrd(s). Takes a comma separated list of paths to
- initrd files. This option may be used multiple times in which case the
- initrd lists are combined. If no initrds are specified and a bootable
- image is requested, mkosi will automatically build a default initrd.
+: Use user-provided initrd(s). Takes a comma separated list of paths to initrd
+ files. This option may be used multiple times in which case the initrd lists
+ are combined. If no initrds are specified and a bootable image is requested,
+ mkosi will look for initrds in a subdirectory `io.mkosi.initrd` of the
+ artifact directory (see `$ARTIFACTDIR` in the section **ENVIRONMENT
+ VARIABLES**), if none are found there mkosi will automatically build a
+ default initrd.
`InitrdPackages=`, `--initrd-package=`
repository. Build scripts can add more packages to the local
repository by writing the packages to `$PACKAGEDIR`.
+* `$ARTIFACTDIR` points to the directory that is used to pass around build
+ artifacts generated during the build and make them available for use by
+ mkosi. This is similar to `PACKAGEDIR`, but is meant for artifacts that may
+ not be packages understood by the package manager, e.g. initrds created by
+ other initrd generators than mkosi. Build scripts can add more artifacts to
+ the directory by placing them in `$ARTIFACTDIR`. Files in this directory are
+ only available for the current build and are not copied out like the contents
+ of `$OUTPUTDIR`.
+
+ `mkosi` will also use certain subdirectories of an artifacts directory to
+ automatically use their contents at certain steps. Currently the following
+ two subdirectories in the artifact directory are used by mkosi:
+ - `io.mkosi.microcode`: All files in this directory are used as microcode
+ files, i.e. they are prepended to the initrds in lexicographical order.
+ - `io.mkosi.initrd`: All files in this directory are used as initrds and
+ joined in lexicographical order.
+
+ It is recommend users of `$ARTIFACTDIR` put things for their own use in a
+ similar namespaced directory, e.h. `local.my.namespace`.
+
* `$BUILDROOT` is the root directory of the image being built,
optionally with the build overlay mounted on top depending on the
script that's being executed.
| `CHROOT_OUTPUTDIR` | | | | X | X | X | |
| `BUILDROOT` | | | X | X | X | X | |
| `PACKAGEDIR` | | | x | x | x | x | |
+| `ARTIFACTDIR` | | | x | x | x | x | |
| `WITH_DOCS` | | | X | X | | | |
| `WITH_TESTS` | | | X | X | | | |
| `WITH_NETWORK` | | | X | X | | | |