diff options
Diffstat (limited to '')
-rw-r--r-- | upstream/opensuse-tumbleweed/man1/mkosi.1 | 3532 |
1 files changed, 3532 insertions, 0 deletions
diff --git a/upstream/opensuse-tumbleweed/man1/mkosi.1 b/upstream/opensuse-tumbleweed/man1/mkosi.1 new file mode 100644 index 00000000..66ac1b58 --- /dev/null +++ b/upstream/opensuse-tumbleweed/man1/mkosi.1 @@ -0,0 +1,3532 @@ +'\" t +.\" Automatically generated by Pandoc 3.1.11.1 +.\" +.TH "mkosi" "1" "" "" "" +.SH NAME +mkosi \[em] Build Bespoke OS Images +.SH SYNOPSIS +\f[CR]mkosi [options\&...] summary\f[R] +.PP +\f[CR]mkosi [options\&...] build [command line\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] shell [command line\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] boot [nspawn settings\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] qemu [qemu parameters\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] ssh [command line\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] journalctl [command line\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] coredumpctl [command line\&...]\f[R] +.PP +\f[CR]mkosi [options\&...] clean\f[R] +.PP +\f[CR]mkosi [options\&...] serve\f[R] +.PP +\f[CR]mkosi [options\&...] burn <device>\f[R] +.PP +\f[CR]mkosi [options\&...] bump\f[R] +.PP +\f[CR]mkosi [options\&...] genkey\f[R] +.PP +\f[CR]mkosi [options\&...] documentation\f[R] +.PP +\f[CR]mkosi [options\&...] help\f[R] +.SH DESCRIPTION +\f[CR]mkosi\f[R] is a tool for easily building customized OS images. +It\[cq]s a fancy wrapper around \f[CR]dnf \-\-installroot\f[R], +\f[CR]apt\f[R], \f[CR]pacman\f[R] and \f[CR]zypper\f[R] that may +generate disk images with a number of bells and whistles. +.SS Command Line Verbs +The following command line verbs are known: +.TP +\f[CR]summary\f[R] +Outputs a human\-readable summary of all options used for building an +image. +This will parse the command line and \f[CR]mkosi.conf\f[R] file as it +would do on \f[CR]build\f[R], but only output what it is configured for +and not actually build anything. +.TP +\f[CR]build\f[R] +This builds the image based on the settings passed in on the command +line or read from configuration files. +This command is the default if no verb is explicitly specified. +If any command line arguments are specified, these are passed directly +to the build script if one is defined. +.TP +\f[CR]shell\f[R] +This builds the image if it is not built yet, and then invokes +\f[CR]systemd\-nspawn\f[R] to acquire an interactive shell prompt in it. +An optional command line may be specified after the \f[CR]shell\f[R] +verb, to be invoked in place of the shell in the container. +Use \f[CR]\-f\f[R] in order to rebuild the image unconditionally before +acquiring the shell, see below. +This command must be executed as \f[CR]root\f[R]. +.TP +\f[CR]boot\f[R] +Similar to \f[CR]shell\f[R], but boots the image using +\f[CR]systemd\-nspawn\f[R]. +An optional command line may be specified after the \f[CR]boot\f[R] +verb, which can contain extra nspawn options as well as arguments which +are passed as the \f[I]kernel command line\f[R] to the init system in +the image. +.TP +\f[CR]qemu\f[R] +Similar to \f[CR]boot\f[R], but uses \f[CR]qemu\f[R] to boot up the +image, i.e.\ instead of container virtualization virtual machine +virtualization is used. +This verb is only supported for disk images that contain a boot loader +and cpio images in which a kernel was installed. +For cpio images a kernel can also be provided by passing the +\f[CR]\-kernel\f[R] qemu argument to the \f[CR]qemu\f[R] verb. +Any arguments specified after the \f[CR]qemu\f[R] verb are appended to +the \f[CR]qemu\f[R] invocation. +.TP +\f[CR]ssh\f[R] +When the image is built with the \f[CR]Ssh=yes\f[R] option, this command +connects to a booted virtual machine (\f[CR]qemu\f[R]) via SSH. +Make sure to run \f[CR]mkosi ssh\f[R] with the same config as +\f[CR]mkosi build\f[R] so that it has the necessary information +available to connect to the running virtual machine via SSH. +Specifically, the SSH private key from the \f[CR]SshKey=\f[R] setting is +used to connect to the virtual machine. +Use \f[CR]mkosi genkey\f[R] to automatically generate a key and +certificate that will be picked up by mkosi. +Any arguments passed after the \f[CR]ssh\f[R] verb are passed as +arguments to the \f[CR]ssh\f[R] invocation. +To connect to a container, use \f[CR]machinectl login\f[R] or +\f[CR]machinectl shell\f[R]. +.TP +\f[CR]journalctl\f[R] +Uses \f[CR]journalctl\f[R] to inspect the journal inside the image. +Any arguments specified after the \f[CR]journalctl\f[R] verb are +appended to the \f[CR]journalctl\f[R] invocation. +.TP +\f[CR]coredumpctl\f[R] +Uses \f[CR]coredumpctl\f[R] to look for coredumps inside the image. +Any arguments specified after the \f[CR]coredumpctl\f[R] verb are +appended to the \f[CR]coredumpctl\f[R] invocation. +.TP +\f[CR]clean\f[R] +Remove build artifacts generated on a previous build. +If combined with \f[CR]\-f\f[R], also removes incremental build cache +images. +If \f[CR]\-f\f[R] is specified twice, also removes any package cache. +.TP +\f[CR]serve\f[R] +This builds the image if it is not built yet, and then serves the output +directory (i.e.\ usually \f[CR]mkosi.output/\f[R], see below) via a +small embedded HTTP server, listening on port 8081. +Combine with \f[CR]\-f\f[R] in order to rebuild the image +unconditionally before serving it. +This command is useful for testing network based acquisition of OS +images, for example via \f[CR]machinectl pull\-raw \&...\f[R] and +\f[CR]machinectl pull\-tar \&...\f[R]. +.TP +\f[CR]burn <device>\f[R] +This builds the image if it is not built yet, and then writes it to the +specified block device. +The partition contents are written as\-is, but the GPT partition table +is corrected to match sector and disk size of the specified medium. +.TP +\f[CR]bump\f[R] +Bumps the image version from \f[CR]mkosi.version\f[R] and writes the +resulting version string to \f[CR]mkosi.version\f[R]. +This is useful for implementing a simple versioning scheme: each time +this verb is called the version is bumped in preparation for the +subsequent build. +Note that \f[CR]\-\-auto\-bump\f[R]/\f[CR]\-B\f[R] may be used to +automatically bump the version after each successful build. +.TP +\f[CR]genkey\f[R] +Generate a pair of SecureBoot keys for usage with the +\f[CR]SecureBootKey=\f[R]/\f[CR]\-\-secure\-boot\-key=\f[R] and +\f[CR]SecureBootCertificate=\f[R]/\f[CR]\-\-secure\-boot\-certificate=\f[R] +options. +.TP +\f[CR]documentation\f[R] +Show mkosi\[cq]s documentation. +By default this verb will try several ways to output the documentation, +but a specific option can be chosen with the \f[CR]\-\-doc\-format\f[R] +option. +Distro packagers are encouraged to add a file \f[CR]mkosi.1\f[R] into +the \f[CR]mkosi/resources\f[R] directory of the Python package, if it is +missing, as well as to install it in the appropriate search path for man +pages. +The man page can be generated from the markdown file +\f[CR]mkosi/resources/mkosi.md\f[R] e.g via +\f[CR]pandoc \-t man \-s \-o mkosi.1 mkosi.md\f[R]. +.TP +\f[CR]help\f[R] +This verb is equivalent to the \f[CR]\-\-help\f[R] switch documented +below: it shows a brief usage explanation. +.SS Commandline\-only Options +Those settings cannot be configured in the configuration files. +.TP +\f[CR]\-\-force\f[R], \f[CR]\-f\f[R] +Replace the output file if it already exists, when building an image. +By default when building an image and an output artifact already exists +\f[CR]mkosi\f[R] will refuse operation. +Specify this option once to delete all build artifacts from a previous +run before re\-building the image. +If incremental builds are enabled, specifying this option twice will +ensure the intermediary cache files are removed, too, before the +re\-build is initiated. +If a package cache is used (also see the \f[B]Files\f[R] section below), +specifying this option thrice will ensure the package cache is removed +too, before the re\-build is initiated. +For the \f[CR]clean\f[R] operation this option has a slightly different +effect: by default the verb will only remove build artifacts from a +previous run, when specified once the incremental cache files are +deleted too, and when specified twice the package cache is also removed. +.TP +\f[CR]\-\-directory=\f[R], \f[CR]\-C\f[R] +Takes a path to a directory. +\f[CR]mkosi\f[R] switches to this directory before doing anything. +Note that the various configuration files are searched for in this +directory, hence using this option is an effective way to build a +project located in a specific directory. +.TP +\f[CR]\-\-debug=\f[R] +Enable additional debugging output. +.TP +\f[CR]\-\-debug\-shell=\f[R] +When executing a command in the image fails, mkosi will start an +interactive shell in the image allowing further debugging. +.TP +\f[CR]\-\-debug\-workspace=\f[R] +When an error occurs, the workspace directory will not be deleted. +.TP +\f[CR]\-\-version\f[R] +Show package version. +.TP +\f[CR]\-\-help\f[R], \f[CR]\-h\f[R] +Show brief usage information. +.TP +\f[CR]\-\-genkey\-common\-name=\f[R] +Common name to be used when generating keys via mkosi\[cq]s +\f[CR]genkey\f[R] command. +Defaults to \f[CR]mkosi of %u\f[R], where \f[CR]%u\f[R] expands to the +username of the user invoking mkosi. +.TP +\f[CR]\-\-genkey\-valid\-days=\f[R] +Number of days that the keys should remain valid when generating keys +via mkosi\[cq]s \f[CR]genkey\f[R] command. +Defaults to two years (730 days). +.TP +\f[CR]\-\-auto\-bump=\f[R], \f[CR]\-B\f[R] +If specified, after each successful build the the version is bumped in a +fashion equivalent to the \f[CR]bump\f[R] verb, in preparation for the +next build. +This is useful for simple, linear version management: each build in a +series will have a version number one higher then the previous one. +.TP +\f[CR]\-\-doc\-format\f[R] +The format to show the documentation in. +Supports the values \f[CR]markdown\f[R], \f[CR]man\f[R], +\f[CR]pandoc\f[R], \f[CR]system\f[R] and \f[CR]auto\f[R]. +In the case of \f[CR]markdown\f[R] the documentation is shown in the +original Markdown format. +\f[CR]man\f[R] shows the documentation in man page format, if it is +available. +\f[CR]pandoc\f[R] will generate the man page format on the fly, if +\f[CR]pandoc\f[R] is available. +\f[CR]system\f[R] will show the system\-wide man page for mkosi, which +may or may not correspond to the version you are using, depending on how +you installed mkosi. +\f[CR]auto\f[R], which is the default, will try all methods in the order +\f[CR]man\f[R], \f[CR]pandoc\f[R], \f[CR]markdown\f[R], +\f[CR]system\f[R]. +.TP +\f[CR]\-\-json\f[R] +Show the summary output as JSON\-SEQ. +.SS Supported output formats +The following output formats are supported: +.IP \[bu] 2 +Raw \f[I]GPT\f[R] disk image, created using systemd\-repart +(\f[I]disk\f[R]) +.IP \[bu] 2 +Plain directory, containing the OS tree (\f[I]directory\f[R]) +.IP \[bu] 2 +Tar archive (\f[I]tar\f[R]) +.IP \[bu] 2 +CPIO archive (\f[I]cpio\f[R]) +.PP +The output format may also be set to \f[I]none\f[R] to have mkosi +produce no image at all. +This can be useful if you only want to use the image to produce another +output in the build scripts (e.g.\ build an rpm). +.PP +When a \f[I]GPT\f[R] disk image is created, repart partition definition +files may be placed in \f[CR]mkosi.repart/\f[R] to configure the +generated disk image. +.PP +It is highly recommended to run \f[CR]mkosi\f[R] on a file system that +supports reflinks such as XFS and btrfs and to keep all related +directories on the same file system. +This allows mkosi to create images very quickly by using reflinks to +perform copying via copy\-on\-write operations. +.SS Configuration Settings +The following settings can be set through configuration files (the +syntax with \f[CR]SomeSetting=value\f[R]) and on the command line (the +syntax with \f[CR]\-\-some\-setting=value\f[R]). +For some command line parameters, a single\-letter shortcut is also +allowed. +In the configuration files, the setting must be in the appropriate +section, so the settings are grouped by section below. +.PP +Configuration is parsed in the following order: +.IP \[bu] 2 +The command line arguments are parsed +.IP \[bu] 2 +\f[CR]mkosi.local.conf\f[R] is parsed if it exists. +This file should be in the gitignore (or equivalent) and is intended for +local configuration. +.IP \[bu] 2 +Any default paths (depending on the option) are configured if the +corresponding path exists. +.IP \[bu] 2 +\f[CR]mkosi.conf\f[R] is parsed if it exists in the directory configured +with \f[CR]\-\-directory=\f[R] or the current working directory if +\f[CR]\-\-directory=\f[R] is not used. +.IP \[bu] 2 +\f[CR]mkosi.conf.d/\f[R] is parsed in the same directory if it exists. +Each directory and each file with the \f[CR].conf\f[R] extension in +\f[CR]mkosi.conf.d/\f[R] is parsed. +Any directory in \f[CR]mkosi.conf.d\f[R] is parsed as if it were a +regular top level directory. +.PP +Note that if the same setting is configured twice, the later assignment +overrides the earlier assignment unless the setting is a list based +setting. +Also note that before v16, we used to do the opposite, where the earlier +assignment would be used instead of later assignments. +.PP +Settings that take a list of values are merged by appending the new +values to the previously configured values. +Assigning the empty string to such a setting removes all previously +assigned values, and overrides any configured default values as well. +.PP +If a setting\[cq]s name in the configuration file is prefixed with +\f[CR]\[at]\f[R], it configures the default value used for that setting +if no explicit default value is set. +This can be used to set custom default values in configuration files +that can still be overridden by specifying the setting explicitly via +the CLI. +.PP +To conditionally include configuration files, the \f[CR][Match]\f[R] +section can be used. +Matches can use a pipe symbol (\f[CR]|\f[R]) after the equals sign +(\f[CR]\&...=|\&...\f[R]), which causes the match to become a triggering +match. +The config file will be included if the logical AND of all +non\-triggering matches and the logical OR of all triggering matches is +satisfied. +To negate the result of a match, prefix the argument with an exclamation +mark. +If an argument is prefixed with the pipe symbol and an exclamation mark, +the pipe symbol must be passed first, and the exclamation second. +.PP +Note that \f[CR][Match]\f[R] settings match against the current values +of specific settings, and do not take into account changes made to the +setting in configuration files that have not been parsed yet. +Also note that matching against a setting and then changing its value +afterwards in a different config file may lead to unexpected results. +.PP +The \f[CR][Match]\f[R] section of a \f[CR]mkosi.conf\f[R] file in a +directory applies to the entire directory. +If the conditions are not satisfied, the entire directory is skipped. +The \f[CR][Match]\f[R] sections of files in \f[CR]mkosi.conf.d/\f[R] and +\f[CR]mkosi.local.conf\f[R] only apply to the file itself. +.PP +If there are multiple \f[CR][Match]\f[R] sections in the same +configuration file, each of them has to be satisfied in order for the +configuration file to be included. +Specifically, triggering matches only apply to the current +\f[CR][Match]\f[R] section and are reset between multiple +\f[CR][Match]\f[R] sections. +As an example, the following will only match if the output format is one +of \f[CR]disk\f[R] or \f[CR]directory\f[R] and the architecture is one +of \f[CR]x86\-64\f[R] or \f[CR]arm64\f[R]: +.IP +.EX +[Match] +Format=|disk +Format=|directory + +[Match] +Architecture=|x86\-64 +Architecture=|arm64 +.EE +.PP +Command line options that take no argument are shown without +\f[CR]=\f[R] in their long version. +In the config files, they should be specified with a boolean argument: +either \f[CR]1\f[R], \f[CR]yes\f[R], or \f[CR]true\f[R] to enable, or +\f[CR]0\f[R], \f[CR]no\f[R], \f[CR]false\f[R] to disable. +.SS [Match] Section. +.TP +\f[CR]Profile=\f[R] +Matches against the configured profile. +.TP +\f[CR]Distribution=\f[R] +Matches against the configured distribution. +.TP +\f[CR]Release=\f[R] +Matches against the configured distribution release. +If this condition is used and no distribution has been explicitly +configured yet, the host distribution and release are used. +.TP +\f[CR]Architecture=\f[R] +Matches against the configured architecture. +If this condition is used and no architecture has been explicitly +configured yet, the host architecture is used. +.TP +\f[CR]PathExists=\f[R] +This condition is satisfied if the given path exists. +Relative paths are interpreted relative to the parent directory of the +config file that the condition is read from. +.TP +\f[CR]ImageId=\f[R] +Matches against the configured image ID, supporting globs. +If this condition is used and no image ID has been explicitly configured +yet, this condition fails. +.TP +\f[CR]ImageVersion=\f[R] +Matches against the configured image version. +Image versions can be prepended by the operators \f[CR]==\f[R], +\f[CR]!=\f[R], \f[CR]>=\f[R], \f[CR]<=\f[R], \f[CR]<\f[R], \f[CR]>\f[R] +for rich version comparisons according to the UAPI group version format +specification. +If no operator is prepended, the equality operator is assumed by +default. +If this condition is used and no image version has been explicitly +configured yet, this condition fails. +.TP +\f[CR]Bootable=\f[R] +Matches against the configured value for the \f[CR]Bootable=\f[R] +feature. +Takes a boolean value or \f[CR]auto\f[R]. +.TP +\f[CR]Format=\f[R] +Matches against the configured value for the \f[CR]Format=\f[R] option. +Takes an output format (see the \f[CR]Format=\f[R] option). +.TP +\f[CR]SystemdVersion=\f[R] +Matches against the systemd version on the host (as reported by +\f[CR]systemctl \-\-version\f[R]). +Values can be prepended by the operators \f[CR]==\f[R], \f[CR]!=\f[R], +\f[CR]>=\f[R], \f[CR]<=\f[R], \f[CR]<\f[R], \f[CR]>\f[R] for rich +version comparisons according to the UAPI group version format +specification. +If no operator is prepended, the equality operator is assumed by +default. +.TP +\f[CR]BuildSources=\f[R] +Takes a build source target path (see \f[CR]BuildSources=\f[R]). +This match is satisfied if any of the configured build sources uses this +target path. +For example, if we have a \f[CR]mkosi.conf\f[R] file containing: +.IP +.EX +[Content] +BuildSources=../abc/qed:kernel +.EE +.PP +and a drop\-in containing: +.IP +.EX +[Match] +BuildSources=kernel +.EE +.TP +The drop\-in will be included. +Any absolute paths passed to this setting are interpreted relative to +the current working directory. +.TP +\f[CR]HostArchitecture=\f[R] +Matches against the host\[cq]s native architecture. +See the \f[CR]Architecture=\f[R] setting for a list of possible values. +.PP +.TS +tab(@); +lw(20.7n) lw(6.9n) lw(17.7n) lw(24.6n). +T{ +Matcher +T}@T{ +Globs +T}@T{ +Rich Comparisons +T}@T{ +Default +T} +_ +T{ +\f[CR]Profile=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match fails +T} +T{ +\f[CR]Distribution=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match host distribution +T} +T{ +\f[CR]Release=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match host release +T} +T{ +\f[CR]Architecture=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match host architecture +T} +T{ +\f[CR]PathExists=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +n/a +T} +T{ +\f[CR]ImageId=\f[R] +T}@T{ +yes +T}@T{ +no +T}@T{ +match fails +T} +T{ +\f[CR]ImageVersion=\f[R] +T}@T{ +no +T}@T{ +yes +T}@T{ +match fails +T} +T{ +\f[CR]Bootable=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match auto feature +T} +T{ +\f[CR]Format=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match default format +T} +T{ +\f[CR]SystemdVersion=\f[R] +T}@T{ +no +T}@T{ +yes +T}@T{ +n/a +T} +T{ +\f[CR]BuildSources=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +match fails +T} +T{ +\f[CR]HostArchitecture=\f[R] +T}@T{ +no +T}@T{ +no +T}@T{ +n/a +T} +.TE +.SS [Config] Section +.TP +\f[CR]Profile=\f[R], \f[CR]\-\-profile=\f[R] +Select the given profile. +A profile is a configuration file or directory in the +\f[CR]mkosi.profiles/\f[R] directory. +When selected, this configuration file or directory is included after +parsing the \f[CR]mkosi.conf\f[R] file, but before any +\f[CR]mkosi.conf.d/*.conf\f[R] drop in configuration. +.TP +\f[CR]Include=\f[R], \f[CR]\-\-include=\f[R] +Include extra configuration from the given file or directory. +The extra configuration is included immediately after parsing the +setting, except when a default is set using \f[CR]\[at]Include=\f[R], in +which case the configuration is included after parsing all the other +configuration files. +Note that each path containing extra configuration is only parsed once, +even if included more than once with \f[CR]Include=\f[R]. +.TP +\f[CR]InitrdInclude=\f[R], \f[CR]\-\-initrd\-include=\f[R] +Same as \f[CR]Include=\f[R], but the extra configuration files or +directories are included when building the default initrd. +.TP +\f[CR]Images=\f[R], \f[CR]\-\-image=\f[R] +If specified, only build the given image. +Can be specified multiple times to build multiple images. +All the given images and their dependencies are built. +If not specified, all images are built. +See the \f[B]Building multiple images\f[R] section for more information. +Note that this section only takes effect when specified in the global +configuration files. +It has no effect if specified as an image specific setting. +.TP +\f[CR]Dependencies=\f[R], \f[CR]\-\-dependency=\f[R] +The images that this image depends on specified as a comma\-separated +list. +All images configured in this option will be built before this image and +will be pulled in as dependencies of this image when \f[CR]Images=\f[R] +is used. +.TP +\f[CR]MinimumVersion=\f[R], \f[CR]\-\-minimum\-version=\f[R] +The minimum mkosi version required to build this configuration. +If specified multiple times, the highest specified version is used. +.SS [Distribution] Section +.TP +\f[CR]Distribution=\f[R], \f[CR]\-\-distribution=\f[R], \f[CR]\-d\f[R] +The distribution to install in the image. +Takes one of the following arguments: \f[CR]fedora\f[R], +\f[CR]debian\f[R], \f[CR]ubuntu\f[R], \f[CR]arch\f[R], +\f[CR]opensuse\f[R], \f[CR]mageia\f[R], \f[CR]centos\f[R], +\f[CR]rhel\f[R], \f[CR]rhel\-ubi\f[R], \f[CR]openmandriva\f[R], +\f[CR]rocky\f[R], \f[CR]alma\f[R], \f[CR]custom\f[R]. +If not specified, defaults to the distribution of the host or +\f[CR]custom\f[R] if the distribution of the host is not a supported +distribution. +.TP +\f[CR]Release=\f[R], \f[CR]\-\-release=\f[R], \f[CR]\-r\f[R] +The release of the distribution to install in the image. +The precise syntax of the argument this takes depends on the +distribution used, and is either a numeric string (in case of Fedora +Linux, CentOS, \&..., e.g.\ \f[CR]29\f[R]), or a distribution version +name (in case of Debian, Ubuntu, \&..., e.g.\ \f[CR]artful\f[R]). +Defaults to a recent version of the chosen distribution, or the version +of the distribution running on the host if it matches the configured +distribution. +.TP +\f[CR]Architecture=\f[R], \f[CR]\-\-architecture=\f[R] +The architecture to build the image for. +The architectures that are actually supported depends on the +distribution used and whether a bootable image is requested or not. +When building for a foreign architecture, you\[cq]ll also need to +install and register a user mode emulator for that architecture. +One of the following architectures can be specified per image built: +\f[CR]alpha\f[R], \f[CR]arc\f[R], \f[CR]arm\f[R], \f[CR]arm64\f[R], +\f[CR]ia64\f[R], \f[CR]loongarch64\f[R], \f[CR]mips64\-le\f[R], +\f[CR]mips\-le\f[R], \f[CR]parisc\f[R], \f[CR]ppc\f[R], +\f[CR]ppc64\f[R], \f[CR]ppc64\-le\f[R], \f[CR]riscv32\f[R], +\f[CR]riscv64\f[R], \f[CR]s390\f[R], \f[CR]s390x\f[R], +\f[CR]tilegx\f[R], \f[CR]x86\f[R], \f[CR]x86\-64\f[R]. +.TP +\f[CR]Mirror=\f[R], \f[CR]\-\-mirror=\f[R], \f[CR]\-m\f[R] +The mirror to use for downloading the distribution packages. +Expects a mirror URL as argument. +If not provided, the default mirror for the distribution is used. +The default mirrors for each distribution are as follows (unless +specified, the same mirror is used for all architectures): +.PP +.TS +tab(@); +lw(13.5n) lw(29.5n) lw(27.0n). +T{ +T}@T{ +x86\-64 +T}@T{ +aarch64 +T} +_ +T{ +\f[CR]debian\f[R] +T}@T{ +http://deb.debian.org/debian +T}@T{ +T} +T{ +\f[CR]arch\f[R] +T}@T{ +https://geo.mirror.pkgbuild.com +T}@T{ +http://mirror.archlinuxarm.org +T} +T{ +\f[CR]opensuse\f[R] +T}@T{ +http://download.opensuse.org +T}@T{ +T} +T{ +\f[CR]ubuntu\f[R] +T}@T{ +http://archive.ubuntu.com +T}@T{ +http://ports.ubuntu.com +T} +T{ +\f[CR]centos\f[R] +T}@T{ +https://mirrors.centos.org +T}@T{ +T} +T{ +\f[CR]rocky\f[R] +T}@T{ +https://mirrors.rockylinux.org +T}@T{ +T} +T{ +\f[CR]alma\f[R] +T}@T{ +https://mirrors.almalinux.org +T}@T{ +T} +T{ +\f[CR]fedora\f[R] +T}@T{ +https://mirrors.fedoraproject.org +T}@T{ +T} +T{ +\f[CR]rhel\-ubi\f[R] +T}@T{ +https://cdn\-ubi.redhat.com +T}@T{ +T} +T{ +\f[CR]mageia\f[R] +T}@T{ +https://www.mageia.org +T}@T{ +T} +T{ +\f[CR]openmandriva\f[R] +T}@T{ +http://mirrors.openmandriva.org +T}@T{ +T} +.TE +.TP +\f[CR]LocalMirror=\f[R], \f[CR]\-\-local\-mirror=\f[R] +The mirror will be used as a local, plain and direct mirror instead of +using it as a prefix for the full set of repositories normally supported +by distributions. +Useful for fully offline builds with a single repository. +Supported on deb/rpm/arch based distributions. +Overrides \f[CR]\-\-mirror=\f[R] but only for the local mkosi build, it +will not be configured inside the final image, \f[CR]\-\-mirror=\f[R] +(or the default repository) will be configured inside the final image +instead. +.TP +\f[CR]RepositoryKeyCheck=\f[R], \f[CR]\-\-repository\-key\-check=\f[R] +Controls signature/key checks when using repositories, enabled by +default. +Useful to disable checks when combined with +\f[CR]\-\-local\-mirror=\f[R] and using only a repository from a local +filesystem. +Not used for DNF\-based distros yet. +.TP +\f[CR]Repositories=\f[R], \f[CR]\-\-repositories=\f[R] +Enable package repositories that are disabled by default. +This can be used to enable the EPEL repos for CentOS or different +components of the Debian/Ubuntu repositories. +.TP +\f[CR]CacheOnly=\f[R], \f[CR]\-\-cache\-only=\f[R] +If specified, the package manager is instructed not to contact the +network for updating package data. +This provides a minimal level of reproducibility, as long as the package +cache is already fully populated. +.TP +\f[CR]PackageManagerTrees=\f[R], \f[CR]\-\-package\-manager\-tree=\f[R] +This option mirrors the above \f[CR]SkeletonTrees=\f[R] option and +defaults to the same value if not configured otherwise, but installs the +files to a subdirectory of the workspace directory instead of the OS +tree. +This subdirectory of the workspace is used to configure the package +manager. +\f[CR]mkosi\f[R] will look for the package manager configuration and +related files in the configured package manager trees. +Unless specified otherwise, it will use the configuration files from +their canonical locations in \f[CR]/usr\f[R] or \f[CR]/etc\f[R] in the +package manager trees. +For example, it will look for \f[CR]etc/dnf/dnf.conf\f[R] in the package +manager trees if \f[CR]dnf\f[R] is used to install packages. +\f[CR]SkeletonTrees=\f[R] and \f[CR]PackageManagerTrees=\f[R] fulfill +similar roles. +Use \f[CR]SkeletonTrees=\f[R] if you want the files to be present in the +final image. +Use \f[CR]PackageManagerTrees=\f[R] if you don\[cq]t want the files to +be present in the final image, e.g.\ when building an initrd or if you +want to refer to paths outside of the image in your repository +configuration. +.SS [Output] Section +.TP +\f[CR]Format=\f[R], \f[CR]\-\-format=\f[R], \f[CR]\-t\f[R] +The image format type to generate. +One of \f[CR]directory\f[R] (for generating an OS image directly in a +local directory), \f[CR]tar\f[R] (similar, but a tarball of the OS image +is generated), \f[CR]cpio\f[R] (similar, but a cpio archive is +generated), \f[CR]disk\f[R] (a block device OS image with a GPT +partition table), \f[CR]uki\f[R] (a unified kernel image with the OS +image in the \f[CR].initrd\f[R] PE section), \f[CR]esp\f[R] +(\f[CR]uki\f[R] but wrapped in a disk image with only an ESP partition), +\f[CR]sysext\f[R], \f[CR]confext\f[R], \f[CR]portable\f[R] or +\f[CR]none\f[R] (the OS image is solely intended as a build image to +produce another artifact). +If the \f[CR]disk\f[R] output format is used, the disk image is +generated using \f[CR]systemd\-repart\f[R]. +The repart partition definition files to use can be configured using the +\f[CR]RepartDirectories=\f[R] setting or via \f[CR]mkosi.repart/\f[R]. +When verity partitions are configured using systemd\-repart\[cq]s +\f[CR]Verity=\f[R] setting, mkosi will automatically parse the verity +hash partition\[cq]s roothash from systemd\-repart\[cq]s JSON output and +include it in the kernel command line of every unified kernel image +built by mkosi. +.TP +\f[CR]ManifestFormat=\f[R], \f[CR]\-\-manifest\-format=\f[R] +The manifest format type or types to generate. +A comma\-delimited list consisting of \f[CR]json\f[R] (the standard JSON +output format that describes the packages installed), +\f[CR]changelog\f[R] (a human\-readable text format designed for +diffing). +By default no manifest is generated. +.TP +\f[CR]Output=\f[R], \f[CR]\-\-output=\f[R], \f[CR]\-o\f[R] +Name to use for the generated output image file or directory. +All outputs will be prefixed with the given name. +Defaults to \f[CR]image\f[R] or, if \f[CR]ImageId=\f[R] is specified, it +is used as the default output name, optionally suffixed with the version +set with \f[CR]ImageVersion=\f[R]. +Note that this option does not allow configuring the output directory, +use \f[CR]OutputDirectory=\f[R] for that. +Note that this only specifies the output prefix, depending on the +specific output format, compression and image version used, the full +output name might be \f[CR]image_7.8.raw.xz\f[R]. +.TP +\f[CR]CompressOutput=\f[R], \f[CR]\-\-compress\-output=\f[R] +Configure compression for the resulting image or archive. +The argument can be either a boolean or a compression algorithm +(\f[CR]xz\f[R], \f[CR]zstd\f[R]). +\f[CR]zstd\f[R] compression is used by default, except CentOS and +derivatives up to version 8, which default to \f[CR]xz\f[R]. +Note that when applied to block device image types, compression means +the image cannot be started directly but needs to be decompressed first. +This also means that the \f[CR]shell\f[R], \f[CR]boot\f[R], +\f[CR]qemu\f[R] verbs are not available when this option is used. +Implied for \f[CR]tar\f[R], \f[CR]cpio\f[R], \f[CR]uki\f[R], and +\f[CR]esp\f[R]. +.TP +\f[CR]OutputDirectory=\f[R], \f[CR]\-\-output\-dir=\f[R], \f[CR]\-O\f[R] +Path to a directory where to place all generated artifacts. +If this is not specified and the directory \f[CR]mkosi.output/\f[R] +exists in the local directory, it is automatically used for this +purpose. +.TP +\f[CR]WorkspaceDirectory=\f[R], \f[CR]\-\-workspace\-dir=\f[R] +Path to a directory where to store data required temporarily while +building the image. +This directory should have enough space to store the full OS image, +though in most modes the actually used disk space is smaller. +If not specified, a subdirectory of \f[CR]$XDG_CACHE_HOME\f[R] (if set), +\f[CR]$HOME/.cache\f[R] (if set) or \f[CR]/var/tmp\f[R] is used. +The data in this directory is removed automatically after each build. +It\[cq]s safe to manually remove the contents of this directory should +an \f[CR]mkosi\f[R] invocation be aborted abnormally (for example, due +to reboot/power failure). +.TP +\f[CR]CacheDirectory=\f[R], \f[CR]\-\-cache\-dir=\f[R] +Takes a path to a directory to use as package cache for the distribution +package manager used. +If this option is not used, but a \f[CR]mkosi.cache/\f[R] directory is +found in the local directory it is automatically used for this purpose. +.TP +\f[CR]BuildDirectory=\f[R], \f[CR]\-\-build\-dir=\f[R] +Takes a path to a directory to use as the build directory for build +systems that support out\-of\-tree builds (such as Meson). +The directory used this way is shared between repeated builds, and +allows the build system to reuse artifacts (such as object files, +executable, \&...) +generated on previous invocations. +The build scripts can find the path to this directory in the +\f[CR]$BUILDDIR\f[R] environment variable. +This directory is mounted into the image\[cq]s root directory when +\f[CR]mkosi\-chroot\f[R] is invoked during execution of the build +scripts. +If this option is not specified, but a directory +\f[CR]mkosi.builddir/\f[R] exists in the local directory it is +automatically used for this purpose (also see the \f[B]Files\f[R] +section below). +.TP +\f[CR]ImageVersion=\f[R], \f[CR]\-\-image\-version=\f[R] +Configure the image version. +This accepts any string, but it is recommended to specify a series of +dot separated components. +The version may also be configured in a file \f[CR]mkosi.version\f[R] in +which case it may be conveniently managed via the \f[CR]bump\f[R] verb +or the \f[CR]\-\-auto\-bump\f[R] option. +When specified the image version is included in the default output file +name, i.e.\ instead of \f[CR]image.raw\f[R] the default will be +\f[CR]image_0.1.raw\f[R] for version \f[CR]0.1\f[R] of the image, and +similar. +The version is also passed via the \f[CR]$IMAGE_VERSION\f[R] to any +build scripts invoked (which may be useful to patch it into +\f[CR]/etc/os\-release\f[R] or similar, in particular the +\f[CR]IMAGE_VERSION=\f[R] field of it). +.TP +\f[CR]ImageId=\f[R], \f[CR]\-\-image\-id=\f[R] +Configure the image identifier. +This accepts a freeform string that shall be used to identify the image +with. +If set the default output file will be named after it (possibly suffixed +with the version). +The identifier is also passed via the \f[CR]$IMAGE_ID\f[R] to any build +scripts invoked. +The image ID is automatically added to \f[CR]/usr/lib/os\-release\f[R]. +.TP +\f[CR]SplitArtifacts=\f[R], \f[CR]\-\-split\-artifacts\f[R] +If specified and building a disk image, pass \f[CR]\-\-split=yes\f[R] to +systemd\-repart to have it write out split partition files for each +configured partition. +Read the \c +.UR +https://www.freedesktop.org/software/systemd/man/systemd-repart.html#--split=BOOL +man +.UE \c +\ page for more information. +This is useful in A/B update scenarios where an existing disk image +shall be augmented with a new version of a root or \f[CR]/usr\f[R] +partition along with its Verity partition and unified kernel. +.TP +\f[CR]RepartDirectories=\f[R], \f[CR]\-\-repart\-dir=\f[R] +Paths to directories containing systemd\-repart partition definition +files that are used when mkosi invokes systemd\-repart when building a +disk image. +If \f[CR]mkosi.repart/\f[R] exists in the local directory, it will be +used for this purpose as well. +Note that mkosi invokes repart with \f[CR]\-\-root=\f[R] set to the root +of the image root, so any \f[CR]CopyFiles=\f[R] source paths in +partition definition files will be relative to the image root directory. +.TP +\f[CR]SectorSize=\f[R], \f[CR]\-\-sector\-size=\f[R] +Override the default sector size that systemd\-repart uses when building +a disk image. +.TP +\f[CR]RepartOffline=\f[R], \f[CR]\-\-repart\-offline=\f[R] +Specifies whether to build disk images using loopback devices. +Enabled by default. +When enabled, \f[CR]systemd\-repart\f[R] will not use loopback devices +to build disk images. +When disabled, \f[CR]systemd\-repart\f[R] will always use loopback +devices to build disk images. +Note that when using \f[CR]RepartOffline=no\f[R] mkosi cannot run +unprivileged and the image build has to be done as the root user outside +of any containers and with loopback devices available on the host +system. +There are currently two known scenarios where +\f[CR]RepartOffline=no\f[R] has to be used. +The first is when using \f[CR]Subvolumes=\f[R] in a repart partition +definition file, as subvolumes cannot be created without using loopback +devices. +The second is when creating a system with SELinux and an XFS root +partition. +Because \f[CR]mkfs.xfs\f[R] does not support populating an XFS +filesystem with extended attributes, loopback devices have to be used to +ensure the SELinux extended attributes end up in the generated XFS +filesystem. +.TP +\f[CR]Overlay=\f[R], \f[CR]\-\-overlay\f[R] +When used together with \f[CR]BaseTrees=\f[R], the output will consist +only out of changes to the specified base trees. +Each base tree is attached as a lower layer in an overlayfs structure, +and the output becomes the upper layer, initially empty. +Thus files that are not modified compared to the base trees will not be +present in the final output. +This option may be used to create \c +.UR https://uapi-group.org/specifications/specs/extension_image +systemd \f[I]system extensions\f[R] or \f[I]portable services\f[R] +.UE \c +\&. +.TP +\f[CR]UseSubvolumes=\f[R], \f[CR]\-\-use\-subvolumes=\f[R] +Takes a boolean or \f[CR]auto\f[R]. +Enables or disables use of btrfs subvolumes for directory tree outputs. +If enabled, mkosi will create the root directory as a btrfs subvolume +and use btrfs subvolume snapshots where possible to copy base or cached +trees which is much faster than doing a recursive copy. +If explicitly enabled and \f[CR]btrfs\f[R] is not installed or +subvolumes cannot be created, an error is raised. +If \f[CR]auto\f[R], missing \f[CR]btrfs\f[R] or failures to create +subvolumes are ignored. +.TP +\f[CR]Seed=\f[R], \f[CR]\-\-seed=\f[R] +Takes a UUID as argument or the special value \f[CR]random\f[R]. +Overrides the seed that \c +.UR +https://www.freedesktop.org/software/systemd/man/systemd-repart.service.html +\f[CR]systemd\-repart(8)\f[R] +.UE \c +\ uses when building a disk image. +This is useful to achieve reproducible builds, where deterministic UUIDs +and other partition metadata should be derived on each build. +.TP +\f[CR]SourceDateEpoch=\f[R], \f[CR]\-\-source\-date\-epoch=\f[R] +Takes a timestamp as argument. +Resets file modification times of all files to this timestamp. +The variable is also propagated to systemd\-repart and scripts executed +by mkosi. +If not set explicitly, \f[CR]SOURCE_DATE_EPOCH\f[R] from +\f[CR]\-\-environment\f[R] and from the host environment are tried in +that order. +This is useful to make builds reproducible. +See \c +.UR https://reproducible-builds.org/specs/source-date-epoch/ +SOURCE_DATE_EPOCH +.UE \c +\ for more information. +.SS [Content] Section +.TP +\f[CR]Packages=\f[R], \f[CR]\-\-package=\f[R], \f[CR]\-p\f[R] +Install the specified distribution packages (i.e.\ RPM, DEB, \&...) +in the image. +Takes a comma separated list of package specifications. +This option may be used multiple times in which case the specified +package lists are combined. +Use \f[CR]BuildPackages=\f[R] to specify packages that shall only be +installed in an overlay that is mounted when the prepare scripts are +executed with the \f[CR]build\f[R] argument and when the build scripts +are executed. +The types and syntax of \f[I]package specifications\f[R] that are +allowed depend on the package installer (e.g.\ \f[CR]dnf\f[R] for +\f[CR]rpm\f[R]\-based distros or \f[CR]apt\f[R] for +\f[CR]deb\f[R]\-based distros), but may include package names, package +names with version and/or architecture, package name globs, paths to +packages in the file system, package groups, and virtual provides, +including file paths. +Example: when using a distro that uses \f[CR]dnf\f[R], the following +configuration would install the \f[CR]meson\f[R] package (in the latest +version), the 32\-bit version of the \f[CR]libfdisk\-devel\f[R] package, +all available packages that start with the \f[CR]git\-\f[R] prefix, a +\f[CR]systemd\f[R] rpm from the local file system, one of the packages +that provides \f[CR]/usr/bin/ld\f[R], the packages in the +\f[I]Development Tools\f[R] group, and the package that contains the +\f[CR]mypy\f[R] python module. +.IP +.EX +Packages=meson + libfdisk\-devel.i686 + git\-* + prebuilt/rpms/systemd\-249\-rc1.local.rpm + /usr/bin/ld + \[at]development\-tools + python3dist(mypy) +.EE +.PP +: Note that since mkosi runs in a sandbox with most of the host files +unavailable, any local packages have to be mounted into the sandbox +explicitly using \f[CR]BuildSources=\f[R]. +For example, let\[cq]s say we have a local package located at +\f[CR]../my\-packages/abc.rpm\f[R] relative to the mkosi working +directory, then we\[cq]d be able to install it as follows: +.IP +.EX +BuildSources=../my\-packages:my\-packages\-in\-sandbox +Packages=my\-packages\-in\-sandbox/abc.rpm +.EE +.TP +\f[CR]BuildPackages=\f[R], \f[CR]\-\-build\-package=\f[R] +Similar to \f[CR]Packages=\f[R], but configures packages to install only +in an overlay that is made available on top of the image to the prepare +scripts when executed with the \f[CR]build\f[R] argument and the build +scripts. +This option should be used to list packages containing header files, +compilers, build systems, linkers and other build tools the +\f[CR]mkosi.build\f[R] scripts require to operate. +Note that packages listed here will be absent in the final image. +.TP +\f[CR]PackageDirectories=\f[R], \f[CR]\-\-package\-directory=\f[R] +Specify directories containing extra packages to be made available +during the build. +\f[CR]mkosi\f[R] will create a local repository containing all packages +in these directories and make it available when installing packages or +running scripts. +Note that this local repository is also made available when running +scripts. +Build scripts can add more packages to the local repository by placing +the built packages in \f[CR]$PACKAGEDIR\f[R]. +.TP +\f[CR]WithRecommends=\f[R], \f[CR]\-\-with\-recommends=\f[R] +Configures whether to install recommended or weak dependencies, +depending on how they are named by the used package manager, or not. +By default, recommended packages are not installed. +This is only used for package managers that support the concept, which +are currently apt, dnf and zypper. +.TP +\f[CR]WithDocs=\f[R], \f[CR]\-\-with\-docs\f[R] +Include documentation in the image. +Enabled by default. +When disabled, if the underlying distribution package manager supports +it documentation is not included in the image. +The \f[CR]$WITH_DOCS\f[R] environment variable passed to the +\f[CR]mkosi.build\f[R] scripts is set to \f[CR]0\f[R] or \f[CR]1\f[R] +depending on whether this option is enabled or disabled. +.TP +\f[CR]BaseTrees=\f[R], \f[CR]\-\-base\-tree=\f[R] +Takes a comma separated list of paths to use as base trees. +When used, these base trees are each copied into the OS tree and form +the base distribution instead of installing the distribution from +scratch. +Only extra packages are installed on top of the ones already installed +in the base trees. +Note that for this to work properly, the base image still needs to +contain the package manager metadata (see +\f[CR]CleanPackageMetadata=\f[R]). +Instead of a directory, a tar file or a disk image may be provided. +In this case it is unpacked into the OS tree. +This mode of operation allows setting permissions and file ownership +explicitly, in particular for projects stored in a version control +system such as \f[CR]git\f[R] which retain full file ownership and +access mode metadata for committed files. +.TP +\f[CR]SkeletonTrees=\f[R], \f[CR]\-\-skeleton\-tree=\f[R] +Takes a comma separated list of colon separated path pairs. +The first path of each pair refers to a directory to copy into the OS +tree before invoking the package manager. +The second path of each pair refers to the target directory inside the +image. +If the second path is not provided, the directory is copied on top of +the root directory of the image. +The second path is always interpreted as an absolute path. +Use this to insert files and directories into the OS tree before the +package manager installs any packages. +If the \f[CR]mkosi.skeleton/\f[R] directory is found in the local +directory it is also used for this purpose with the root directory as +target (also see the \f[B]Files\f[R] section below). +Note that skeleton trees are cached and any changes to skeleton trees +after a cached image has been built (when using \f[CR]Incremental=\f[R]) +are only applied when the cached image is rebuilt (by using +\f[CR]\-ff\f[R] or running \f[CR]mkosi \-f clean\f[R]). +As with the base tree logic above, instead of a directory, a tar file +may be provided too. +\f[CR]mkosi.skeleton.tar\f[R] will be automatically used if found in the +local directory. +.TP +\f[CR]ExtraTrees=\f[R], \f[CR]\-\-extra\-tree=\f[R] +Takes a comma separated list of colon separated path pairs. +The first path of each pair refers to a directory to copy from the host +into the image. +The second path of each pair refers to the target directory inside the +image. +If the second path is not provided, the directory is copied on top of +the root directory of the image. +The second path is always interpreted as an absolute path. +Use this to override any default configuration files shipped with the +distribution. +If the \f[CR]mkosi.extra/\f[R] directory is found in the local directory +it is also used for this purpose with the root directory as target. +(also see the \f[B]Files\f[R] section below). +As with the base tree logic above, instead of a directory, a tar file +may be provided too. +\f[CR]mkosi.extra.tar\f[R] will be automatically used if found in the +local directory. +.TP +\f[CR]RemovePackages=\f[R], \f[CR]\-\-remove\-package=\f[R] +Takes a comma\-separated list of package specifications for removal, in +the same format as \f[CR]Packages=\f[R]. +The removal will be performed as one of the last steps. +This step is skipped if \f[CR]CleanPackageMetadata=no\f[R] is used. +.TP +\f[CR]RemoveFiles=\f[R], \f[CR]\-\-remove\-files=\f[R] +Takes a comma\-separated list of globs. +Files in the image matching the globs will be purged at the end. +.TP +\f[CR]CleanPackageMetadata=\f[R], \f[CR]\-\-clean\-package\-metadata=\f[R] +Enable/disable removal of package manager databases at the end of +installation. +Can be specified as \f[CR]true\f[R], \f[CR]false\f[R], or +\f[CR]auto\f[R] (the default). +With \f[CR]auto\f[R], files will be removed if the respective package +manager executable is \f[I]not\f[R] present at the end of the +installation. +.TP +\f[CR]PrepareScripts=\f[R], \f[CR]\-\-prepare\-script=\f[R] +Takes a comma\-separated list of paths to executables that are used as +the prepare scripts for this image. +See the \f[B]Scripts\f[R] section for more information. +.TP +\f[CR]BuildScripts=\f[R], \f[CR]\-\-build\-script=\f[R] +Takes a comma\-separated list of paths to executables that are used as +the build scripts for this image. +See the \f[B]Scripts\f[R] section for more information. +.TP +\f[CR]PostInstallationScripts=\f[R], \f[CR]\-\-postinst\-script=\f[R] +Takes a comma\-separated list of paths to executables that are used as +the post\-installation scripts for this image. +See the \f[B]Scripts\f[R] section for more information. +.TP +\f[CR]FinalizeScripts=\f[R], \f[CR]\-\-finalize\-script=\f[R] +Takes a comma\-separated list of paths to executables that are used as +the finalize scripts for this image. +See the \f[B]Scripts\f[R] section for more information. +.TP +\f[CR]BuildSources=\f[R], \f[CR]\-\-build\-sources=\f[R] +Takes a comma separated list of colon separated path pairs. +The first path of each pair refers to a directory to mount from the +host. +The second path of each pair refers to the directory where the source +directory should be mounted when running scripts. +Every target path is prefixed with \f[CR]/work/src\f[R] and all build +sources are sorted lexicographically by their target before mounting, so +that top level paths are mounted first. +If not configured explicitly, the current working directory is mounted +to \f[CR]/work/src\f[R]. +.TP +\f[CR]BuildSourcesEphemeral=\f[R], \f[CR]\-\-build\-sources\-ephemeral=\f[R] +Takes a boolean. +Disabled by default. +Configures whether changes to source directories (The working directory +and configured using \f[CR]BuildSources=\f[R]) are persisted. +If enabled, all source directories will be reset to their original state +after scripts finish executing. +.TP +\f[CR]Environment=\f[R], \f[CR]\-\-environment=\f[R] +Adds variables to the environment that package managers and the +prepare/build/postinstall/finalize scripts are executed with. +Takes a space\-separated list of variable assignments or just variable +names. +In the latter case, the values of those variables will be passed through +from the environment in which \f[CR]mkosi\f[R] was invoked. +This option may be specified more than once, in which case all listed +variables will be set. +If the same variable is set twice, the later setting overrides the +earlier one. +.TP +\f[CR]EnvironmentFiles=\f[R], \f[CR]\-\-env\-file=\f[R] +Takes a comma\-separated list of paths to files that contain environment +variable definitions to be added to the scripting environment. +Uses \f[CR]mkosi.env\f[R] if it is found in the local directory. +The variables are first read from \f[CR]mkosi.env\f[R] if it exists, +then from the given list of files and then from the +\f[CR]Environment=\f[R] settings. +.TP +\f[CR]WithTests=\f[R], \f[CR]\-\-without\-tests\f[R], \f[CR]\-T\f[R] +If set to false (or when the command\-line option is used), the +\f[CR]$WITH_TESTS\f[R] environment variable is set to \f[CR]0\f[R] when +the \f[CR]mkosi.build\f[R] scripts are invoked. +This is supposed to be used by the build scripts to bypass any unit or +integration tests that are normally run during the source build process. +Note that this option has no effect unless the \f[CR]mkosi.build\f[R] +build scripts honor it. +.TP +\f[CR]WithNetwork=\f[R], \f[CR]\-\-with\-network=\f[R] +When true, enables network connectivity while the build scripts +\f[CR]mkosi.build\f[R] are invoked. +By default, the build scripts run with networking turned off. +The \f[CR]$WITH_NETWORK\f[R] environment variable is passed to the +\f[CR]mkosi.build\f[R] build scripts indicating whether the build is +done with or without network. +.TP +\f[CR]Bootable=\f[R], \f[CR]\-\-bootable=\f[R] +Takes a boolean or \f[CR]auto\f[R]. +Enables or disables generation of a bootable image. +If enabled, mkosi will install an EFI bootloader, and add an ESP +partition when the disk image output is used. +If the selected EFI bootloader (See \f[CR]Bootloader=\f[R]) is not +installed or no kernel images can be found, the build will fail. +\f[CR]auto\f[R] behaves as if the option was enabled, but the build +won\[cq]t fail if either no kernel images or the selected EFI bootloader +can\[cq]t be found. +If disabled, no bootloader will be installed even if found inside the +image, no unified kernel images will be generated and no ESP partition +will be added to the image if the disk output format is used. +.TP +\f[CR]Bootloader=\f[R], \f[CR]\-\-bootloader=\f[R] +Takes one of \f[CR]none\f[R], \f[CR]systemd\-boot\f[R], \f[CR]uki\f[R] +or \f[CR]grub\f[R]. +Defaults to \f[CR]systemd\-boot\f[R]. +If set to \f[CR]none\f[R], no EFI bootloader will be installed into the +image. +If set to \f[CR]systemd\-boot\f[R], systemd\-boot will be installed and +for each installed kernel, a UKI will be generated and stored in +\f[CR]EFI/Linux\f[R] in the ESP. +If set to \f[CR]uki\f[R], a single UKI will be generated for the latest +installed kernel (the one with the highest version) which is installed +to \f[CR]EFI/BOOT/BOOTX64.EFI\f[R] in the ESP. +If set to \f[CR]grub\f[R], for each installed kernel, a UKI will be +generated and stored in \f[CR]EFI/Linux\f[R] in the ESP. +For each generated UKI, a menu entry is appended to the grub +configuration in \f[CR]grub/grub.cfg\f[R] in the ESP which chainloads +into the UKI. +A shim grub.cfg is also written to +\f[CR]EFI/<distribution>/grub.cfg\f[R] in the ESP which loads +\f[CR]grub/grub.cfg\f[R] in the ESP for compatibility with signed +versions of grub which load the grub configuration from this location. +Note that we do not yet install grub to the ESP when +\f[CR]Bootloader=\f[R] is set to \f[CR]grub\f[R]. +This has to be done manually in a postinst or finalize script. +The grub EFI binary should be installed to +\f[CR]/efi/EFI/BOOT/BOOTX64.EFI\f[R] (or similar depending on the +architecture) and should be configured to load its configuration from +\f[CR]EFI/<distribution>/grub.cfg\f[R] in the ESP. +Signed versions of grub shipped by distributions will load their +configuration from this location by default. +.TP +\f[CR]BiosBootloader=\f[R], \f[CR]\-\-bios\-bootloader=\f[R] +Takes one of \f[CR]none\f[R] or \f[CR]grub\f[R]. +Defaults to \f[CR]none\f[R]. +If set to \f[CR]none\f[R], no BIOS bootloader will be installed. +If set to \f[CR]grub\f[R], grub is installed as the BIOS boot loader if +a bootable image is requested with the \f[CR]Bootable=\f[R] option. +If no repart partition definition files are configured, mkosi will add a +grub BIOS boot partition and an EFI system partition to the default +partition definition files. +Note that this option is not mutually exclusive with +\f[CR]Bootloader=\f[R]. +It is possible to have an image that is both bootable on UEFI and BIOS +by configuring both \f[CR]Bootloader=\f[R] and +\f[CR]BiosBootloader=\f[R]. +The grub BIOS boot partition should have UUID +\f[CR]21686148\-6449\-6e6f\-744e\-656564454649\f[R] and should be at +least 1MB. +Even if no EFI bootloader is installed, we still need an ESP for BIOS +boot as that\[cq]s where we store the kernel, initrd and grub modules. +.TP +\f[CR]ShimBootloader=\f[R], \f[CR]\-\-shim\-bootloader=\f[R] +Takes one of \f[CR]none\f[R], \f[CR]unsigned\f[R], or \f[CR]signed\f[R]. +Defaults to \f[CR]none\f[R]. +If set to \f[CR]none\f[R], shim and MokManager will not be installed to +the ESP. +If set to \f[CR]unsigned\f[R], mkosi will search for unsigned shim and +MokManager EFI binaries and install them. +If \f[CR]SecureBoot=\f[R] is enabled, mkosi will sign the unsigned EFI +binaries before installing thel. +If set to \f[CR]signed\f[R], mkosi will search for signed EFI binaries +and install those. +Even if \f[CR]SecureBoot=\f[R] is enabled, mkosi won\[cq]t sign these +binaries again. +Note that this option only takes effect when an image that is bootable +on UEFI firmware is requested using other options (\f[CR]Bootable=\f[R], +\f[CR]Bootloader=\f[R]). +.TP +\f[CR]Initrds=\f[R], \f[CR]\-\-initrd\f[R] +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. +.TP +\f[CR]InitrdPackages=\f[R], \f[CR]\-\-initrd\-package=\f[R] +Extra packages to install into the default initrd. +Takes a comma separated list of package specifications. +This option may be used multiple times in which case the specified +package lists are combined. +.TP +\f[CR]KernelCommandLine=\f[R], \f[CR]\-\-kernel\-command\-line=\f[R] +Use the specified kernel command line when building images. +.TP +\f[CR]KernelModulesInclude=\f[R], \f[CR]\-\-kernel\-modules\-include=\f[R] +Takes a list of regex patterns that specify kernel modules to include in +the image. +Patterns should be relative to the +\f[CR]/usr/lib/modules/<kver>/kernel\f[R] directory. +mkosi checks for a match anywhere in the module path +(e.g.\ \f[CR]i915\f[R] will match against +\f[CR]drivers/gpu/drm/i915.ko\f[R]). +All modules that match any of the specified patterns are included in the +image. +All module and firmware dependencies of the matched modules are included +in the image as well. +This setting takes priority over \f[CR]KernelModulesExclude=\f[R] and +only makes sense when used in combination with it because all kernel +modules are included in the image by default. +.TP +\f[CR]KernelModulesExclude=\f[R], \f[CR]\-\-kernel\-modules\-exclude=\f[R] +Takes a list of regex patterns that specify modules to exclude from the +image. +Behaves the same as \f[CR]KernelModulesInclude=\f[R] except that all +modules that match any of the specified patterns are excluded from the +image. +.TP +\f[CR]KernelModulesIncludeHost=\f[R], \f[CR]\-\-kernel\-modules\-include\-host=\f[R] +Takes a boolean. +Specifies whether to include the currently loaded modules on the host +system in the image. +This setting takes priority over \f[CR]KernelModulesExclude=\f[R] and +only makes sense when used in combination with it because all kernel +modules are included in the image by default. +.TP +\f[CR]KernelModulesInitrd=\f[R], \f[CR]\-\-kernel\-modules\-initrd=\f[R] +Enable/Disable generation of the kernel modules initrd when building a +bootable image. +Enabled by default. +If enabled, when building a bootable image, for each kernel that we +assemble a unified kernel image for we generate an extra initrd +containing only the kernel modules for that kernel version and append it +to the prebuilt initrd. +This allows generating kernel independent initrds which are augmented +with the necessary kernel modules when the UKI is assembled. +.TP +\f[CR]KernelModulesInitrdInclude=\f[R], \f[CR]\-\-kernel\-modules\-initrd\-include=\f[R] +Like \f[CR]KernelModulesInclude=\f[R], but applies to the kernel modules +included in the kernel modules initrd. +.TP +\f[CR]KernelModulesInitrdExclude=\f[R], \f[CR]\-\-kernel\-modules\-initrd\-exclude=\f[R] +Like \f[CR]KernelModulesExclude=\f[R], but applies to the kernel modules +included in the kernel modules initrd. +.TP +\f[CR]KernelModulesInitrdIncludeHost=\f[R], \f[CR]\-\-kernel\-modules\-initrd\-include\-host=\f[R] +Like \f[CR]KernelModulesIncludeHost=\f[R], but applies to the kernel +modules included in the kernel modules initrd. +.TP +\f[CR]Locale=\f[R], \f[CR]\-\-locale=\f[R], \f[CR]LocaleMessages=\f[R], \f[CR]\-\-locale\-messages=\f[R], \f[CR]Keymap=\f[R], \f[CR]\-\-keymap=\f[R], \f[CR]Timezone=\f[R], \f[CR]\-\-timezone=\f[R], \f[CR]Hostname=\f[R], \f[CR]\-\-hostname=\f[R], \f[CR]RootShell=\f[R], \f[CR]\-\-root\-shell=\f[R] +The settings \f[CR]Locale=\f[R], \f[CR]\-\-locale=\f[R], +\f[CR]LocaleMessages=\f[R], \f[CR]\-\-locale\-messages=\f[R], +\f[CR]Keymap=\f[R], \f[CR]\-\-keymap=\f[R], \f[CR]Timezone=\f[R], +\f[CR]\-\-timezone=\f[R], \f[CR]Hostname=\f[R], +\f[CR]\-\-hostname=\f[R], \f[CR]RootShell=\f[R], +\f[CR]\-\-root\-shell=\f[R] correspond to the identically named +systemd\-firstboot options. +See the systemd firstboot \c +.UR +https://www.freedesktop.org/software/systemd/man/systemd-firstboot.html +manpage +.UE \c +\ for more information. +Additionally, where applicable, the corresponding systemd credentials +for these settings are written to \f[CR]/usr/lib/credstore\f[R], so that +they apply even if only \f[CR]/usr\f[R] is shipped in the image. +.TP +\f[CR]RootPassword=\f[R], \f[CR]\-\-root\-password=\f[R], +Set the system root password. +If this option is not used, but a \f[CR]mkosi.rootpw\f[R] file is found +in the local directory, the password is automatically read from it. +If the password starts with \f[CR]hashed:\f[R], it is treated as an +already hashed root password. +The root password is also stored in \f[CR]/usr/lib/credstore\f[R] under +the appropriate systemd credential so that it applies even if only +\f[CR]/usr\f[R] is shipped in the image. +To create an unlocked account without any password use +\f[CR]hashed:\f[R] without a hash. +.TP +\f[CR]Autologin=\f[R], \f[CR]\-\-autologin\f[R] +Enable autologin for the \f[CR]root\f[R] user on \f[CR]/dev/pts/0\f[R] +(nspawn), \f[CR]/dev/tty1\f[R] and \f[CR]/dev/ttyS0\f[R]. +.TP +\f[CR]MakeInitrd=\f[R], \f[CR]\-\-make\-initrd\f[R] +Add \f[CR]/etc/initrd\-release\f[R] and \f[CR]/init\f[R] to the image so +that it can be used as an initramfs. +.TP +\f[CR]Ssh=\f[R], \f[CR]\-\-ssh\f[R] +If specified, an sshd socket unit and matching service are installed in +the final image that expose SSH over VSock. +When building with this option and running the image using +\f[CR]mkosi qemu\f[R], the \f[CR]mkosi ssh\f[R] command can be used to +connect to the container/VM via SSH. +Note that you still have to make sure openssh is installed in the image +to make this option behave correctly. +Run \f[CR]mkosi genkey\f[R] to automatically generate an X509 +certificate and private key to be used by mkosi to enable SSH access to +any virtual machines via \f[CR]mkosi ssh\f[R]. +To access images booted using \f[CR]mkosi boot\f[R], use +\f[CR]machinectl\f[R]. +.TP +\f[CR]SELinuxRelabel=\f[R], \f[CR]\-\-selinux\-relabel=\f[R] +Specifies whether to relabel files to match the image\[cq]s SELinux +policy. +Takes a boolean value or \f[CR]auto\f[R]. +Defaults to \f[CR]auto\f[R]. +If disabled, files will not relabeled. +If enabled, an SELinux policy has to be installed in the image and +\f[CR]setfiles\f[R] has to be available to relabel files. +If any errors occur during \f[CR]setfiles\f[R], the build will fail. +If set to \f[CR]auto\f[R], files will be relabeled if an SELinux policy +is installed in the image and if \f[CR]setfiles\f[R] is available. +Any errors occurred during \f[CR]setfiles\f[R] will be ignored. +Note that when running unprivileged, \f[CR]setfiles\f[R] will fail to +set any labels that are not in the host\[cq]s SELinux policy. +To ensure \f[CR]setfiles\f[R] succeeds without errors, make sure to run +mkosi as root or build from a host system with the same SELinux policy +as the image you\[cq]re building. +.SS [Validation] Section +.TP +\f[CR]SecureBoot=\f[R], \f[CR]\-\-secure\-boot\f[R] +Sign systemd\-boot (if it is not signed yet) and any generated unified +kernel images for UEFI SecureBoot. +.TP +\f[CR]SecureBootAutoEnroll=\f[R], \f[CR]\-\-secure\-boot\-auto\-enroll=\f[R] +Set up automatic enrollment of the secure boot keys in virtual machines +as documented in the systemd\-boot \c +.UR https://www.freedesktop.org/software/systemd/man/systemd-boot.html +man page +.UE \c +\ if \f[CR]SecureBoot=\f[R] is used. +Note that systemd\-boot will only do automatic secure boot key +enrollment in virtual machines starting from systemd v253. +To do auto enrollment on systemd v252 or on bare metal machines, write a +systemd\-boot configuration file to \f[CR]/efi/loader/loader.conf\f[R] +using an extra tree with \f[CR]secure\-boot\-enroll force\f[R] or +\f[CR]secure\-boot\-enroll manual\f[R] in it. +Auto enrollment is not supported on systemd versions older than v252. +Defaults to \f[CR]yes\f[R]. +.TP +\f[CR]SecureBootKey=\f[R], \f[CR]\-\-secure\-boot\-key=\f[R] +Path to the PEM file containing the secret key for signing the UEFI +kernel image, if \f[CR]SecureBoot=\f[R] is used. +.TP +\f[CR]SecureBootCertificate=\f[R], \f[CR]\-\-secure\-boot\-certificate=\f[R] +Path to the X.509 file containing the certificate for the signed UEFI +kernel image, if \f[CR]SecureBoot=\f[R] is used. +.TP +\f[CR]SecureBootSignTool=\f[R], \f[CR]\-\-secure\-boot\-sign\-tool\f[R] +Tool to use to sign secure boot PE binaries. +Takes one of \f[CR]sbsign\f[R], \f[CR]pesign\f[R] or \f[CR]auto\f[R]. +Defaults to \f[CR]auto\f[R]. +If set to \f[CR]auto\f[R], either sbsign or pesign are used if +available, with sbsign being preferred if both are installed. +.TP +\f[CR]VerityKey=\f[R], \f[CR]\-\-verity\-key=\f[R] +Path to the PEM file containing the secret key for signing the verity +signature, if a verity signature partition is added with +systemd\-repart. +.TP +\f[CR]VerityCertificate=\f[R], \f[CR]\-\-verity\-certificate=\f[R] +Path to the X.509 file containing the certificate for signing the verity +signature, if a verity signature partition is added with +systemd\-repart. +.TP +\f[CR]SignExpectedPcr=\f[R], \f[CR]\-\-sign\-expected\-pcr\f[R] +Measure the components of the unified kernel image (UKI) using +\f[CR]systemd\-measure\f[R] and embed the PCR signature into the unified +kernel image. +This option takes a boolean value or the special value \f[CR]auto\f[R], +which is the default, which is equal to a true value if the +\f[CR]systemd\-measure\f[R] binary is in \f[CR]PATH\f[R]. +.TP +\f[CR]Passphrase=\f[R], \f[CR]\-\-passphrase\f[R] +Specify the path to a file containing the passphrase to use for LUKS +encryption. +It should contain the passphrase literally, and not end in a newline +character (i.e.\ in the same format as cryptsetup and +\f[CR]/etc/crypttab\f[R] expect the passphrase files). +The file must have an access mode of 0600 or less. +.TP +\f[CR]Checksum=\f[R], \f[CR]\-\-checksum\f[R] +Generate a \f[CR]SHA256SUMS\f[R] file of all generated artifacts after +the build is complete. +.TP +\f[CR]Sign=\f[R], \f[CR]\-\-sign\f[R] +Sign the generated \f[CR]SHA256SUMS\f[R] using \f[CR]gpg\f[R] after +completion. +.TP +\f[CR]Key=\f[R], \f[CR]\-\-key=\f[R] +Select the \f[CR]gpg\f[R] key to use for signing \f[CR]SHA256SUMS\f[R]. +This key must be already present in the \f[CR]gpg\f[R] keyring. +.SS [Host] Section +.TP +\f[CR]Incremental=\f[R], \f[CR]\-\-incremental=\f[R], \f[CR]\-i\f[R] +Enable incremental build mode. +In this mode, a copy of the OS image is created immediately after all OS +packages are installed and the prepare scripts have executed but before +the \f[CR]mkosi.build\f[R] scripts are invoked (or anything that happens +after it). +On subsequent invocations of \f[CR]mkosi\f[R] with the \f[CR]\-i\f[R] +switch this cached image may be used to skip the OS package +installation, thus drastically speeding up repetitive build times. +Note that while there is some rudimentary cache invalidation, it is +definitely not perfect. +In order to force rebuilding of the cached image, combine \f[CR]\-i\f[R] +with \f[CR]\-ff\f[R] to ensure the cached image is first removed and +then re\-created. +.TP +\f[CR]NSpawnSettings=\f[R], \f[CR]\-\-settings=\f[R] +Specifies a \f[CR].nspawn\f[R] settings file for +\f[CR]systemd\-nspawn\f[R] to use in the \f[CR]boot\f[R] and +\f[CR]shell\f[R] verbs, and to place next to the generated image file. +This is useful to configure the \f[CR]systemd\-nspawn\f[R] environment +when the image is run. +If this setting is not used but an \f[CR]mkosi.nspawn\f[R] file found in +the local directory it is automatically used for this purpose. +.TP +\f[CR]ExtraSearchPaths=\f[R], \f[CR]\-\-extra\-search\-path=\f[R] +List of colon\-separated paths to look for tools in, before using the +regular \f[CR]$PATH\f[R] search path. +.TP +\f[CR]QemuGui=\f[R], \f[CR]\-\-qemu\-gui=\f[R] +If enabled, qemu is executed with its graphical interface instead of +with a serial console. +.TP +\f[CR]QemuSmp=\f[R], \f[CR]\-\-qemu\-smp=\f[R] +When used with the \f[CR]qemu\f[R] verb, this options sets +\f[CR]qemu\f[R]\[cq]s \f[CR]\-smp\f[R] argument which controls the +number of guest\[cq]s CPUs. +Defaults to \f[CR]2\f[R]. +.TP +\f[CR]QemuMem=\f[R], \f[CR]\-\-qemu\-mem=\f[R] +When used with the \f[CR]qemu\f[R] verb, this options sets +\f[CR]qemu\f[R]\[cq]s \f[CR]\-m\f[R] argument which controls the amount +of guest\[cq]s RAM. +Defaults to \f[CR]2G\f[R]. +.TP +\f[CR]QemuKvm=\f[R], \f[CR]\-\-qemu\-kvm=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies whether +QEMU should use KVM acceleration. +Takes a boolean value or \f[CR]auto\f[R]. +Defaults to \f[CR]auto\f[R]. +.TP +\f[CR]QemuVsock=\f[R], \f[CR]\-\-qemu\-vsock=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies whether +QEMU should be configured with a vsock. +Takes a boolean value or \f[CR]auto\f[R]. +Defaults to \f[CR]auto\f[R]. +.TP +\f[CR]QemuVsockConnectionId=\f[R], \f[CR]\-\-qemu\-vsock\-cid=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies the vsock +connection ID to use. +Takes a number in the interval \f[CR][3, 0xFFFFFFFF)\f[R] or +\f[CR]hash\f[R] or \f[CR]auto\f[R]. +Defaults to \f[CR]hash\f[R]. +When set to \f[CR]hash\f[R], the connection ID will be derived from the +full path to the image. +When set to \f[CR]auto\f[R], \f[CR]mkosi\f[R] will try to find a free +connection ID automatically. +Otherwise, the provided number will be used as is. +Note that when set to \f[CR]auto\f[R], \f[CR]mkosi ssh\f[R] cannot be +used as we cannot figure out which free connection ID we found when +booting the image earlier. +.TP +\f[CR]QemuSwtpm=\f[R], \f[CR]\-\-qemu\-swtpm=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies whether +to start an instance of swtpm to be used as a TPM with qemu. +This requires swtpm to be installed on the host. +Takes a boolean value or \f[CR]auto\f[R]. +Defaults to \f[CR]auto\f[R]. +.TP +\f[CR]QemuCdrom=\f[R], \f[CR]\-\-qemu\-cdrom=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies whether +to attach the image to the virtual machine as a CD\-ROM device. +Takes a boolean. +Defaults to \f[CR]no\f[R]. +.TP +\f[CR]QemuFirmware=\f[R], \f[CR]\-\-qemu\-firmware=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies which +firmware to use. +Takes one of \f[CR]uefi\f[R], \f[CR]bios\f[R], \f[CR]linux\f[R], or +\f[CR]auto\f[R]. +Defaults to \f[CR]auto\f[R]. +When set to \f[CR]uefi\f[R], the OVMF firmware is used. +When set to \f[CR]bios\f[R], the default SeaBIOS firmware is used. +When set to \f[CR]linux\f[R], direct kernel boot is used. +See the \f[CR]QemuKernel=\f[R] option for more details on which kernel +image is used with direct kernel boot. +When set to \f[CR]auto\f[R], \f[CR]linux\f[R] is used if a cpio image is +being booted, \f[CR]uefi\f[R] otherwise. +.TP +\f[CR]QemuFirmwareVariables=\f[R], \f[CR]\-\-qemu\-firmware\-variables=\f[R] +When used with the \f[CR]qemu\f[R] verb, this option specifies the path +to the the firmware variables file to use. +Currently, this option is only taken into account when the +\f[CR]uefi\f[R] firmware is used. +If not specified, mkosi will search for the default variables file and +use that instead. +\f[CR]virt\-fw\-vars\f[R] from the \c +.UR https://gitlab.com/kraxel/virt-firmware +virt\-firmware +.UE \c +\ project can be used to customize OVMF variable files. +Some distributions also provide variable files which already have +Microsoft\[cq]s certificates for secure boot enrolled. +For Fedora and Debian these are \f[CR]OVMF_VARS.secboot.fd\f[R] and +\f[CR]OVMF_VARS_4M.ms.fd\f[R] under \f[CR]/usr/share/OVMF\f[R] +respectively. +You can use \f[CR]locate\f[R] and look under +\f[CR]/usr/share/qemu/firmware\f[R] for hints on where to find these +files if your distribution ships them. +.TP +\f[CR]QemuKernel=\f[R], \f[CR]\-\-qemu\-kernel=\f[R] +Set the kernel image to use for qemu direct kernel boot. +If not specified, mkosi will use the kernel provided via the command +line (\f[CR]\-kernel\f[R] option) or latest the kernel that was +installed into the image (or fail if no kernel was installed into the +image). +Note that when the \f[CR]cpio\f[R] output format is used, direct kernel +boot is used regardless of the configured firmware. +Depending on the configured firmware, qemu might boot the kernel itself +or using the configured firmware. +.TP +\f[CR]QemuDrives=\f[R], \f[CR]\-\-qemu\-drive=\f[R] +Add a qemu drive. +Takes a colon\-delimited string of format +\f[CR]<id>:<size>[:<directory>[:<options>]]\f[R]. +\f[CR]id\f[R] specifies the qemu id we assign to the drive. +This can be used as the \f[CR]drive=\f[R] property in various qemu +devices. +\f[CR]size\f[R] specifies the size of the drive. +This takes a size in bytes. +Additionally, the suffixes \f[CR]K\f[R], \f[CR]M\f[R] and \f[CR]G\f[R] +can be used to specify a size in kilobytes, megabytes and gigabytes +respectively. +\f[CR]directory\f[R] optionally specifies the directory in which to +create the file backing the drive. +\f[CR]options\f[R] optionally specifies extra comma\-delimited +properties which are passed verbatime to qemu\[cq]s \f[CR]\-drive\f[R] +option. +.TP +\f[CR]QemuArgs=\f[R] +Space\-delimited list of additional arguments to pass when invoking +qemu. +.TP +\f[CR]Ephemeral=\f[R], \f[CR]\-\-ephemeral\f[R] +When used with the \f[CR]shell\f[R], \f[CR]boot\f[R], or \f[CR]qemu\f[R] +verbs, this option runs the specified verb on a temporary snapshot of +the output image that is removed immediately when the container +terminates. +Taking the temporary snapshot is more efficient on file systems that +support reflinks natively (btrfs or xfs) than on more traditional file +systems that do not (ext4). +.TP +\f[CR]Credentials=\f[R], \f[CR]\-\-credential=\f[R] +Set credentials to be passed to systemd\-nspawn or qemu respectively +when \f[CR]mkosi shell/boot\f[R] or \f[CR]mkosi qemu\f[R] are used. +This option takes a space separated list of key=value assignments. +.TP +\f[CR]KernelCommandLineExtra=\f[R], \f[CR]\-\-kernel\-command\-line\-extra=\f[R] +Set extra kernel command line entries that are appended to the kernel +command line at runtime when booting the image. +When booting in a container, these are passed as extra arguments to +systemd. +When booting in a VM, these are appended to the kernel command line via +the SMBIOS io.systemd.stub.kernel\-cmdline\-extra OEM string. +This will only be picked up by systemd\-boot/systemd\-stub versions +newer than or equal to v254. +.TP +\f[CR]Acl=\f[R], \f[CR]\-\-acl=\f[R] +If specified, ACLs will be set on any generated root filesystem +directories that allow the user running mkosi to remove them without +needing privileges. +.TP +\f[CR]ToolsTree=\f[R], \f[CR]\-\-tools\-tree=\f[R] +If specified, programs executed by mkosi are looked up inside the given +tree instead of in the host system. +Use this option to make image builds more reproducible by always using +the same versions of programs to build the final image instead of +whatever version is installed on the host system. +If this option is not used, but the \f[CR]mkosi.tools/\f[R] directory is +found in the local directory it is automatically used for this purpose +with the root directory as target. +Note that when looking up binaries in \f[CR]\-\-tools\-tree=\f[R], only +\f[CR]/usr/bin\f[R] and \f[CR]/usr/sbin\f[R] are considered. +Specifically, paths specified by \f[CR]\-\-extra\-search\-path=\f[R] are +ignored when looking up binaries in the given tools tree. +If set to \f[CR]default\f[R], mkosi will automatically add an extra +tools tree image and use it as the tools tree. +The following table shows for which distributions default tools tree +packages are defined and which packages are included in those default +tools trees: +.PP +.TS +tab(@); +lw(24.0n) lw(7.7n) lw(7.7n) lw(7.7n) lw(7.7n) lw(5.8n) lw(9.6n). +T{ +T}@T{ +Fedora +T}@T{ +CentOS +T}@T{ +Debian +T}@T{ +Ubuntu +T}@T{ +Arch +T}@T{ +openSUSE +T} +_ +T{ +\f[CR]apt\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T} +T{ +\f[CR]archlinux\-keyring\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T} +T{ +\f[CR]bash\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]btrfs\-progs\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]bubblewrap\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]ca\-certificates\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]coreutils\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]cpio\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]curl\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]debian\-keyring\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T} +T{ +\f[CR]diffutils\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]distribution\-gpg\-keys\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +T}@T{ +T}@T{ +X +T} +T{ +\f[CR]dnf\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]dnf\-plugins\-core\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +T}@T{ +T}@T{ +X +T} +T{ +\f[CR]dnf5\f[R] +T}@T{ +X +T}@T{ +T}@T{ +T}@T{ +T}@T{ +T}@T{ +T} +T{ +\f[CR]dnf5\-plugins\f[R] +T}@T{ +X +T}@T{ +T}@T{ +T}@T{ +T}@T{ +T}@T{ +T} +T{ +\f[CR]dosfstools\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]e2fsprogs\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]edk2\-ovmf\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]erofs\-utils\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]kmod\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]less\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]mtools\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]nano\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]openssh\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]openssl\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]pacman\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T} +T{ +\f[CR]pesign\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]policycoreutils\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +X +T} +T{ +\f[CR]qemu\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]sbsigntools\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]socat\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]squashfs\-tools\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]strace\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]swtpm\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]systemd\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]ukify\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]tar\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]ubuntu\-keyring\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T} +T{ +\f[CR]util\-linux\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]virtiofsd\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]xfsprogs\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]xz\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]zstd\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]zypper\f[R] +T}@T{ +X +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +T} +.TE +.TP +\f[CR]ToolsTreeDistribution=\f[R], \f[CR]\-\-tools\-tree\-distribution=\f[R] +Set the distribution to use for the default tools tree. +By default, the same distribution as the image that\[cq]s being built is +used, except for CentOS and Ubuntu images, in which case Fedora and +Debian are used respectively. +.TP +\f[CR]ToolsTreeRelease=\f[R], \f[CR]\-\-tools\-tree\-release=\f[R] +Set the distribution release to use for the default tools tree. +By default, the hardcoded default release in mkosi for the distribution +is used. +.TP +\f[CR]ToolsTreeMirror=\f[R], \f[CR]\-\-tools\-tree\-mirror=\f[R] +Set the mirror to use for the default tools tree. +By default, the default mirror for the tools tree distribution is used. +.TP +\f[CR]ToolsTreePackages=\f[R], \f[CR]\-\-tools\-tree\-packages=\f[R] +Extra packages to install into the default tools tree. +Takes a comma separated list of package specifications. +This option may be used multiple times in which case the specified +package lists are combined. +.TP +\f[CR]RuntimeTrees=\f[R], \f[CR]\-\-runtime\-tree=\f[R] +Takes a colon separated pair of paths. +The first path refers to a directory to mount into any machine +(container or VM) started by mkosi. +The second path refers to the target directory inside the machine. +If the second path is not provided, the directory is mounted below +\f[CR]/root/src\f[R] in the machine. +If the second path is relative, it is interpreted relative to +\f[CR]/root/src\f[R] in the machine. +For each mounted directory, the uid and gid of the user running mkosi +are mapped to the root user in the machine. +This means that all the files and directories will appear as if +they\[cq]re owned by root in the machine, and all new files and +directories created by root in the machine in these directories will be +owned by the user running mkosi on the host. +Note that when using \f[CR]mkosi qemu\f[R] with this feature systemd +v254 or newer has to be installed in the image. +.TP +\f[CR]RuntimeSize=\f[R], \f[CR]\-\-runtime\-size=\f[R] +If specified, disk images are grown to the specified size before +they\[cq]re booted with systemd\-nspawn or qemu. +Takes a size in bytes. +Additionally, the suffixes \f[CR]K\f[R], \f[CR]M\f[R] and \f[CR]G\f[R] +can be used to specify a size in kilobytes, megabytes and gigabytes +respectively. +.TP +\f[CR]RuntimeScratch=\f[R]: \f[CR]\-\-runtime\-scratch=\f[R] +Takes a boolean value or \f[CR]auto\f[R]. +Specifies whether to mount extra scratch space to \f[CR]/var/tmp\f[R]. +If enabled, practically unlimited scratch space is made available under +\f[CR]/var/tmp\f[R] when booting the image with \f[CR]mkosi qemu\f[R], +\f[CR]mkosi boot\f[R] or \f[CR]mkosi shell\f[R]. +Note that using this feature with \f[CR]mkosi qemu\f[R] requires systemd +v254 or newer in the guest. +.TP +\f[CR]SshKey=\f[R], \f[CR]\-\-ssh\-key=\f[R] +Path to the X509 private key in PEM format to use to connect to a +virtual machine started with \f[CR]mkosi qemu\f[R] and built with the +\f[CR]Ssh=\f[R] option enabled via the \f[CR]mkosi ssh\f[R] command. +If not configured and \f[CR]mkosi.key\f[R] exists in the working +directory, it will automatically be used for this purpose. +Run \f[CR]mkosi genkey\f[R] to automatically generate a key in +\f[CR]mkosi.key\f[R]. +.TP +\f[CR]SshCertificate=\f[R], \f[CR]\-\-ssh\-certificate=\f[R] +Path to the X509 certificate in PEM format to provision as the SSH +public key in virtual machines started with \f[CR]mkosi qemu\f[R]. +If not configured and \f[CR]mkosi.crt\f[R] exists in the working +directory, it will automatically be used for this purpose. +Run \f[CR]mkosi genkey\f[R] to automatically generate a certificate in +\f[CR]mkosi.crt\f[R]. +.SS Specifiers +The current value of various settings can be accessed when parsing +configuration files by using specifiers. +To write a literal \f[CR]%\f[R] character in a configuration file +without treating it as a specifier, use \f[CR]%%\f[R]. +The following specifiers are understood: +.PP +.TS +tab(@); +l l. +T{ +Setting +T}@T{ +Specifier +T} +_ +T{ +\f[CR]Distribution=\f[R] +T}@T{ +\f[CR]%d\f[R] +T} +T{ +\f[CR]Release=\f[R] +T}@T{ +\f[CR]%r\f[R] +T} +T{ +\f[CR]Architecture=\f[R] +T}@T{ +\f[CR]%a\f[R] +T} +T{ +\f[CR]Format=\f[R] +T}@T{ +\f[CR]%t\f[R] +T} +T{ +\f[CR]Output=\f[R] +T}@T{ +\f[CR]%o\f[R] +T} +T{ +\f[CR]OutputDirectory=\f[R] +T}@T{ +\f[CR]%O\f[R] +T} +T{ +\f[CR]ImageId=\f[R] +T}@T{ +\f[CR]%i\f[R] +T} +T{ +\f[CR]ImageVersion=\f[R] +T}@T{ +\f[CR]%v\f[R] +T} +.TE +.SS Supported distributions +Images may be created containing installations of the following +distributions: +.IP \[bu] 2 +\f[I]Fedora Linux\f[R] +.IP \[bu] 2 +\f[I]Debian\f[R] +.IP \[bu] 2 +\f[I]Ubuntu\f[R] +.IP \[bu] 2 +\f[I]Arch Linux\f[R] +.IP \[bu] 2 +\f[I]openSUSE\f[R] +.IP \[bu] 2 +\f[I]Mageia\f[R] +.IP \[bu] 2 +\f[I]CentOS\f[R] +.IP \[bu] 2 +\f[I]RHEL\f[R] +.IP \[bu] 2 +\f[I]RHEL UBI\f[R] +.IP \[bu] 2 +\f[I]OpenMandriva\f[R] +.IP \[bu] 2 +\f[I]Rocky Linux\f[R] +.IP \[bu] 2 +\f[I]Alma Linux\f[R] +.IP \[bu] 2 +\f[I]Gentoo\f[R] (\f[B]Gentoo is experimental and unsupported. +We make no guarantee that it will work at all and the core maintainers +will generally not fix gentoo specific issues\f[R]) +.IP \[bu] 2 +\f[I]None\f[R] (\f[B]Requires the user to provide a pre\-built +rootfs\f[R]) +.PP +In theory, any distribution may be used on the host for building images +containing any other distribution, as long as the necessary tools are +available. +Specifically, any distribution that packages \f[CR]apt\f[R] may be used +to build \f[I]Debian\f[R] or \f[I]Ubuntu\f[R] images. +Any distribution that packages \f[CR]dnf\f[R] may be used to build +images for any of the rpm\-based distributions. +Any distro that packages \f[CR]pacman\f[R] may be used to build +\f[I]Arch Linux\f[R] images. +Any distribution that packages \f[CR]zypper\f[R] may be used to build +\f[I]openSUSE\f[R] images. +Other distributions and build automation tools for embedded Linux +systems such as Buildroot, OpenEmbedded and Yocto Project may be used by +selecting the \f[CR]custom\f[R] distribution, and populating the rootfs +via a combination of base trees, skeleton trees, and prepare scripts. +.PP +Currently, \f[I]Fedora Linux\f[R] packages all relevant tools as of +Fedora 28. +.PP +Note that when not using a custom mirror, \f[CR]RHEL\f[R] images can +only be built from a host system with a \f[CR]RHEL\f[R] subscription +(established using e.g.\ \f[CR]subscription\-manager\f[R]). +.SH Execution Flow +Execution flow for \f[CR]mkosi build\f[R]. +Default values/calls are shown in parentheses. +When building with \f[CR]\-\-incremental\f[R] mkosi creates a cache of +the distribution installation if not already existing and replaces the +distribution installation in consecutive runs with data from the cached +one. +.IP "1." 3 +Parse CLI options +.IP "2." 3 +Parse configuration files +.IP "3." 3 +If we\[cq]re not running as root, unshare the user namespace and map the +subuid range configured in \f[CR]/etc/subuid\f[R] and +\f[CR]/etc/subgid\f[R] into it. +.IP "4." 3 +Unshare the mount namespace +.IP "5." 3 +Remount the following directories read\-only if they exist: +.RS 4 +.IP \[bu] 2 +\f[CR]/usr\f[R] +.IP \[bu] 2 +\f[CR]/etc\f[R] +.IP \[bu] 2 +\f[CR]/opt\f[R] +.IP \[bu] 2 +\f[CR]/srv\f[R] +.IP \[bu] 2 +\f[CR]/boot\f[R] +.IP \[bu] 2 +\f[CR]/efi\f[R] +.IP \[bu] 2 +\f[CR]/media\f[R] +.IP \[bu] 2 +\f[CR]/mnt\f[R] +.RE +.PP +Then, for each image, we execute the following steps: +.IP " 1." 4 +Copy package manager trees into the workspace +.IP " 2." 4 +Copy base trees (\f[CR]\-\-base\-tree=\f[R]) into the image +.IP " 3." 4 +Copy skeleton trees (\f[CR]mkosi.skeleton\f[R]) into image +.IP " 4." 4 +Install distribution and packages into image or use cache tree if +available +.IP " 5." 4 +Run prepare scripts on image with the \f[CR]final\f[R] argument +(\f[CR]mkosi.prepare\f[R]) +.IP " 6." 4 +Install build packages in overlay if any build scripts are configured +.IP " 7." 4 +Run prepare scripts on overlay with the \f[CR]build\f[R] argument if any +build scripts are configured (\f[CR]mkosi.prepare\f[R]) +.IP " 8." 4 +Cache the image if configured (\f[CR]\-\-incremental\f[R]) +.IP " 9." 4 +Run build scripts on image + overlay if any build scripts are configured +(\f[CR]mkosi.build\f[R]) +.IP "10." 4 +Finalize the build if the output format \f[CR]none\f[R] is configured +.IP "11." 4 +Copy the build scripts outputs into the image +.IP "12." 4 +Copy the extra trees into the image (\f[CR]mkosi.extra\f[R]) +.IP "13." 4 +Run post\-install scripts (\f[CR]mkosi.postinst\f[R]) +.IP "14." 4 +Write config files required for \f[CR]Ssh=\f[R], \f[CR]Autologin=\f[R] +and \f[CR]MakeInitrd=\f[R] +.IP "15." 4 +Install systemd\-boot and configure secure boot if configured +(\f[CR]\-\-secure\-boot\f[R]) +.IP "16." 4 +Run \f[CR]systemd\-sysusers\f[R] +.IP "17." 4 +Run \f[CR]systemd\-tmpfiles\f[R] +.IP "18." 4 +Run \f[CR]systemctl preset\-all\f[R] +.IP "19." 4 +Run \f[CR]depmod\f[R] +.IP "20." 4 +Run \f[CR]systemd\-firstboot\f[R] +.IP "21." 4 +Run \f[CR]systemd\-hwdb\f[R] +.IP "22." 4 +Remove packages and files (\f[CR]RemovePackages=\f[R], +\f[CR]RemoveFiles=\f[R]) +.IP "23." 4 +Run SELinux relabel is a SELinux policy is installed +.IP "24." 4 +Run finalize scripts (\f[CR]mkosi.finalize\f[R]) +.IP "25." 4 +Generate unified kernel image if configured to do so +.IP "26." 4 +Generate final output format +.SH Scripts +To allow for image customization that cannot be implemented using +mkosi\[cq]s builtin features, mkosi supports running scripts at various +points during the image build process that can customize the image as +needed. +Scripts are executed on the host system as root (either real root or +root within the user namespace that mkosi created when running +unprivileged) with a customized environment to simplify modifying the +image. +For each script, the configured build sources (\f[CR]BuildSources=\f[R]) +are mounted into the current working directory before running the script +in the current working directory. +\f[CR]$SRCDIR\f[R] is set to point to the current working directory. +The following scripts are supported: +.IP \[bu] 2 +If \f[B]\f[CB]mkosi.prepare\f[B]\f[R] (\f[CR]PrepareScripts=\f[R]) +exists, it is first called with the \f[CR]final\f[R] argument, right +after the software packages are installed. +It is called a second time with the \f[CR]build\f[R] command line +parameter, right after the build packages are installed and the build +overlay mounted on top of the image\[cq]s root directory . +This script has network access and may be used to install packages from +other sources than the distro\[cq]s package manager +(e.g.\ \f[CR]pip\f[R], \f[CR]npm\f[R], \&...), after all software +packages are installed but before the image is cached (if incremental +mode is enabled). +In contrast to a general purpose installation, it is safe to install +packages to the system (\f[CR]pip install\f[R], +\f[CR]npm install \-g\f[R]) instead of in \f[CR]$SRCDIR\f[R] itself +because the build image is only used for a single project and can easily +be thrown away and rebuilt so there\[cq]s no risk of conflicting +dependencies and no risk of polluting the host system. +.IP \[bu] 2 +If \f[B]\f[CB]mkosi.build\f[B]\f[R] (\f[CR]BuildScripts=\f[R]) exists, +it is executed with the build overlay mounted on top of the image\[cq]s +root directory. +When running the build script, \f[CR]$DESTDIR\f[R] points to a directory +where the script should place any files generated it would like to end +up in the image. +Note that \f[CR]make\f[R]/\f[CR]automake\f[R]/\f[CR]meson\f[R] based +build systems generally honor \f[CR]$DESTDIR\f[R], thus making it very +natural to build \f[I]source\f[R] trees from the build script. +After running the build script, the contents of \f[CR]$DESTDIR\f[R] are +copied into the image. +.IP \[bu] 2 +If \f[B]\f[CB]mkosi.postinst\f[B]\f[R] +(\f[CR]PostInstallationScripts=\f[R]) exists, it is executed after the +(optional) build tree and extra trees have been installed. +This script may be used to alter the images without any restrictions, +after all software packages and built sources have been installed. +.IP \[bu] 2 +If \f[B]\f[CB]mkosi.finalize\f[B]\f[R] (\f[CR]FinalizeScripts=\f[R]) +exists, it is executed as the last step of preparing an image. +.PP +If a script uses the \f[CR].chroot\f[R] extension, mkosi will chroot +into the image using \f[CR]mkosi\-chroot\f[R] (see below) before +executing the script. +For example, if \f[CR]mkosi.postinst.chroot\f[R] exists, mkosi will +chroot into the image and execute it as the post\-installation script. +.PP +Scripts executed by mkosi receive the following environment variables: +.IP \[bu] 2 +\f[CR]$ARCHITECTURE\f[R] contains the architecture from the +\f[CR]Architecture=\f[R] setting. +If \f[CR]Architecture=\f[R] is not set, it will contain the native +architecture of the host machine. +See the documentation of \f[CR]Architecture=\f[R] for possible values +for this variable. +.IP \[bu] 2 +\f[CR]$CHROOT_SCRIPT\f[R] contains the path to the running script +relative to the image root directory. +The primary usecase for this variable is in combination with the +\f[CR]mkosi\-chroot\f[R] script. +See the description of \f[CR]mkosi\-chroot\f[R] below for more +information. +.IP \[bu] 2 +\f[CR]$SRCDIR\f[R] contains the path to the directory mkosi was invoked +from, with any configured build sources mounted on top. +\f[CR]$CHROOT_SRCDIR\f[R] contains the value that \f[CR]$SRCDIR\f[R] +will have after invoking \f[CR]mkosi\-chroot\f[R]. +.IP \[bu] 2 +\f[CR]$BUILDDIR\f[R] is only defined if \f[CR]mkosi.builddir\f[R] exists +and points to the build directory to use. +This is useful for all build systems that support out\-of\-tree builds +to reuse already built artifacts from previous runs. +\f[CR]$CHROOT_BUILDDIR\f[R] contains the value that \f[CR]$BUILDDIR\f[R] +will have after invoking \f[CR]mkosi\-chroot\f[R]. +.IP \[bu] 2 +\f[CR]$DESTDIR\f[R] is a directory into which any installed software +generated by a build script may be placed. +This variable is only set when executing a build script. +\f[CR]$CHROOT_DESTDIR\f[R] contains the value that \f[CR]$DESTDIR\f[R] +will have after invoking \f[CR]mkosi\-chroot\f[R]. +.IP \[bu] 2 +\f[CR]$OUTPUTDIR\f[R] points to the staging directory used to store +build artifacts generated during the build. +\f[CR]$CHROOT_OUTPUTDIR\f[R] contains the value that +\f[CR]$OUTPUTDIR\f[R] will have after invoking \f[CR]mkosi\-chroot\f[R]. +.IP \[bu] 2 +\f[CR]$PACKAGEDIR\f[R] points to the directory containing the local +package repository. +Build scripts can add more packages to the local repository by writing +the packages to \f[CR]$PACKAGEDIR\f[R]. +.IP \[bu] 2 +\f[CR]$BUILDROOT\f[R] is the root directory of the image being built, +optionally with the build overlay mounted on top depending on the script +that\[cq]s being executed. +.IP \[bu] 2 +\f[CR]$WITH_DOCS\f[R] is either \f[CR]0\f[R] or \f[CR]1\f[R] depending +on whether a build without or with installed documentation was requested +(\f[CR]WithDocs=yes\f[R]). +A build script should suppress installation of any package documentation +to \f[CR]$DESTDIR\f[R] in case \f[CR]$WITH_DOCS\f[R] is set to +\f[CR]0\f[R]. +.IP \[bu] 2 +\f[CR]$WITH_TESTS\f[R] is either \f[CR]0\f[R] or \f[CR]1\f[R] depending +on whether a build without or with running the test suite was requested +(\f[CR]WithTests=no\f[R]). +A build script should avoid running any unit or integration tests in +case \f[CR]$WITH_TESTS\f[R] is \f[CR]0\f[R]. +.IP \[bu] 2 +\f[CR]$WITH_NETWORK\f[R] is either \f[CR]0\f[R] or \f[CR]1\f[R] +depending on whether a build without or with networking is being +executed (\f[CR]WithNetwork=no\f[R]). +A build script should avoid any network communication in case +\f[CR]$WITH_NETWORK\f[R] is \f[CR]0\f[R]. +.IP \[bu] 2 +\f[CR]$SOURCE_DATE_EPOCH\f[R] is defined if requested +(\f[CR]SourceDateEpoch=TIMESTAMP\f[R], +\f[CR]Environment=SOURCE_DATE_EPOCH=TIMESTAMP\f[R] or the host +environment variable \f[CR]$SOURCE_DATE_EPOCH\f[R]). +This is useful to make builds reproducible. +See \c +.UR https://reproducible-builds.org/specs/source-date-epoch/ +SOURCE_DATE_EPOCH +.UE \c +\ for more information. +.IP \[bu] 2 +\f[CR]$MKOSI_UID\f[R] and \f[CR]$MKOSI_GID\f[R] are the respectively the +uid, gid of the user that invoked mkosi, potentially translated to a uid +in the user namespace that mkosi is running in. +These can be used in combination with \f[CR]setpriv\f[R] to run commands +as the user that invoked mkosi (e.g. +\f[CR]setpriv \-\-reuid=$MKOSI_UID \-\-regid=$MKOSI_GID \-\-clear\-groups <command>\f[R]) +.PP +Consult this table for which script receives which environment +variables: +.PP +.TS +tab(@); +lw(16.5n) lw(13.4n) lw(11.8n) lw(14.2n) lw(14.2n). +T{ +Variable +T}@T{ +\f[CR]mkosi.prepare\f[R] +T}@T{ +\f[CR]mkosi.build\f[R] +T}@T{ +\f[CR]mkosi.postinst\f[R] +T}@T{ +\f[CR]mkosi.finalize\f[R] +T} +_ +T{ +\f[CR]$CHROOT_SCRIPT\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]$SRCDIR\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]CHROOT_SRCDIR\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]$BUILDDIR\f[R] +T}@T{ +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]CHROOT_BUILDDIR\f[R] +T}@T{ +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]DESTDIR\f[R] +T}@T{ +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]CHROOT_DESTDIR\f[R] +T}@T{ +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]$OUTPUTDIR\f[R] +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]CHROOT_OUTPUTDIR\f[R] +T}@T{ +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]$BUILDROOT\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]WITH_DOCS\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]WITH_TESTS\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]WITH_NETWORK\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +T}@T{ +T} +T{ +\f[CR]SOURCE_DATE_EPOCH\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]MKOSI_UID\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +T{ +\f[CR]MKOSI_GID\f[R] +T}@T{ +X +T}@T{ +X +T}@T{ +X +T}@T{ +X +T} +.TE +.PP +Additionally, when a script is executed, a few scripts are made +available via \f[CR]$PATH\f[R] to simplify common usecases. +.IP \[bu] 2 +\f[CR]mkosi\-chroot\f[R]: This script will chroot into the image and +execute the given command. +On top of chrooting into the image, it will also mount various files and +directories (\f[CR]$SRCDIR\f[R], \f[CR]$DESTDIR\f[R], +\f[CR]$BUILDDIR\f[R], \f[CR]$OUTPUTDIR\f[R], \f[CR]$CHROOT_SCRIPT\f[R]) +into the image and modify the corresponding environment variables to +point to the locations inside the image. +It will also mount APIVFS filesystems (\f[CR]/proc\f[R], +\f[CR]/dev\f[R], \&...) +to make sure scripts and tools executed inside the chroot work properly. +It also propagates \f[CR]/etc/resolv.conf\f[R] from the host into the +chroot if requested so that DNS resolution works inside the chroot. +After the mkosi\-chroot command exits, various mount points are cleaned +up. +.RS 2 +.PP +For example, to invoke \f[CR]ls\f[R] inside of the image, use the +following +.IP +.EX +mkosi\-chroot ls ... +.EE +.PP +To execute the entire script inside the image, add a \[lq].chroot\[rq] +suffix to the name (\f[CR]mkosi.build.chroot\f[R] instead of +\f[CR]mkosi.build\f[R], etc.). +.RE +.IP \[bu] 2 +For all of the supported package managers except portage +(\f[CR]dnf\f[R], \f[CR]rpm\f[R], \f[CR]apt\f[R], \f[CR]pacman\f[R], +\f[CR]zypper\f[R]), scripts of the same name are put into +\f[CR]$PATH\f[R] that make sure these commands operate on the +image\[cq]s root directory with the configuration supplied by the user +instead of on the host system. +This means that from a script, you can do +e.g.\ \f[CR]dnf install vim\f[R] to install vim into the image. +.IP \[bu] 2 +\f[CR]mkosi\-as\-caller\f[R]: This script uses \f[CR]setpriv\f[R] to +switch from the user \f[CR]root\f[R] in the user namespace used for +various build steps back to the original user that called mkosi. +This is useful when we want to invoke build steps which will write to +\f[CR]$BUILDDIR\f[R] and we want to have the files owned by the calling +user. +.RS 2 +.PP +For example, a complete \f[CR]mkosi.build\f[R] script might be the +following: +.IP +.EX +set \-ex + +mkosi\-as\-caller meson setup \[dq]$BUILDDIR/build\[dq] \[dq]$SRCDIR\[dq] +mkosi\-as\-caller meson compile \-C \[dq]$BUILDDIR/build\[dq] +meson install \-C \[dq]$BUILDDIR/build\[dq] \-\-no\-rebuild +.EE +.RE +.IP \[bu] 2 +\f[CR]git\f[R] is automatically invoked with \f[CR]safe.directory=*\f[R] +to avoid permissions errors when running as the root user in a user +namespace. +.IP \[bu] 2 +\f[CR]useradd\f[R] and \f[CR]groupadd\f[R] are automatically invoked +with \f[CR]\-\-root=$BUILDROOT\f[R] when executed outside of the image. +.PP +When scripts are executed, any directories that are still writable are +also made read\-only (\f[CR]/home\f[R], \f[CR]/var\f[R], +\f[CR]/root\f[R], \&...) +and only the minimal set of directories that need to be writable remain +writable. +This is to ensure that scripts can\[cq]t mess with the host system when +mkosi is running as root. +.PP +Note that when executing scripts, all source directories are made +ephemeral which means all changes made to source directories while +running scripts are thrown away after the scripts finish executing. +Use the output, build or cache directories if you need to persist data +between builds. +.SH Files +To make it easy to build images for development versions of your +projects, mkosi can read configuration data from the local directory, +under the assumption that it is invoked from a \f[I]source\f[R] tree. +Specifically, the following files are used if they exist in the local +directory: +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.skeleton/\f[B]\f[R] directory or +\f[B]\f[CB]mkosi.skeleton.tar\f[B]\f[R] archive may be used to insert +files into the image. +The files are copied \f[I]before\f[R] the distribution packages are +installed into the image. +This allows creation of files that need to be provided early, for +example to configure the package manager or set systemd presets. +.RS 2 +.PP +When using the directory, file ownership is not preserved: all files +copied will be owned by root. +To preserve ownership, use a tar archive. +.RE +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.extra/\f[B]\f[R] directory or +\f[B]\f[CB]mkosi.extra.tar\f[B]\f[R] archive may be used to insert +additional files into the image, on top of what the distribution +includes in its packages. +They are similar to \f[CR]mkosi.skeleton/\f[R] and +\f[CR]mkosi.skeleton.tar\f[R], but the files are copied into the +directory tree of the image \f[I]after\f[R] the OS was installed. +.RS 2 +.PP +When using the directory, file ownership is not preserved: all files +copied will be owned by root. +To preserve ownership, use a tar archive. +.RE +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.nspawn\f[B]\f[R] nspawn settings file will be +copied into the same place as the output image file, if it exists. +This is useful since nspawn looks for settings files next to image files +it boots, for additional container runtime settings. +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.cache/\f[B]\f[R] directory, if it exists, is +automatically used as package download cache, in order to speed repeated +runs of the tool. +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.builddir/\f[B]\f[R] directory, if it exists, is +automatically used as out\-of\-tree build directory, if the build +commands in the \f[CR]mkosi.build\f[R] scripts support it. +Specifically, this directory will be mounted into the build container, +and the \f[CR]$BUILDDIR\f[R] environment variable will be set to it when +the build scripts are invoked. +A build script may then use this directory as build directory, for +automake\-style or ninja\-style out\-of\-tree builds. +This speeds up builds considerably, in particular when \f[CR]mkosi\f[R] +is used in incremental mode (\f[CR]\-i\f[R]): not only the image and +build overlay, but also the build tree is reused between subsequent +invocations. +Note that if this directory does not exist the \f[CR]$BUILDDIR\f[R] +environment variable is not set, and it is up to the build scripts to +decide whether to do in in\-tree or an out\-of\-tree build, and which +build directory to use. +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.rootpw\f[B]\f[R] file can be used to provide the +password for the root user of the image. +If the password is prefixed with \f[CR]hashed:\f[R] it is treated as an +already hashed root password. +The password may optionally be followed by a newline character which is +implicitly removed. +The file must have an access mode of 0600 or less. +If this file does not exist, the distribution\[cq]s default root +password is set (which usually means access to the root user is +blocked). +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.passphrase\f[B]\f[R] file provides the passphrase +to use when LUKS encryption is selected. +It should contain the passphrase literally, and not end in a newline +character (i.e.\ in the same format as cryptsetup and +\f[CR]/etc/crypttab\f[R] expect the passphrase files). +The file must have an access mode of 0600 or less. +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.crt\f[B]\f[R] and \f[B]\f[CB]mkosi.key\f[B]\f[R] +files contain an X.509 certificate and PEM private key to use when +signing is required (UEFI SecureBoot, verity, \&...). +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.output/\f[B]\f[R] directory is used to store all +build artifacts. +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.credentials/\f[B]\f[R] directory is used as a +source of extra credentials similar to the \f[CR]Credentials=\f[R] +option. +For each file in the directory, the filename will be used as the +credential name and the file contents become the credential value, or, +if the file is executable, mkosi will execute the file and the +command\[cq]s output to stdout will be used as the credential value. +Output to stderr will be ignored. +Credentials configured with \f[CR]Credentials=\f[R] take precedence over +files in \f[CR]mkosi.credentials\f[R]. +.IP \[bu] 2 +The \f[B]\f[CB]mkosi.repart/\f[B]\f[R] directory is used as the source +for systemd\-repart partition definition files which are passed to +systemd\-repart when building a disk image. +If it does not exist and the \f[CR]RepartDirectories=\f[R] setting is +not configured, mkosi will default to the following partition definition +files: +.RS 2 +.PP +\f[CR]00\-esp.conf\f[R] (if we\[cq]re building a bootable image): +.IP +.EX +[Partition] +Type=esp +Format=vfat +CopyFiles=/boot:/ +CopyFiles=/efi:/ +SizeMinBytes=512M +SizeMaxBytes=512M +.EE +.PP +\f[CR]05\-bios.conf\f[R] (if we\[cq]re building a BIOS bootable image): +.IP +.EX +[Partition] +# UUID of the grub BIOS boot partition which grubs needs on GPT to +# embed itself into. +Type=21686148\-6449\-6e6f\-744e\-656564454649 +SizeMinBytes=1M +SizeMaxBytes=1M +.EE +.PP +\f[CR]10\-root.conf\f[R]: +.IP +.EX +[Partition] +Type=root +Format=<distribution\-default\-filesystem> +CopyFiles=/ +Minimize=guess +.EE +.PP +Note that if either \f[CR]mkosi.repart/\f[R] is found or +\f[CR]RepartDirectories=\f[R] is used, we will not use any of the +default partition definitions. +.RE +.PP +All these files are optional. +.PP +Note that the location of all these files may also be configured during +invocation via command line switches, and as settings in +\f[CR]mkosi.conf\f[R], in case the default settings are not acceptable +for a project. +.SH CACHING +\f[CR]mkosi\f[R] supports three different caches for speeding up +repetitive re\-building of images. +Specifically: +.IP "1." 3 +The package cache of the distribution package manager may be cached +between builds. +This is configured with the \f[CR]\-\-cache\-dir=\f[R] option or the +\f[CR]mkosi.cache/\f[R] directory. +This form of caching relies on the distribution\[cq]s package manager, +and caches distribution packages (RPM, DEB, \&...) +after they are downloaded, but before they are unpacked. +.IP "2." 3 +If the incremental build mode is enabled with +\f[CR]\-\-incremental\f[R], cached copies of the final image and build +overlay are made immediately before the build sources are copied in (for +the build overlay) or the artifacts generated by \f[CR]mkosi.build\f[R] +are copied in (in case of the final image). +This form of caching allows bypassing the time\-consuming package +unpacking step of the distribution package managers, but is only +effective if the list of packages to use remains stable, but the build +sources and its scripts change regularly. +Note that this cache requires manual flushing: whenever the package list +is modified the cached images need to be explicitly removed before the +next re\-build, using the \f[CR]\-f\f[R] switch. +.IP "3." 3 +Finally, between multiple builds the build artifact directory may be +shared, using the \f[CR]mkosi.builddir/\f[R] directory. +This directory allows build systems such as Meson to reuse already +compiled sources from a previous built, thus speeding up the build +process of a \f[CR]mkosi.build\f[R] build script. +.PP +The package cache and incremental mode are unconditionally useful. +The final cache only apply to uses of \f[CR]mkosi\f[R] with a source +tree and build script. +When all three are enabled together turn\-around times for complete +image builds are minimal, as only changed source files need to be +recompiled. +.SH Building multiple images +If the \f[CR]mkosi.images/\f[R] directory exists, mkosi will load +individual image configurations from it and build each of them. +Image configurations can be either directories containing mkosi +configuration files or regular files with the \f[CR].conf\f[R] +extension. +.PP +When image configurations are found in \f[CR]mkosi.images/\f[R], mkosi +will build the configured images and all of their dependencies (or all +of them if no images were explicitly configured using +\f[CR]Images=\f[R]). +To add dependencies between images, the \f[CR]Dependencies=\f[R] setting +can be used. +.PP +When images are defined, mkosi will first read the global configuration +(configuration outside of the \f[CR]mkosi.images/\f[R] directory), +followed by the image specific configuration. +This means that global configuration takes precedence over image +specific configuration. +.PP +Images can refer to outputs of images they depend on. +Specifically, for the following options, mkosi will only check whether +the inputs exist just before building the image: +.IP \[bu] 2 +\f[CR]BaseTrees=\f[R] +.IP \[bu] 2 +\f[CR]PackageManagerTrees=\f[R] +.IP \[bu] 2 +\f[CR]SkeletonTrees=\f[R] +.IP \[bu] 2 +\f[CR]ExtraTrees=\f[R] +.IP \[bu] 2 +\f[CR]ToolsTree=\f[R] +.IP \[bu] 2 +\f[CR]Initrds=\f[R] +.PP +To refer to outputs of a image\[cq]s dependencies, simply configure any +of these options with a relative path to the output to use in the output +directory of the dependency. +Or use the \f[CR]%O\f[R] specifier to refer to the output directory. +.PP +A good example on how to build multiple images can be found in the \c +.UR https://github.com/systemd/systemd/tree/main/mkosi.images +systemd +.UE \c +\ repository. +.SH ENVIRONMENT VARIABLES +.IP \[bu] 2 +\f[CR]$MKOSI_LESS\f[R] overrides options for \f[CR]less\f[R] when it is +invoked by \f[CR]mkosi\f[R] to page output. +.IP \[bu] 2 +\f[CR]$MKOSI_DNF\f[R] can be used to override the executable used as +\f[CR]dnf\f[R]. +This is particularly useful to select between \f[CR]dnf\f[R] and +\f[CR]dnf5\f[R]. +.SH EXAMPLES +Create and run a raw \f[I]GPT\f[R] image with \f[I]ext4\f[R], as +\f[CR]image.raw\f[R]: +.IP +.EX +# mkosi \-p systemd \-\-incremental boot +.EE +.PP +Create and run a bootable \f[I]GPT\f[R] image, as \f[CR]foobar.raw\f[R]: +.IP +.EX +$ mkosi \-d fedora \-p kernel\-core \-p systemd \-p systemd\-boot \-p udev \-o foobar.raw +# mkosi \-\-output foobar.raw boot +$ mkosi \-\-output foobar.raw qemu +.EE +.PP +Create and run a \f[I]Fedora Linux\f[R] image in a plain directory: +.IP +.EX +# mkosi \-\-distribution fedora \-\-format directory boot +.EE +.PP +Create a compressed image \f[CR]image.raw.xz\f[R] with \f[I]SSH\f[R] +installed and add a checksum file: +.IP +.EX +$ mkosi \-\-distribution fedora \-\-format disk \-\-checksum \-\-compress\-output \-\-package=openssh\-clients +.EE +.PP +Inside the source directory of an \f[CR]automake\f[R]\-based project, +configure \f[I]mkosi\f[R] so that simply invoking \f[CR]mkosi\f[R] +without any parameters builds an OS image containing a built version of +the project in its current state: +.IP +.EX +$ cat >mkosi.conf <<EOF +[Distribution] +Distribution=fedora + +[Output] +Format=disk + +[Content] +Packages=kernel,systemd,systemd\-udev,openssh\-clients,httpd +BuildPackages=make,gcc,libcurl\-devel +EOF +$ cat >mkosi.build <<EOF +#!/bin/sh + +if [ \[dq]$container\[dq] != \[dq]mkosi\[dq] ]; then + exec mkosi\-chroot \[dq]$CHROOT_SCRIPT\[dq] \[dq]$\[at]\[dq] +fi + +cd $SRCDIR +\&./autogen.sh +\&./configure \-\-prefix=/usr +make \-j \[ga]nproc\[ga] +make install +EOF +$ chmod +x mkosi.build +# mkosi \-\-incremental boot +# systemd\-nspawn \-bi image.raw +.EE +.SS Different ways to boot with \f[CR]qemu\f[R] +The easiest way to boot a virtual machine is to build an image with the +required components and let \f[CR]mkosi\f[R] call \f[CR]qemu\f[R] with +all the right options: +.IP +.EX +$ mkosi \-d fedora \[rs] + \-\-autologin \[rs] + \-p systemd\-udev,systemd\-boot,kernel\-core \[rs] + build +$ mkosi \-d fedora qemu +\&... +fedora login: root (automatic login) +[root\[at]fedora \[ti]]# +.EE +.PP +The default is to boot with a text console only. +In this mode, messages from the boot loader, the kernel, and systemd, +and later the getty login prompt and shell all use the same terminal. +It is possible to switch between the qemu console and monitor by +pressing \f[CR]Ctrl\-a c\f[R]. +The qemu monitor may for example be used to inject special keys or shut +down the machine quickly. +.PP +To boot with a graphical window, add \f[CR]\-\-qemu\-qui\f[R]: +.IP +.EX +$ mkosi \-d fedora \-\-qemu\-gui qemu +.EE +.PP +A kernel may be booted directly with +\f[CR]mkosi qemu \-kernel ... \-initrd ... \-append \[aq]...\[aq]\f[R]. +This is a bit faster because no boot loader is used, and it is also +easier to experiment with different kernels and kernel commandlines. +Note that despite the name, qemu\[cq]s \f[CR]\-append\f[R] option +replaces the default kernel commandline embedded in the kernel and any +previous \f[CR]\-append\f[R] specifications. +.PP +The UKI is also copied into the output directory and may be booted +directly: +.IP +.EX +$ mkosi qemu \-kernel mkosi.output/fedora\[ti]38/image.efi +.EE +.PP +When booting using an external kernel, we don\[cq]t need the kernel +\f[I]in\f[R] the image, but we would still want the kernel modules to be +installed. +.PP +It is also possible to do a \f[I]direct kernel boot\f[R] into a boot +loader, taking advantage of the fact that \f[CR]systemd\-boot(7)\f[R] is +a valid UEFI binary: +.IP +.EX +$ mkosi qemu \-kernel /usr/lib/systemd/boot/efi/systemd\-bootx64.efi +.EE +.PP +In this scenario, the kernel is loaded from the ESP in the image by +\f[CR]systemd\-boot\f[R]. +.SH REQUIREMENTS +mkosi is packaged for various distributions: Debian, Ubuntu, Arch Linux, +Fedora Linux, OpenMandriva, Gentoo. +Note that it has been a while since the last release and the packages +shipped by distributions are very out of date. +We currently recommend running mkosi from git until a new release +happens. +.PP +mkosi currently requires systemd 254 to build bootable disk images. +.PP +When not using distribution packages make sure to install the necessary +dependencies. +For example, on \f[I]Fedora Linux\f[R] you need: +.IP +.EX +# dnf install bubblewrap btrfs\-progs apt dosfstools mtools edk2\-ovmf e2fsprogs squashfs\-tools gnupg python3 tar xfsprogs xz zypper sbsigntools +.EE +.PP +On Debian/Ubuntu it might be necessary to install the +\f[CR]ubuntu\-keyring\f[R], \f[CR]ubuntu\-archive\-keyring\f[R] and/or +\f[CR]debian\-archive\-keyring\f[R] packages explicitly, in addition to +\f[CR]apt\f[R], depending on what kind of distribution images you want +to build. +.PP +Note that the minimum required Python version is 3.9. +.SH Frequently Asked Questions (FAQ) +.IP \[bu] 2 +Why does \f[CR]mkosi qemu\f[R] with KVM not work on Debian/Ubuntu? +.PP +While other distributions are OK with allowing access to +\f[CR]/dev/kvm\f[R], on Debian/Ubuntu this is only allowed for users in +the \f[CR]kvm\f[R] group. +Because mkosi unshares a user namespace when running unprivileged, even +if the calling user was in the kvm group, when mkosi unshares the user +namespace to run unprivileged, it loses access to the \f[CR]kvm\f[R] +group and by the time we start \f[CR]qemu\f[R] we don\[cq]t have access +to \f[CR]/dev/kvm\f[R] anymore. +As a workaround, you can change the permissions of the device nodes to +\f[CR]0666\f[R] which is sufficient to make KVM work unprivileged. +To persist these settings across reboots, copy +\f[CR]/usr/lib/tmpfiles.d/static\-nodes\-permissions.conf\f[R] to +\f[CR]/etc/tmpfiles.d/static\-nodes\-permissions.conf\f[R] and change +the mode of \f[CR]/dev/kvm\f[R] from \f[CR]0660\f[R] to \f[CR]0666\f[R]. +.SH REFERENCES +.IP \[bu] 2 +\c +.UR https://github.com/systemd/mkosi/ +Primary mkosi git repository on GitHub +.UE \c +.IP \[bu] 2 +\c +.UR https://0pointer.net/blog/mkosi-a-tool-for-generating-os-images.html +mkosi \[em] A Tool for Generating OS Images +.UE \c +\ introductory blog post by Lennart Poettering +.IP \[bu] 2 +\c +.UR https://lwn.net/Articles/726655/ +The mkosi OS generation tool +.UE \c +\ story on LWN +.SH SEE ALSO +\f[CR]systemd\-nspawn(1)\f[R], \f[CR]dnf(8)\f[R] |