Daan De Meyer [Thu, 11 May 2023 11:53:15 +0000 (13:53 +0200)]
ci: Simplify checks
Instead of mounting the filesystem and checking the contents of the
failed-services file, let's just shut down the machine with a non-zero
exit status if there are failed services. This works for both nspawn
and qemu now that we have the vsock notify socket set up.
Daan De Meyer [Thu, 11 May 2023 08:55:18 +0000 (10:55 +0200)]
action: Allow unprivileged access to kvm, vhost-vsock and vhost-net devices
These are restricted on Debian/Ubuntu but we want to allow running
unprivileged qemu so let's loosen the permissions on these devices
to make that possible.
Daan De Meyer [Thu, 11 May 2023 08:45:54 +0000 (10:45 +0200)]
Propagate systemd exit status from the VM
Let's make use of the new vmm.notify_socket credential to fetch
systemd's exit status from the VM and propagate it as our own exit
status, just like already happens automatically for containers with
systemd-nspawn.
Daan De Meyer [Tue, 9 May 2023 09:09:26 +0000 (11:09 +0200)]
Add some very basic cache invalidation
Let's compare the packages, build packages, repositories and the
contents of the prepare script. This doesn't cover everything but
should be sufficient to catch most changes without having to run
with "-ff".
Daan De Meyer [Tue, 9 May 2023 08:16:05 +0000 (10:16 +0200)]
Get rid of build_stuff()
The distinction between build_stuff() and build_image() is quite
arbitrary these days. build_stuff() used to build multiple images,
and build_image() would build a single image, but that's not the
case anymore, so let's merge build_stuff() into build_image().
Daan De Meyer [Tue, 9 May 2023 08:07:20 +0000 (10:07 +0200)]
Get rid of init_mount_namespace()
Let's just unshare the mount namespace as well as part of
become_root(). Also stop making every mount a slave mount, since
we don't really care about host mounts propagating into our mount
namespace.
Daan De Meyer [Sun, 7 May 2023 17:42:53 +0000 (19:42 +0200)]
Make KernelModulesInclude take priority over KernelModulesExclude=
If exclude takes priority over include, it becomes hard to exclude
directories of drivers except for a few. If include takes priority
over exclude, we can do stuff like exclude "drivers/gpu/*" and
include "drivers/gpu/nvidia" to only include nvidia drivers.
The current behavior easily be reproduced by adding exclude "*"
followed by include patterns.
Daan De Meyer [Sun, 7 May 2023 16:18:13 +0000 (18:18 +0200)]
Add KernelModulesInclude= and KernelModulesExclude=
These are like KernelModulesInitrdInclude= and
KernelModulesInitrdExclude= but they apply to the image itself
instead of to the kernel modules initrd.
The main use case is when using mkosi as an initramfs builder and
you want to exclude kernel modules from the initramfs but it can
also be useful when distros only ship large kernel packages that
you want to trim down.
Daan De Meyer [Sun, 7 May 2023 13:16:31 +0000 (15:16 +0200)]
arch: Always exclude initramfs generator if we're doing a bootable image
The current condition is wrong as we'll generate an initrd ourselves
if none are provided by the user, so update the condition to not install
initramfs generators unless generating a bootable image is explicitly
disabled.
Daan De Meyer [Sun, 7 May 2023 13:05:23 +0000 (15:05 +0200)]
Kernel modules initramfs improvements
- Use relative paths over full absolute paths
- Put all the firmware directories into the initramfs as well (just
the dirs, not all the firmware files)
- Return sets from resolve kernel modules function
- Operate on sorted lists of the sets to improve reproduciblity
- Split out filter_kernel_modules()
- Take builtin modules into account as well
- Use name field instead of filename from modinfo output
- Stop using joinpath() in favor of parentheses
Daan De Meyer [Sun, 7 May 2023 07:10:19 +0000 (09:10 +0200)]
Give disk images some extra free disk space when we boot them
truncate creates the extra disk space sparse so this doesn't affect
the host's disk usage. The extra disk space will have to be partitioned
to be usable inside the image though (but this is perfect for systemd's
use case as we want to partition the free space with systemd-repart).
Daan De Meyer [Sat, 6 May 2023 11:31:22 +0000 (13:31 +0200)]
Make key generation generic
Let's put generated keys in mkosi.key and mkosi.crt, and remove the
secure boot nomenclature from the key generation options. This allows
us to reuse the keys for other signing operations as well.
Daan De Meyer [Sat, 6 May 2023 11:17:43 +0000 (13:17 +0200)]
Reduce ESP default size to 512MB
Now that we compress the Debian kernel modules initramfs, we can
reduce the default ESP size to 512MB again as it's large enough to
fit the Debian initramfs even with all kernel modules included.
Daan De Meyer [Fri, 5 May 2023 14:15:41 +0000 (16:15 +0200)]
Kernel modules initrd improvements
- Let's compress the kernel modules initrd on Debian to at least
reduce the disk usage required for the initrd. Not required for other
distros since those compress their kernel modules already individually.
- Add option --kernel-modules-initrd to enable/disable usage of the
kernel modules initrd. Can be used to disable it if the main initrd
already contains the necessary kernel modules
- Add options --kernel-modules-initrd-include/exclude to allow
including/excluding the initrds to put in the kernel modules initrd
by regex patterns.
Daan De Meyer [Fri, 5 May 2023 09:02:34 +0000 (11:02 +0200)]
Drop man page from the repo
Let's just generate it on demand with pandoc when needed instead of
storing it in the repo. I initially pushed for putting in the repo
because the mkosi AUR package pulled in hundreds of Haskell dependencies
for pandoc when installing mkosi to build the manpage, but that's an
Arch issue and not something to solve in mkosi. Also, mkosi moved
from the AUR to the community repo these days so it's not an issue
on Arch anymore either.
Daan De Meyer [Thu, 4 May 2023 10:47:24 +0000 (12:47 +0200)]
Rework output related logic
- Let's store the output as a "base" name without any suffixes from
which we construct all other output paths.
- Let's not allow --output to be specified as a path anymore and
always put it in the configured output directory.
- Let's return all output paths as strings instead of paths. As
strings, we'll get typing errors if we try to use these as paths
without joining them with a directory first, which can be either the
output directory or the staging directory.
- Let's always create a symlink from the "base" name to the full
output path so it can be referred to regardless of the output
format, compression or image version that's used.
- Let's make sure we compress split partitions if requested
fedora: do not explicitly pull in filelists on F>=38
After the discussion in https://bugzilla.redhat.com/show_bug.cgi?id=2180842
glibc was updated to provide /sbin/ldconfig in F38 and rawhide. The
issue remains for only a few packages, and any that are frequently
installed are likely to be fixed quickly. So let's drop the work-around
for F>=38, which allows a smaller download to be made.
Daan De Meyer [Wed, 3 May 2023 12:15:22 +0000 (14:15 +0200)]
opensuse: Use dnf instead of zypper
Let's reduce the number of package managers we use by using dnf to
build opensuse images.
The only caveat is that extra GPG keys are listed in repomd.xml for
the opensuse repos, so we have to download that file and parse it to
figure out the extra keys that we have to write to the repo configs.
Ensure output is compatible with systemd-sysupdate
When using `systemd-sysupdate` it is wise to use split artifacts and to
compress artifacts. These changes ensure that split artifacts are compressed
and the file paths are stored in the checksum.
Please note that `systemd-sysupdate` expects a checksum name of `SHA256SUMS`
and uses the contained file names to determine which files to download. The
compression suffix is also used to determine how to decompress files.
Additional CI checks have been added to make sure no regressions in output
format occur.
Daan De Meyer [Wed, 3 May 2023 11:25:07 +0000 (13:25 +0200)]
Drop gpg path locations
All of our gpg paths point to locations in rpms gpg database so they
should already be known by dnf and as such there's no point in listing
them explicitly in the config file. Let's only keep the urls in mkosi.
When using RemovePackages= apt may refuse to remove what it considers
essential packages even when they are effectively empty meta packages or
contain only usr/share/doc/${package}/
This causes build failure like this:
Reading state information...
Package 'netcat-openbsd' is not installed, so not removed
Package 'net-tools' is not installed, so not removed
Package 'man-db' is not installed, so not removed
Package 'groff-base' is not installed, so not removed
The following packages will be REMOVED:
cron* dmidecode* fdisk* ifupdown* init* iproute2* iputils-ping*
isc-dhcp-client* isc-dhcp-common* kmod* libbpf0* libbsd0* libcap2-bin*
libdns-export1110* libedit2* libelf1* libfdisk1* libisc-export1105*
libjansson4* libmd0* libmnl0* libnftables1* libnftnl11* libxtables12*
nano*
netbase* nftables* udev* vim-common* vim-tiny* xxd*
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
init
0 upgraded, 0 newly installed, 31 to remove and 0 not upgraded.
E: Essential packages were removed and -y was used without
--allow-remove-essential.
‣ "apt-get purge vim-tiny vim-common nano nftables netcat-openbsd
netbase net-tools isc-dhcp-common isc-dhcp-client iputils-ping iprout
e2 udev kmod fdisk dmidecode man-db init ifupdown groff-base cron"
returned non-zero exit code 100.
Traceback (most recent call last):
File "/usr/lib/python3.9/runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
As we do know what we are doing to have configured these removals, tell
apt to allow it.
Presets can be defined in mkosi.presets/. A preset is just like a
regular config file/directory, except that mkosi can build multiple
presets sequentially.
If mkosi.presets/ exists, for each preset mkosi will read the global
configuration, followed by the individual preset configuration. It
will then build each of the presets in alpha-numerical order. Later
presets can use outputs of earlier presets, specifically using the
BaseTrees= and Initrds= options.
While this has many use cases, one promising use case is to allow
building an initrd and a final image that uses that initrd within a
single invocation of mkosi.
Let's stop running kernel-install in favor of always doing prebuilt
initrds by default. We reimplement the depmod hook of kernel-install
ourselves (required for centos stream 8).
If no initrd is provided by the user, we build a minimal one ourselves
that's sufficient to boot in a qemu VM. If the default initrd is not
sufficient, the upcoming preset support can be used to build a custom
initrd instead.
Switch back to using ttyS0 as the default serial console
virtio_console is not always a builtin kernel module on all the
distributions we support. This means that the kernel can only
start logging to it after the initramfs has been unpacked and the
virtio_console module has been loaded from it. Any message that's
logged to kmsg before that dissapears into the void which makes
debugging boot failures rather difficult.
Instead, until systemd-stub is recent enough in all supported distros
to receive extra kernel cmdline arguments via smbios, let's use a
default kernel cmdline of "console=ttyS0" so that the serial console
works by default but can still be overridden by users.
centos: Make sure glibc-all-langpacks doesn't get installed
On CentOS 8, glibc-all-langpacks is pulled in as a dependency of
filesystem. Let's make sure dnf prefers glibc-minimal-langpack by
installing it explicitly.
Currently, when base trees are used in incremental mode, we cache
the base trees as well. When running from a cache copy, any changes
to the base trees are not taken into account. Let's change this and
only cache the files we add/change/delete on top of the base layers.
This makes sure that we can still use our cache even if the base layer
changes, since we won't ignore all changes made to the base layer.