Daan De Meyer [Mon, 28 Aug 2023 11:24:59 +0000 (13:24 +0200)]
Rework ini file parsing
Python's configparser module is rather inadequate for our purposes.
Specifically, it's built around every setting only being specified once
in a config file and even though we got it to kind of parse more than
one of the same setting with our own custom dict type, there's a lot of
limitations involved. Specifically, assigning the empty value is
impossible with the current approach. To avoid all these issues, let's
introduce our own ini parser.
This also splits off the matching logic into a new method match_config()
and moves setting the debugging level just after we've parsed CLI options
so we get debug messages from the parser as well.
Daan De Meyer [Mon, 28 Aug 2023 09:35:23 +0000 (11:35 +0200)]
Read paths after parsing configuration files
Let's first take into account the main configuration file before parsing
any configured paths. This allow the main configuration files to reset
any configured settings without resetting its own defaults configured via
paths.
Daan De Meyer [Thu, 31 Aug 2023 09:37:55 +0000 (11:37 +0200)]
Ignore ssh configuration files when running ssh
When in a user namespace, the ssh config files from /etc/ will be
owned by nobody which makes ssh fail. Let's ignore these configuration
files when running ssh to avoid such failures.
Paul Meyer [Fri, 25 Aug 2023 14:53:08 +0000 (16:53 +0200)]
normalize mtime
If set, the time stamp from SOURCE_DATE_EPOCH is used to normalize
mtime of files. We also need to pass the environment trough when
mkosi is invoking itself.
Blair Bonnett [Tue, 29 Aug 2023 12:43:52 +0000 (14:43 +0200)]
Disable index and metacopy options of overlayfs.
If these are enabled (e.g., if the kernel enables them by default), the
mount will fail if the upper directory has been earlier used with a
different lower directory, such as with a build overlay that was
generated on top of a different temporary root.
Daan De Meyer [Fri, 25 Aug 2023 07:27:53 +0000 (09:27 +0200)]
Support configuring default values for settings
This allows configuring the default value for a setting. This is
useful to set a custom default value for a setting while still
allowing an explicit value from the CLI to take precedence.
To make this work properly in combination with default_factory, we
also introduce a new default_factory_depends field that lists all
the other settings that a setting's default_factory implementation
depends on. Then, when we finalize a setting's default value, we also
finalize the default value of settings it depends on so that its
default_factory function can do the right thing.
We also integrate the "paths" field from MkosiConfigSetting in this.
By default, paths will modify the defaults namespace instead of the
regular namespace, meaning their values will only be used if the
setting is not explicitly configured. The only exception to this are
mkosi.extra/, mkosi.skeleton/ and mkosi.repart/, whose values are just
merged with any explicitly specified directories.
Joerg Behrmann [Fri, 25 Aug 2023 12:30:19 +0000 (14:30 +0200)]
doc: make formatting more uniform
- Quotes are exchanged in favour of emphasis markers. Emphasis for terms,
strong emphasis section names.
- Section names formatted as truetype/monospace are exchanged from strong
emphasis.
- Section names are written consistently.
- Literals for settings, setting snippets and paths are formatted as
monospace.
- Paragraphs that are formmated incorrectly in the markdown extensions for
definition lists (using :) are moved such, that generate a single visual
block in the pandoc generated man page.
- Superfluous quotes are removed.
- A numbered list is used for the execution flow to make it easier to follow
and to visually seperate it from the list of mounted directories.
- URLs are formatted as links with adjacent text, since this formats them
less bare in the generated man page.
- The remaning http URL is moved to https
Daan De Meyer [Thu, 24 Aug 2023 10:25:47 +0000 (12:25 +0200)]
Drop "first assignment wins" logic
From experience in the systemd repository's usage of presets, we've
learned that we want to have fixed values for certain settings for
presets that cannot be overridden by either the CLI options or by
global config. Good examples are that the Format= of a base image
should always be "directory" and the Format= of an initrd image
should always be "cpio" or that Bootable= should always be "no" for
both the base image and the initrd image and their list of packages
should not be affected by any packages specified on the CLI.
The issue is that with "first assignment wins" logic, we need to add
an explicit "override" mechanism which almost all settings in these
presets would then use to make sure they can't be changed by CLI
options. This seems rather backwards, and is a good indication that
any settings configured in config should not be overridden by settings
set on the CLI.
Even disregarding usage of presets, any existing mkosi config will almost
certainly not be written to expect arbitrary changes in the config due
to options set on the CLI.
Also, it's currently not entirely trivial to set default values for
presets from the global config, because any values set in the global
config cannot be overridden anymore by presets. By not doing "first
assignment wins" logic, this becomes trivial as the global config can
simply set a default value and it can be overridden by presets.
Of course by removing "first assignment wins" logic, we do introduce
the issue again that "first assignment wins" solves in the first place,
which is that it becomes possible to assign a value to a setting, match
on that value and then change the setting later. We acknowledge this by
documenting it in the manual. Also, in some cases, this is exactly what
you want. For example, if you want to use a Fedora rawhide tools tree to
build CentOS 8 images, you have to first match on distribution == centos
and then set Distribution=fedora afterwards for the tools tree preset, so
this actually makes perfect sense in some cases.
While this is technically a compat break, it will only be noticed by users
doing advanced stuff with mkosi, which AFAIK does not exist yet outside of
the systemd repo. In fact even the systemd repo was not broken by this change,
so we should be OK with making it, given the large benefits we get out of it.
This commit also simplifies the interfaces of the parser and matching callbacks
to not take the namespace as an argument anymore, but to simply take the existing
value as an argument instead.
Daan De Meyer [Fri, 18 Aug 2023 11:58:08 +0000 (13:58 +0200)]
Add grub EFI support
Note that we only generate the necessary menu entries for the grub
configuration to chainload into our generated UKIs, we do not yet
install grub for EFI ourselves as this is a distribution specific
mess that we still need to figure out. On Fedora, because the
shim and grub2-efi packages install directly to /boot which we
redirect to /efi, this is sufficient to boot with grub on EFI by
simply installing the shim and grub2-efi packages.
For other distributions, a post install or finalize script will be
necessary that installs grub (and optionally shim) to the correct
locations in the ESP.
Daan De Meyer [Mon, 14 Aug 2023 11:52:29 +0000 (13:52 +0200)]
Add back BIOS support using grub
Let's add back support for booting on BIOS using grub. This comes
with the following limitations:
- grub does not support UKIs on BIOS, so we set up the individual
components instead
- grub cannot search partitions by PARTUUID, so we're forced to have
it find the ESP by partition number instead.
We opt to generate grub.cfg ourselves instead of relying on grub-mkconfig.
grub-mkconfig is basically like kernel-install but for grub configuration,
it has a ton of distro specific cruft that we want to ignore, so we simply
don't use it and generate the grub configuration ourselves.
To allow for unprivileged installation of grub, we can't use grub-install
as it insists on opening the root device and probing its filesystem, which
isn't possible unprivileged. Instead, we run grub-mkimage and grub-bios-setup
ourselves, and manually copy the required files to the ESP.
We use the ESP to store the kernels, initrds and grub config. In the event
that grub adds support for UKIs on BIOS in the future, we can simply modify
the generated grub configuration to use our generated UKIs instead.
Daan De Meyer [Thu, 17 Aug 2023 18:54:36 +0000 (20:54 +0200)]
Unset TMPDIR in apivfs_cmd()
dnf seems to have issues with this as well so let's unset TMPDIR
whenever we set up APIVFS as that's a good indication something is
going to chroot and we should unset TMPDIR.
Daan De Meyer [Thu, 17 Aug 2023 12:40:23 +0000 (14:40 +0200)]
Reset terminal cursor if tput is available
When interrupting dnf5 or other programs, they sometimes mess up
the terminal cursor. So let's make sure we reset the cursor state
when we exit mkosi if tput is available.
Daan De Meyer [Thu, 17 Aug 2023 08:15:00 +0000 (10:15 +0200)]
Set --no-variables when we invoke bootctl
We already don't install variables because we're operating on a
root directory, but if we set --no-variables we don't get warnings
from bootctl about it.
Daan De Meyer [Tue, 15 Aug 2023 08:03:13 +0000 (10:03 +0200)]
Reword systemd version requirement a bit
We should use wording that still makes sense when reading documentation
from the distro packaged version of mkosi as well. Let's also mention
that the systemd requirement is only for bootable disk images.
Daan De Meyer [Sun, 13 Aug 2023 17:40:01 +0000 (19:40 +0200)]
Rework make_image_output()
Instead of returning a tuple containing all the bits we're interested
in, let's just return a typed version of the repart json output and
calculate what we need based on that in install_unified_kernel(). We
also move the split paths logic into make_image().
Daan De Meyer [Thu, 10 Aug 2023 10:31:22 +0000 (12:31 +0200)]
Make sure the private tmpfs in bwrap() doesn't hide workspace
The workspace might be in /tmp so we need to make sure we mount it
first before we mount the workspace so that the workspace is on top
of the private tmpfs.