Provided by: mkosi_5-1ubuntu0.20.04.1_all bug

NAME

       mkosi - Build Legacy-Free OS Images

SYNOPSIS

       mkosi [options...] build

       mkosi [options...] clean

       mkosi [options...] summary

       mkosi [options...] shell [command line...]

       mkosi [options...] boot [command line...]

       mkosi [options...] qemu

DESCRIPTION

       mkosi  is  a  tool for easily building legacy-free OS images.  It’s a fancy wrapper around dnf --install‐
       root, debootstrap, pacstrap and zypper that may generate disk images with a number of bells and whistles.

   Supported output formats
       The following output formats are supported:

       • Raw GPT disk image, with ext4 as root (gpt_ext4)

       • Raw GPT disk image, with xfs as root (gpt_xfs)

       • Raw GPT disk image, with btrfs as root (gpt_btrfs)

       • Raw GPT disk image, with squashfs as read-only root (gpt_squashfs)

       • Plain squashfs image, without partition table, as read-only root (plain_squashfs)

       • Plain directory, containing the OS tree (directory)

       • btrfs subvolume, with separate subvolumes for /var, /home, /srv, /var/tmp (subvolume)

       • Tarball (tar)

       When a GPT disk image is created, the following additional options are available:

       • A swap partition may be added in

       • The image may be made bootable on EFI and BIOS systems

       • Separate partitions for /srv and /home may be added in

       • The root, /srv and /home partitions may optionally be encrypted with LUKS.

       • A dm-verity partition may be added in that adds runtime integrity data for the root partition

   Other features
       • Optionally, create an SHA256SUMS checksum file for the result, possibly even signed via gpg.

       • Optionally, place a specific .nspawn settings file along with the result.

       • Optionally, build a local project’s source tree in the image and add the result to the generated  image
         (see below).

       • Optionally, share RPM/DEB package cache between multiple runs, in order to optimize build speeds.

       • Optionally, the resulting image may be compressed with XZ.

       • Optionally, the resulting image may be converted into a QCOW2 file suitable for qemu storage.

       • Optionally, btrfs’ read-only flag for the root subvolume may be set.

       • Optionally, btrfs’ compression may be enabled for all created subvolumes.

       • By  default  images are created without all files marked as documentation in the packages, on distribu‐
         tions where the package manager supports this.  Use the --with-docs flag to build an  image  with  docs
         added.

   Command Line Verbs
       The following command line verbs are known:

       build  This  builds  the  image,  based  on  the  settings  passed  in on the command line or read from a
              mkosi.default file, see below.  This verb is the default if no verb is explicitly specified.  This
              command must be executed as root.

       clean  Remove build artifacts generated on a previous build.  If combined with -f, also removes incremen‐
              tal build cache images.  If -f is specified twice, also removes any package cache.

       summary
              Outputs a human-readable summary of all options used for building an image.  This will  parse  the
              command line and mkosi.default file as it would do on build, but only output what it is configured
              for and not actually build anything.`

       shell  This builds the image if it is not build yet, and then invokes systemd-nspawn to acquire an inter‐
              active  shell  prompt in it.  If this verb is used an optional command line may be specified which
              is then invoked in place of the shell in the container.  Combine this with -f in order to  rebuild
              the image unconditionally before acquiring the shell, see below.  This command must be executed as
              root.

       boot   Similar  to  shell  but boots the image up using systemd-nspawn.  If this verb is used an optional
              command line may be specified which is passed as “kernel command line” to the init system  in  the
              image.

       qemu   Similar  to  boot  but uses qemu to boot up the image, i.e. instead of container virtualization VM
              virtualization is used.  This verb is only  supported  on  images  that  contain  a  boot  loader,
              i.e. those  built  with  --bootable (see below).  This command must be executed as root unless the
              image already exists and -f is not specified.

       help   This verb is equivalent to the --help switch documented below: it shows a brief usage explanation.

   Command Line Parameters
       The following command line parameters are understood.  Note that many of these parameters can also be set
       in the mkosi.default file, for details see the table below.

       --distribution=, -d
              The distribution to install in the image.  Takes one of the following arguments:  fedora,  debian,
              ubuntu,  arch, opensuse, mageia, centos, clear.  If not specified, defaults to the distribution of
              the host.

       --release=, -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, CentOS,
              ...,  e.g. 29),  or a distribution version name (in case of Debian, Ubuntu, ..., e.g. artful).  If
              neither this option, not --distribution= is specified, defaults to the distribution version of the
              host.  If the distribution is specified, defaults to a recent version of it.

       --mirror=, -m
              The mirror to use for downloading the distribution packages.  Expects a mirror URL as argument.

       --repositories=
              Additional package repositories to use during installation.  Expects one or more URLs as argument,
              separated by commas.  This option may be used multiple times, in which case the list of  reposito‐
              ries to use is combined.

       --architecture=
              The  architecture  to  build the image for.  Note that this currently only works for architectures
              compatible with the host’s architecture.

       --format=, -t
              The image format type to generate.  One of directory (for generating OS images inside a local  di‐
              rectory),  subvolume (similar, but as a btrfs subvolume), tar (similar, but a tarball of the image
              is generated), gpt_ext4 (a block device image with an ext4 file system inside a GPT partition  ta‐
              ble),  gpt_xfs  (similar, but with an xfs file system), gpt_btrfs (similar, but with an btrfs file
              system), gpt_squashfs (similar, but with a squashfs file system), plain_squashfs (a plain squashfs
              file system without a partition table).

       --output=, -o
              Path for the output image file to generate.  Takes a relative or absolute path where the generated
              image will be placed.  If neither this option nor --output-dir= is used (see below), the image  is
              generated  under  the  name image, but its name suffixed with an appropriate file suffix (e.g. im‐
              age.raw.xz in case gpt_ext4 is used in combination with --xz).

       --output-dir=, -O
              Path to a directory where to place all generated artifacts (i.e. the SHA256SUMS file and similar).
              If this is not specified and a directory mkosi.output/ exists in the local directory it  is  auto‐
              matically  used  for  this purpose.  If this is not specified and such a directory does not exist,
              all output artifacts are placed adjacent to the output image file.

       --force, -f
              Replace the output file if it already exists, when building an image.  By default when building an
              image and an output artifact already exists mkosi will refuse operation.  Specify -f to delete all
              build artifacts from a previous run before re-building the image.  If incremental builds  are  en‐
              abled  (see  below), specifying this option twice will ensure the intermediary cache files are re‐
              moved, too, before the re-build is initiated.  If a package cache is used (see below),  specifying
              this option thrice will ensure the package cache is removed too, before the re-build is initiated.
              For  the  clean operation -f 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.

       --bootable, -b
              Generate  a bootable image.  By default this will generate an image bootable on UEFI systems.  Use
              --boot-protocols= to select support for a different boot protocol.

       --boot-protocols=
              Pick one or more boot protocols to support when generating  a  bootable  image,  as  enabled  with
              --bootable  above.  Takes a comma-separated list of uefi or bios.  May be specified more than once
              in which case the specified lists are merged.  If uefi is specified the sd-boot UEFI  boot  loader
              is used, if bios is specified the GNU Grub boot loader is used.

       --kernel-command-line=
              Use the specified kernel command line for when building bootable images.

       --secure-boot
              Sign the resulting kernel/initrd image for UEFI SecureBoot

       --secure-boot-key=
              Path to the PEM file containing the secret key for signing the UEFI kernel image, if --secure-boot
              is used.

       --secure-boot-certificate=
              Path  to  the  X.509  file  containing  the certificate for the signed UEFI kernel image, if --se‐
              cure-boot is used.

       --read-only
              Make root file system read-only.  Only applies to gpt_ext4, gpt_xfs, gpt-btrfs,  subvolume  output
              formats, and implied on gpt_squashfs and plain_squashfs.

       --encrypt
              Encrypt  all partitions in the file system or just the root file system.  Takes either all or data
              as argument.  If all the root, /home and /srv file systems will be encrypted  using  dm-crypt/LUKS
              (with its default settings).  If data the root file system will be left unencrypted, but /home and
              /srv  will be encrypted.  The passphrase to use is read from the mkosi.passphrase file in the cur‐
              rent working directory (see below).  Note that the UEFI System Partition (ESP) containing the boot
              loader and kernel to boot is never encrypted since it needs to be accessible by the firmware.

       --verity
              Add an “Verity” integrity partition to the image.  If enabled, the  root  partition  is  protected
              with dm-verity against off-line modification, the verification data is placed in an additional GPT
              partition.  Implies --read-only.

       --compress=
              Compress  the  generated  file  systems.   Only  applies  to  gpt_btrfs,  subvolume, gpt_squashfs,
              plain_squashfs.  Takes one of zlib, lzo, zstd, lz4, xz or a boolean value  as  argument.   If  the
              latter  is used compression is enabled/disabled and the default algorithm is used.  In case of the
              squashfs output formats compression is implied, however this option may be used to select the  al‐
              gorithm.

       --mksquashfs=
              Set  the  path to the mksquashfs executable to use.  This is useful in case the parameters for the
              tool shall be augmented, as the tool may be replaced by a script invoking it with the right  para‐
              meters, this way.

       --xz   Compress  the  resulting  image  with  xz.   This  only  applies  to gpt_ext4, gpt_xfs, gpt_btrfs,
              gpt_squashfs and is implied for tar.  Note that when applied to the block device image types  this
              means  the  image  cannot be started directly but needs to be decompressed first.  This also means
              that the shell, boot, qemu verbs are not available when this option is used.

       --qcow2
              Encode the resulting image  as  QEMU  QCOW2  image.   This  only  applies  to  gpt_ext4,  gpt_xfs,
              gpt_btrfs,  gpt_squashfs.  QCOW2 images can be read natively by qemu, but not by the Linux kernel.
              This means the shell and boot verbs are not available when this option is used, however qemu  will
              work.

       --hostname=
              Set the image’s hostname to the specified name.

       --no-chown
              By  default,  if  mkosi  is  run inside a sudo environment all generated artifacts have their UNIX
              user/group ownership changed to the user which invoked sudo.  With this option this may be  turned
              off and all generated files are owned by root.

       --incremental, -i
              Enable  incremental build mode.  This only applies if the two-phase mkosi.build build script logic
              is used.  In this mode, a copy of the OS image is created immediately after all  OS  packages  are
              unpacked  but  before  the  mkosi.build script is invoked in the development container.  Similar a
              copy of the final image is created immediately before the build  artifacts  from  the  mkosi.build
              script  are  copied in.  On subsequent invocations of mkosi with the -i switch these cached images
              may be used to skip the OS package unpacking, thus drastically speeding up repetitive build times.
              Note that when this is used and a pair of cached incremental images exists they are not  automati‐
              cally regenerated, even if options such as --packages= are modified.  In order to force rebuilding
              of  these  cached images, combined -i with -ff, which ensures the cached images are removed first,
              and then re-created.

       --package=, -p
              Install the specified distribution packages (i.e. RPM, DEB, ...) in the image.  Takes a comma sep‐
              arated list of packages.  This option may be used multiple times in which case the specified pack‐
              age list is combined.  Packaged specified this way will be installed both in the  development  and
              the final image (see below).  Use --build-package= (see below) to specify packages that shall only
              be used for the image generated in the build image, but that shall not appear in the final image.

       --with-docs
              Include  documentation in the image built.  By default if the underlying distribution package man‐
              ager supports it documentation is not included in the image  built.   The  $WITH_DOCS  environment
              variable  passed  to the mkosi.build script indicates whether this option was used or not, see be‐
              low.

       --without-tests, -T
              If set the $WITH_TESTS environment variable is set to 0 when the mkosi.build  script  is  invoked.
              This  is  supposed to be used by the build script 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
              mkosi.build build script honors it.

       --cache=
              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 mkosi.cache/ directory is found in the local directory it is auto‐
              matically used for this purpose (also see below).  The directory configured this  way  is  mounted
              into both the development and the final image while the package manager is running.

       --extra-tree=
              Takes a path to a directory to copy on top of the OS tree the package manager generated.  Use this
              to  override any default configuration files shipped with the distribution.  If this option is not
              used, but the mkosi.extra/ directory is found in the local directory it is automatically used  for
              this  purpose  (also see below).  Instead of a directory a tar file may be specified too.  In this
              case it is unpacked into the OS tree before the package manager is invoked.  This mode  of  opera‐
              tion  allows  setting permissions and file ownership explicitly, in particular for projects stored
              in a version control system such as git which does retain full  file  ownership  and  access  mode
              metadata  for  committed  files.  If a tar file mkosi.extra.tar is found in the local directory it
              automatically used for this purpose.

       --skeleton-tree=
              Takes a path to a directory to copy into the OS tree before invoking  the  package  manager.   Use
              this  to  insert  files  and  directories into the OS tree before the package manager installs any
              packages.  If this option is not used, but the mkosi.skeleton/ directory is found in the local di‐
              rectory it is automatically used for this purpose (also see below).  As with the extra tree  logic
              above,  instead of a directory a tar file may be used too, and mkosi.skeleton.tar is automatically
              used.

       --build-script=
              Takes a path to an executable that is used as build script for this image.  If this option is used
              the build process will be two-phased instead of single-phased (see below).  The  specified  script
              is  copied onto the development image and executed inside an systemd-nspawn container environment.
              If this option is not used, but the mkosi.build file found in the local directory it is  automati‐
              cally used for this purpose (also see below).

       --build-sources=
              Takes a path of a source tree to copy into the development image, if a build script is used.  This
              only   applies   if   a  build  script  is  used,  and  defaults  to  the  local  directory.   Use
              --source-file-transfer= to configure how the files are transferred from the host to the  container
              image.

       --build-dir=
              Takes  a  path of a directory to use as 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.   This  directory  is mounted into the development image when the build script is in‐
              voked.  The build script can find the path to this directory in the  $BUILDDIR  environment  vari‐
              able.  If this option is not specified, but a directory mkosi.builddir/ exists in the local direc‐
              tory it is automatically used for this purpose (also see below).

       --build-package=
              Similar  to  --package=,  but configures packages to install only in the first phase of the build,
              into the development image.  This option should be used to list packages containing header  files,
              compilers,  build  systems, linkers and other build tools the mkosi.build script requires to oper‐
              ate.  Note that packages listed here are only included in the image created during the first phase
              of the build, and are absent in the final image.  use --package= to list packages  that  shall  be
              included in both.

       --postinst-script=
              Takes  a  path  to an executable that is invoked inside the final image right after copying in the
              build artifacts generated in the first phase of the build.  This script is invoked inside  a  sys‐
              temd-nspawn  container  environment, and thus does not have access to host resources.  If this op‐
              tion is not used, but an executable mkosi.postinst is found in the local directory, it is automat‐
              ically used for this purpose (also see below).

       --finalize-script=
              Takes a path to an executable that is invoked outside the final image right after copying  in  the
              build  artifacts  generated  in  the  first  phase  of  the  build,  and after having executed the
              mkosi.postinst script (see above).  This script is invoked directly in the host  environment,  and
              hence  has  full  access  to  the host’s resources.  If this option is not used, but an executable
              mkosi.finalize is found in the local directory, it is automatically used for  this  purpose  (also
              see below).

       --source-file-transfer=
              Configures  how the source file tree (as configured with --build-sources=) is transferred into the
              container image during the first phase of the build.  Takes one of copy-all  (to  copy  all  files
              from  the  source  tree),  copy-git-cached (to copy only those files git-ls-files --cached lists),
              copy-git-others (to copy only those files git-ls-files --others lists), mount to  bind  mount  the
              source  tree  directly.   Defaults  to copy-git-cached if a git source tree is detected, otherwise
              copy-all.

       --with-network
              Enables network connectivity while the build script mkosi.build is invoked.  By default, the build
              script runs with networking turned off.  The $WITH_NETWORK environment variable is passed  to  the
              mkosi.build build script indicating whether the build is done with or without this option.

       --settings=
              Specifies  a  .nspawn  settings file for systemd-nspawn to use in the boot and shell verbs, and to
              place next to the generated image file.  This is useful to configure the  systemd-nspawn  environ‐
              ment when the image is run.  If this setting is not used but an mkosi.nspawn file found in the lo‐
              cal directory it is automatically used for this purpose (also see below).

       --root-size=
              Takes  a size in bytes for the root file system.  The specified numeric value may be suffixed with
              K, M, G to indicate kilo-, mega- and gigabytes (all to the base of 1024).  This applies to  output
              formats  gpt_ext4,  gpt_xfs,  gpt_btrfs.   Defaults to 1G, except for gpt_xfs where it defaults to
              1.3G.

       --esp-size=
              Similar, and configures the size of the UEFI System Partition (ESP).  This is only relevant if the
              --bootable option is used to generate a bootable image.  Defaults to 256M.

       --swap-size=
              Similar, and configures the size of a swap partition on the image.  If omitted no  swap  partition
              is created.

       --home-size=
              Similar,  and  configures the size of the /home partition.  If omitted no separate /home partition
              is created.

       --srv-size=
              Similar, and configures the size of the /srv partition.  If omitted no separate /srv partition  is
              created.

       --checksum
              Generate a SHA256SUMS file of all generated artifacts after the build is complete.

       --sign Sign the generated SHA256SUMS using gpg after completion.

       --key= Select  the  gpg  key  to  use  for  signing SHA256SUMS.  This key is required to exist in the gpg
              keyring already.

       --bmap Generate a bmap file for usage with bmaptool from the generated image file.

       --password=
              Set the password of the root user.  By default the root account is locked.  If this option is  not
              used but a file mkosi.rootpw exists in the local directory the root password is automatically read
              from it.

       --extra-search-paths=
              List of colon-separated paths to look for tools in, before using the regular $PATH search path.

       --directory=, -C
              Takes  a  path to a directory.  mkosi switches to this directory before doing anything.  Note that
              the various mkosi.* files are searched for only after changing to this directory, hence using this
              option is an effective way to build a project located in a specific directory.

       --default=
              Loads additional settings from the specified settings file.  Most command line options may also be
              configured in a settings file.  See the table below to see which command line options match  which
              settings  file option.  If this option is not used, but a file mkosi.default is found in the local
              directory it is automatically used for this purpose.  If a setting is configured both on the  com‐
              mand  line  and  in  the settings file, the command line generally wins, except for options taking
              lists in which case both lists are combined.

       --all, -a
              Iterate through all files mkosi.* in the mkosi.files/ subdirectory, and build  each  as  if  --de‐
              fault=mkosi.files/mkosi.... was invoked.  This is a quick way to build a large number of images in
              one  go.   Any  additional  specified  command line arguments override the relevant options in all
              files processed this way.

       --all-directory=
              If specified, overrides the directory the --all logic described above looks for settings files in.
              If unspecified, defaults to mkosi.files/ in the current working directory (see above).

       --version
              Show package version.

       --help, -h
              Show brief usage information.

   Command Line Parameters and their Settings File Counterparts
       Most command line parameters may also be placed in an mkosi.default settings  file  (or  any  other  file
       --default=  is  used on).  The following table shows which command lines parameters correspond with which
       settings file options.

       Command Line Parameter       mkosi.default section   mkosi.default setting
       ─────────────────────────────────────────────────────────────────────────────
       --distribution=, -d          [Distribution]          Distribution=
       --release=, -r               [Distribution]          Release=
       --repositories=              [Distribution]          Repositories=
       --mirror=, -m                [Distribution]          Mirror=
       --architecture=              [Distribution]          Architecture=
       --format=, -t                [Output]                Format=
       --output=, -o                [Output]                Output=
       --output-dir=, -O            [Output]                OutputDirectory=
       --force, -f                  [Output]                Force=
       --bootable, -b               [Output]                Bootable=
       --boot-protocols=            [Output]                BootProtocols=
       --kernel-command-line=       [Output]                KernelCommandLine=
       --secure-boot                [Output]                SecureBoot=
       --secure-boot-key=           [Output]                SecureBootKey=
       --secure-boot-certificate=   [Output]                SecureBootCertificate=
       --read-only                  [Output]                ReadOnly=
       --encrypt=                   [Output]                Encrypt=
       --verity=                    [Output]                Verity=
       --compress=                  [Output]                Compress=
       --mksquashfs=                [Output]                Mksquashfs=
       --xz                         [Output]                XZ=
       --qcow2                      [Output]                QCow2=
       --hostname=                  [Output]                Hostname=
       --package=                   [Packages]              Packages=
       --with-docs                  [Packages]              WithDocs=
       --without-tests, -T          [Packages]              WithTests=
       --cache=                     [Packages]              Cache=
       --extra-tree=                [Packages]              ExtraTrees=
       --skeleton-tree=             [Packages]              SkeletonTrees=
       --build-script=              [Packages]              BuildScript=
       --build-sources=             [Packages]              BuildSources=
       --source-file-transfer=      [Packages]              SourceFileTransfer=
       --build-directory=           [Packages]              BuildDirectory=
       --build-packages=            [Packages]              BuildPackages=
       --postinst-script=           [Packages]              PostInstallationScript=
       --finalize-script=           [Packages]              FinalizeScript=
       --with-network               [Packages]              WithNetwork=
       --settings=                  [Packages]              NSpawnSettings=
       --root-size=                 [Partitions]            RootSize=
       --esp-size=                  [Partitions]            ESPSize=
       --swap-size=                 [Partitions]            SwapSize=
       --home-size=                 [Partitions]            HomeSize=
       --srv-size=                  [Partitions]            SrvSize=
       --checksum                   [Validation]            CheckSum=
       --sign                       [Validation]            Sign=
       --key=                       [Validation]            Key=
       --bmap                       [Validation]            BMap=
       --password=                  [Validation]            Password=
       --extra-search-paths=        [Host]                  ExtraSearchPaths=

       Command line options that take no argument are not suffixed with a = in their long version in  the  table
       above.   In  the  mkosi.default file they are modeled as boolean option that take either 1, yes, true for
       enabling, and 0, no, false for disabling.

   Supported distributions
       Images may be created containing installations of the following OSes.

       • FedoraDebianUbuntuArch LinuxopenSUSEMageiaCentOSClear Linux

       In theory, any distribution may be used on the host for building images containing  any  other  distribu‐
       tion, as long as the necessary tools are available.  Specifically, any distribution that packages deboot‐
       strap  may  be  used to build Debian or Ubuntu images.  Any distribution that packages dnf may be used to
       build Fedora or Mageia images.  Any distro that packages pacstrap may be used to build Arch Linux images.
       Any distribution that packages zypper may be used to build openSUSE images.  Any distribution that  pack‐
       ages yum (or the newer replacement dnf) may be used to build CentOS images.

       Currently, Fedora packages all relevant tools as of Fedora 28.

   Compatibility
       Generated  images are legacy-free.  This means only GPT disk labels (and no MBR disk labels) are support‐
       ed, and only systemd based images may be generated.

       All generated GPT disk images may be booted in a local container directly with:

              systemd-nspawn -bi image.raw

       Additionally, bootable GPT disk images (as created with the --bootable flag) work when booted directly by
       EFI and BIOS systems, for example in KVM via:

              qemu-kvm -m 512 -smp 2 -bios /usr/share/edk2/ovmf/OVMF_CODE.fd -drive format=raw,file=image.raw

       EFI bootable GPT images are larger than plain GPT images, as they additionally carry an EFI system parti‐
       tion containing a boot loader, as well as a kernel, kernel modules, udev and more.

       All directory or btrfs subvolume images may be booted directly with:

              systemd-nspawn -bD image

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 source tree.  Specifically,
       the following files are used if they exist in the local directory:

       • mkosi.default  may be used to configure mkosi’s image building process.  For example, you may configure
         the distribution to use (fedora, ubuntu, debian, arch, opensuse, mageia) for the image,  or  additional
         distribution packages to install.  Note that all options encoded in this configuration file may also be
         set on the command line, and this file is hence little more than a way to make sure simply typing mkosi
         without  further parameters in your source tree is enough to get the right image of your choice set up.
         Additionally if a mkosi.default.d directory exists, each file in  it  is  loaded  in  the  same  manner
         adding/overriding  the  values specified in mkosi.default.  The file format is inspired by Windows .ini
         files and supports multi-line assignments: any line with initial whitespace is considered  a  continua‐
         tion line of the line before.  Command-line arguments, as shown in the help description, have to be in‐
         cluded  in  a  configuration block (e.g. “[Packages]”) corresponding to the argument group (e.g. “Pack‐
         ages”), and the argument gets converted as follows:  “–with-network”  becomes  “WithNetwork=yes”.   For
         further details see the table above.

       • mkosi.extra/  or  mkosi.extra.tar  may  be respectively a directory or archive.  If any exist all files
         contained in it are copied over the directory tree of the image after the OS was installed.   This  may
         be  used  to add in additional files to an image, on top of what the distribution includes in its pack‐
         ages.  When using a directory file ownership is not preserved: all files copied will be owned by  root.
         To preserve ownership use a tar archive.

       • mkosi.skeleton/  or mkosi.skeleton.tar may be respectively a directory or archive, and they work in the
         same way as mkosi.extra/mkosi.skeleton.tar.  However the files are copied before anything  else  so  to
         have  a skeleton tree for the OS.  This allows to change the package manager and create files that need
         to be there before anything is installed.  When using a directory file ownership is not preserved:  all
         files copied will be owned by root.  To preserve ownership use a tar archive.

       • mkosi.build  may be an executable script.  If it exists the image will be built twice: the first itera‐
         tion will be the development image, the second iteration will be the final image.  The development  im‐
         age  is  used  to  build  the project in the current working directory (the source tree).  For that the
         whole directory is copied into the image, along with the mkosi.build build script.  The script is  then
         invoked  inside  the  image  (via  systemd-nspawn), with $SRCDIR pointing to the source tree.  $DESTDIR
         points to a directory where the script should place any files generated it would like to end up in  the
         final  image.   Note that make/automake/meson based build systems generally honor $DESTDIR, thus making
         it very natural to build source trees from the build script.  After the development image was built and
         the build script ran inside of it, it is removed again.  After that the final image is  built,  without
         any  source tree or build script copied in.  However, this time the contents of $DESTDIR are added into
         the image.

         When the source tree is copied into the build image, all files are copied, except for  mkosi.builddir/,
         mkosi.cache/  and mkosi.output/.  That said, .gitignore is respected if the source tree is a git check‐
         out.  If multiple different images shall be built from the same source tree it’s essential  to  exclude
         their  output files from this copy operation, as otherwise a version of an image built earlier might be
         included in a later build, which is usually not intended.  An alternative to excluding these built  im‐
         ages  via .gitignore entries is making use of the mkosi.output/ directory (see below), which is an easy
         way to exclude all build artifacts.

       • mkosi.postinst may be an executable script.  If it exists it is invoked  as  the  penultimate  step  of
         preparing  an  image,  from  within the image context.  It is once called for the development image (if
         this is enabled, see above) with the “build” command line parameter, right before  invoking  the  build
         script.   It is called a second time for the final image with the “final” command line parameter, right
         before the image is considered complete.  This script may be used to alter the images without  any  re‐
         strictions,  after  all software packages and built sources have been installed.  Note that this script
         is executed directly in the image context with the final root directory  in  place,  without  any  $SR‐
         CDIR/$DESTDIR setup.

       • mkosi.finalize  may  be  an executable script.  If it exists it is invoked as last step of preparing an
         image, from the host system.  It is once called for the development image  (if  this  is  enabled,  see
         above)  with the “build” command line parameter, as the last step before invoking the build script, af‐
         ter the mkosi.postinst script is invoked.  It is called the second time with the “final”  command  line
         parameter  as  the last step before the image is considered complete.  The environment variable $BUILD‐
         ROOT points to the root directory of the installation image.  Additional verbs may be added in the  fu‐
         ture,  the script should be prepared for that.  This script may be used to alter the images without any
         restrictions, after all software packages and built sources have been installed.  This script  is  more
         flexible  than  mkosi.postinst  in two regards: it has access to the host file system so it’s easier to
         copy in additional files or to modify the image based on external configuration, and the script is  run
         in the host, so it can be used even without emulation even if the image has a foreign architecture.

       • mkosi.mksquashfs-tool may be an executable script.  If it exists is is called instead of mksquashfs.

       • mkosi.nspawn  may  be an nspawn settings file.  If this exists it will be copied into the same place as
         the output image file.  This is useful since nspawn looks for settings files next  to  image  files  it
         boots, for additional container runtime settings.

       • mkosi.cache/  may  be a directory.  If so, it is automatically used as package download cache, in order
         to speed repeated runs of the tool.

       • mkosi.builddir/ may be a directory.  If so, it is automatically used as out-of-tree build directory, if
         the build commands in the mkosi.build script support it.  Specifically, this directory will be  mounted
         into  the  build  container,  and  the  $BUILDDIR environment variable will be set to it when the build
         script is invoked.  The 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  mkosi  is
         used  in incremental mode (-i): not only the disk images but also the build tree is reused between sub‐
         sequent invocations.  Note that if this directory does not exist the $BUILDDIR environment variable  is
         not  set,  and it is up to build script to decide whether to do in in-tree or an out-of-tree build, and
         which build directory to use.

       • mkosi.rootpw may be a file containing the password for the root user of the image to set.  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’s default root password is
         set (which usually means access to the root user is blocked).

       • mkosi.passphrase may be a passphrase file 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
         /etc/crypttab  expect  the  passphrase  files).  The file must have an access mode of 0600 or less.  If
         this file does not exist and encryption is requested the user is queried instead.

       • mkosi.secure-boot.crt and mkosi.secure-boot.key may contain an X.509 certificate and PEM private key to
         use when UEFI SecureBoot support is enabled.  All EFI binaries included in the image’s ESP  are  signed
         with this key, as a late step in the build process.

       • mkosi.output/  may  be a directory.  If it exists, and the image output path is not configured (i.e. no
         --output= setting specified), or configured to a filename (i.e. a path containing no /  character)  all
         build artifacts (that is: the image itself, the root hash file in case Verity is used, the checksum and
         its  signature  if that’s enabled, and the nspawn settings file if there is any) are placed in this di‐
         rectory.  Note that this directory is not used if the image output path contains at  least  one  slash,
         and has no effect in that case.  This setting is particularly useful if multiple different images shall
         be  built  from  the  same working directory, as otherwise the build result of a preceding run might be
         copied into a build image as part of the source tree (see above).

       All these files are optional.

       Note that the location of all these files may also be  configured  during  invocation  via  command  line
       switches,  and  as  settings  in  mkosi.default,  in  case  the default settings are not acceptable for a
       project.

BUILD PHASES

       If no build script mkosi.build (see above) is used the build consists of a single phase only:  the  final
       image  is generated as the combination of mkosi.skeleton/ (see above), the unpacked distribution packages
       and mkosi.extra/.

       If a build script mkosi.build is used the build consists of two phases:  in  the  the  first  development
       phase  an image that includes necessary build tools (i.e. the combination of Packages= and BuildPackages=
       is installed) is generated (i.e. the combination of mkosi.skeleton/ and unpacked distribution  packages).
       Into this image the source tree is copied and mkosi.build executed.  The artifacts the mkosi.build gener‐
       ates  are  saved.  Then, the second final phase starts: an image that excludes the build tools (i.e. only
       Packages= is installed, BuildPackages= is not) is generated.  This time the build  artifacts  saved  from
       the first phase are copied in, and mkosi.extra copied on top, thus generating the final image.

       The  two-phased  approach  ensures that source tree is executed in a clean and comprehensive environment,
       while at the same the final image remains minimal and contains only those packages necessary at  runtime,
       but avoiding those necessary at build-time.

       Note that only the package cache mkosi.cache/ (see below) is shared between the two phases.  The distrib‐
       ution  package manager is executed exactly once in each phase, always starting from a directory tree that
       is populated with mkosi.skeleton but nothing else.

CACHING

       mkosi supports three different caches for speeding up repetitive re-building of images.  Specifically:

       1. The package cache of the distribution package manager may be cached between builds.  This  is  config‐
          ured  with the --cache= option or the mkosi.cache/ directory.  This form of caching relies on the dis‐
          tribution’s package manager, and caches distribution packages (RPM, DEB, ...)  after  they  are  down‐
          loaded, but before they are unpacked.

       2. If  an mkosi.build script is used, by enabling incremental build mode with --incremental (see above) a
          cached copy of the development and final images can be made immediately before the build  sources  are
          copied in (for the development image) or the artifacts generated by mkosi.build 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 switch.

       3. Finally, between multiple builds the build artifact directory may be shared, using the mkosi.builddir/
          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 the mkosi.build build script.

       The package cache (i.e. the first item above) is unconditionally useful.  The latter two caches only  ap‐
       ply  to  uses  of  mkosi  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  recom‐
       piled: an OS image rebuilt will be almost as quick to build the source tree only.

ENVIRONMENT VARIABLES

       The build script mkosi.build receives the following environment variables:

       • $SRCDIR contains the path to the sources to build.

       • $DESTDIR is a directory into which any artifacts generated by the build script shall be placed.

       • $BUILDDIR  is  only defined if mkosi.builddir 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.

       • $WITH_DOCS  is  either  0 or 1 depending on whether a build without or with installed documentation was
         requested (see --with-docs above).  The build script should suppress installation of any package  docu‐
         mentation to $DESTDIR in case $WITH_DOCS is set to 0.

       • $WITH_TESTS is either 0or 1 depending on whether a build without or with running the test suite was re‐
         quested  (see  --without-tests  above).   The build script should avoid running any unit or integration
         tests in case $WITH_TESTS is 0.

       • $WITH_NETWORK is either 0or 1 depending on whether a build without or with networking is being executed
         (see --with-network above).  The build script should avoid any network communication in case $WITH_NET‐
         WORK is 0.

EXAMPLES

       Create and run a raw GPT image with ext4, as image.raw:

              # mkosi
              # systemd-nspawn -b -i image.raw

       Create and run a bootable btrfs GPT image, as foobar.raw:

              # mkosi -t gpt_btrfs --bootable -o foobar.raw
              # systemd-nspawn -b -i foobar.raw
              # qemu-kvm -m 512 -smp 2 -bios /usr/share/edk2/ovmf/OVMF_CODE.fd -drive format=raw,file=foobar.raw

       Create and run a Fedora image into a plain directory:

              # mkosi -d fedora -t directory -o quux
              # systemd-nspawn -b -D quux

       Create a compressed image image.raw.xz and add a checksum file, and install SSH into it:

              # mkosi -d fedora -t gpt_squashfs --checksum --xz --package=openssh-clients

       Inside the source directory of an automake-based project, configure mkosi so that simply  invoking  mkosi
       without any parameters builds an OS image containing a built version of the project in its current state:

              # cat > mkosi.default <<EOF
              [Distribution]
              Distribution=fedora
              Release=24

              [Output]
              Format=gpt_btrfs
              Bootable=yes

              [Packages]
              Packages=openssh-clients httpd
              BuildPackages=make gcc libcurl-devel
              EOF
              # cat > mkosi.build <<EOF
              #!/bin/sh
              cd $SRCDIR
              ./autogen.sh
              ./configure --prefix=/usr
              make -j `nproc`
              make install
              EOF
              # chmod +x mkosi.build
              # mkosi
              # systemd-nspawn -bi image.raw

       To create a Fedora image with hostname:

              # mkosi -d fedora --hostname image

       Also you could set hostname in configuration file:

              # cat mkosi.default
              ...
              [Output]
              Hostname=image
              ...

REQUIREMENTS

       mkosi  is packaged for various distributions: Debian, Ubuntu, Arch (in AUR), Fedora.  It is usually easi‐
       est to use the distribution package.

       The current version requires systemd 233 (or actually, systemd-nspawn of it).

       When not using distribution packages make sure to install the necessary dependencies.   For  example,  on
       Fedora you need:

              dnf install arch-install-scripts btrfs-progs debootstrap dosfstools edk2-ovmf e2fsprogs squashfs-tools gnupg python3 tar veritysetup xfsprogs xz zypper sbsigntools

       On  Debian/Ubuntu  it might be necessary to install the ubuntu-keyring, ubuntu-archive-keyring and/or de‐
       bian-archive-keyring packages explicitly, in addition to debootstrap, depending on what kind of distribu‐
       tion images you want to build.  debootstrap on Debian only pulls in the Debian keyring on  its  own,  and
       the version on Ubuntu only the one from Ubuntu.

       Note that the minimum required Python version is 3.6.

REFERENCES

       • Primary mkosi git repository on GitHub (https://github.com/systemd/mkosi/)

       • mkosi  —  A  Tool for Generating OS Images (http://0pointer.net/blog/mkosi-a-tool-for-generating-os-im‐
         ages.html) introductory blog post by Lennart Poettering

       • The mkosi OS generation tool (https://lwn.net/Articles/726655/) story on LWN

SEE ALSO

       systemd-nspawn(1), dnf(8), debootstrap(8)

AUTHORS

       The mkosi Authors.

                                                      2016-                                             mkosi(1)