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
       --installroot, 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
         distributions 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
              incremental 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
              interactive 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
              repositories 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
              directory),  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  table), 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. image.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
              automatically 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
              enabled (see below), 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 (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
              --secure-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
              current 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
              algorithm.

       --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
              parameters, 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
              automatically 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
              separated  list  of  packages.  This option may be used multiple times in which case the specified
              package 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
              manager 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
              below.

       --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
              automatically  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
              operation  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
              directory  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
              automatically 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
              invoked.  The build script can find the path  to  this  directory  in  the  $BUILDDIR  environment
              variable.   If  this  option is not specified, but a directory mkosi.builddir/ exists in the local
              directory 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
              operate.   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
              systemd-nspawn  container  environment,  and thus does not have access to host resources.  If this
              option is not used, but an executable mkosi.postinst is  found  in  the  local  directory,  it  is
              automatically 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
              environment  when the image is run.  If this setting is not used but an mkosi.nspawn file found in
              the local 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
              command 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
              --default=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
       distribution, as long as the necessary tools are available.  Specifically, any distribution that packages
       debootstrap 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 packages 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
       supported, 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
       partition 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
         continuation  line  of the line before.  Command-line arguments, as shown in the help description, have
         to be included in a  configuration  block  (e.g. “[Packages]”)  corresponding  to  the  argument  group
         (e.g. “Packages”),   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
         packages.   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
         iteration will be the development image, the second iteration will be the final image.  The development
         image 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
         checkout.  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  images 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
         restrictions, 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
         $SRCDIR/$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,
         after 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
         $BUILDROOT points to the root directory of the installation image.  Additional verbs may  be  added  in
         the  future,  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
         subsequent  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
         directory.   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
       generates 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
       distribution  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
          configured with the --cache= option or the mkosi.cache/ directory.  This form of caching relies on the
          distribution’s package manager, and caches distribution  packages  (RPM,  DEB,  ...)  after  they  are
          downloaded, 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
       apply  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
       recompiled: 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
         documentation 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
         requested (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_NETWORK 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
       easiest 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
       debian-archive-keyring  packages  explicitly,  in  addition  to  debootstrap,  depending  on what kind of
       distribution 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-
         images.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)