Daan De Meyer [Fri, 15 Dec 2023 13:23:22 +0000 (14:23 +0100)]
Support multiple [Match] sections
Instead of considering all match sections part of the same match,
let's consider each [Match] section on its own. This allows doing
multiple independent triggers, such as:
Daan De Meyer [Fri, 15 Dec 2023 13:20:49 +0000 (14:20 +0100)]
Build initrd if Bootable=auto
If building a bootable image is not explicitly disabled and we
don't split out an initrd from a UKI because the dependencies are
not installed or we're on the wrong architecture, let's still build
an initrd so that booting with qemu direct kernel boot still works.
Daan De Meyer [Thu, 14 Dec 2023 15:30:02 +0000 (16:30 +0100)]
Fix install_tree()
Let's make sure that all the skeleton, extra and package manager
trees we get have absolute targets. That allows us to stop using
with_prefix() when installing these trees, which means we pass
target=None instead of target="/" which makes install_tree do the
right thing.
Daan De Meyer [Thu, 14 Dec 2023 14:54:27 +0000 (15:54 +0100)]
Stop using the tools tree for the ssh verb
This allows us to run ssh out of the user namespace which means we
can get rid of the passwd hack to make ssh work. ssh is widespread
enough that we can require users to install it on the host machine
instead of using the tools tree.
Daan De Meyer [Wed, 13 Dec 2023 09:14:25 +0000 (10:14 +0100)]
kernel-install: Use host's package manager configuration and repos
Let's make sure we use the host's package manager configuration and
repositories in the kernel-install plugin. The initrd we produce
should be as compatible with the host as we can make it and making
sure we use the same packages that the host uses is a good step in
achieving that.
Daan De Meyer [Tue, 12 Dec 2023 11:26:45 +0000 (12:26 +0100)]
mkosi-initrd: Rewrite kernel-install plugin in python and support UKIs
There's really no point for the kernel-install plugin to be in bash,
so let's rewrite it in python. While we're at it, let's also support
running as a UKI generator.
Malte Poll [Mon, 11 Dec 2023 10:40:18 +0000 (11:40 +0100)]
make_cpio: sort files used as cpio input
Pathlib's glob functions return files in the order used by the filesystem.
This may differ between implementations and configuration (file system, locale).
For better reproducibility, the file list should be sorted.
Daan De Meyer [Tue, 12 Dec 2023 11:22:44 +0000 (12:22 +0100)]
Save kernel image and stub when building UKI/ESP images
When building a UKI image, it's not unreasonable for users to not
want to ship the large vmlinuz kernel image file inside their UKI
initrd. However, because we process remove_files() before we build
the UKI, the kernel image might already have been removed by the
time we build the UKI. To avoid this problem, let's save the UKI
(and the stub while we're at it) in the workspace directory before
we process file removals.
Let's also only process cmdline files from the rootfs when we're
building a bootable image and ignore them if we're building a UKI.
Daan De Meyer [Mon, 11 Dec 2023 17:51:28 +0000 (18:51 +0100)]
tests: Test "none" output format as well
Let's build an image with "none" as well. There won't be any output,
but we can at least test that nothing breaks when specifying "none"
as the output format.
Also apply the "integration" marker to the entire file while we're
at it.
Daan De Meyer [Mon, 11 Dec 2023 09:17:19 +0000 (10:17 +0100)]
Add RepartOffline= option
Instead of auto-detecting all cases where --offline=no has to be
used with systemd-repart, let's allow configuring it via an option
so that if we discover any new cases, users can easily disable
offline mode themselves.
Daan De Meyer [Sun, 10 Dec 2023 21:09:55 +0000 (22:09 +0100)]
qemu: Remove --posix-acl and add --no-announce-submounts to virtiofsd
--posix-acl causes an error from virtiofsd saying the client doesn't
support this feature. We also get a warning about announcing submounts
not being supported so let's make sure we disable both features to
avoid these warnings/errors.
Daan De Meyer [Sun, 10 Dec 2023 18:39:05 +0000 (19:39 +0100)]
Use grub's search.file module instead of hardcoding partition numbers
We can tell grub to search for the first partition containing a
/grub/grub.cfg file. This still isn't ideal, but it's better than
hardcoding partition numbers.
Daan De Meyer [Sun, 10 Dec 2023 16:06:51 +0000 (17:06 +0100)]
Install kernels to /boot
If users want to use XBOOTLDR partitions, then we have to put the
kernels in a separate location from the ESP stuff. Currently we put
everything in /efi when building the image, which means that users
don't have a way to specify that the kernels should be put in an
XBOOTLDR partition.
Let's fix this by installing kernels to /boot so that users can
populate an XBOOTLDR partition by simply using CopyFiles=/boot:/
in a repart xbootldr partition definition.
Daan De Meyer [Sun, 10 Dec 2023 13:24:04 +0000 (14:24 +0100)]
Use kernel-install entry token if available
Let's try and look for the kernel-install entry token if
kernel-install v255 or newer is available. This makes us more
compatible with package manager upgrades as we'll use the same
directory that kernel-install will look for when invoked by a
package manager.
Daan De Meyer [Sun, 10 Dec 2023 11:48:15 +0000 (12:48 +0100)]
Add QemuFirmwareVariables=
This allows configuring the path to the qemu firmware variables to
use. This allows users to configure their own variables using
https://pypi.org/project/virt-firmware/ before passing it to mkosi.
This also fixes a bug where we didn't pass the variables file to
qemu if the firmware doesn't support secure boot.
Daan De Meyer [Sun, 10 Dec 2023 12:17:45 +0000 (13:17 +0100)]
Allow specifying minimum mkosi version
Currently, users often get a confusing message about some property
not existing when they try to use an older version of mkosi to build
a configuration that requires a newer version. Let's improve on this
by allowing configurations to declare the minimum version required to
build the configuration.
Daan De Meyer [Sun, 10 Dec 2023 10:31:23 +0000 (11:31 +0100)]
arch: Unconditionally assume initramfs package is installed
This doesn't prevent installing individual initramfs generators so
let's always set it and require users to specify mkinitcpio or dracut
if they really need one of these.
Daan De Meyer [Sat, 9 Dec 2023 11:51:46 +0000 (12:51 +0100)]
Relax qemu check in uncaught_exception_handler()
qemu binaries can have many different names (qemu, qemu-kvm,
qemu-system-xxx, ...) so let's not log a stacktrace for any binary
that starts with "qemu".
Daan De Meyer [Fri, 8 Dec 2023 15:53:51 +0000 (16:53 +0100)]
tests: Make more robust on distros with recent systemd
Let's make use of the fact that we can communicate the exit status
from VMs on recent versions of systemd. Even when it fails to run
qemu will often exit with exit status 0 so let's make our successful
exit status 123 and check for that instead of 0.
Let's also rework how we have systemd log. Instead of using
default_standard_output, let's have journald forward all logs to the
console. While we're at, let's also add some general useful debugging
kernel command line arguments that we also use in the systemd repository.
Daan De Meyer [Sat, 9 Dec 2023 11:59:16 +0000 (12:59 +0100)]
Revert "mkosi: include binutils in the packages for building"
Now that we pass the kernel version explicitly to ukify, we
don't need to have binutils installed anymore as ukify only uses
readelf to autodetect the kernel version if it wasn't supplied
explicitly by the user.
Daan De Meyer [Fri, 8 Dec 2023 12:52:01 +0000 (13:52 +0100)]
Use mkosi-initrd to build the default initrd
Instead of maintaining a separate default initrd, let's use
mkosi-initrd for the default initrd. This provides users with a more
batteries included initrd by default and saves us from having to
maintain two separate initrd definitions.
Daan De Meyer [Thu, 7 Dec 2023 22:11:19 +0000 (23:11 +0100)]
Add support for installing shim
Unfortunately shim is a necessary evil that we have to support. We
add a new option that allows choosing either a signed version, an
unsigned version or none at all (the default).
We also stop redirecting /boot/efi to /efi so that /efi is our pristine
directory for populating the ESP whereas /boot is unclaimed wasteland
free for package managers to write all kinds of stuff to.
Josef Bacik [Fri, 8 Dec 2023 22:28:21 +0000 (22:28 +0000)]
mkosi: include binutils in the packages for building
On aarch64 the dependencies are different than x86 and we don't end up
with binutils getting picked up, which means readelf isn't available for
systemd-ukify when using mkosi-kernel on aarch64. Explicitly add
bintuils to the list of packages, this allows mkosi-kernel to work
properly on an aarch64 machine.
Joerg Behrmann [Thu, 7 Dec 2023 18:09:34 +0000 (19:09 +0100)]
Move off of the deprecated importlib.resources API
Python 3.9 brought a new importlib.resources API and deprecated the old
one. This introduces a small shim to use the part of the APi that guarantees a
Path object, thus making our usage of this just pathlike.
Daan De Meyer [Thu, 7 Dec 2023 11:48:53 +0000 (12:48 +0100)]
Improve exception handling for subprocess.run()
Instead of having subprocess.run() kill child processes on exceptions
with SIGKILL, let's have it use SIGTERM instead. Because this is not
configurable, we have to override signal.SIGKILL with signal.SIGTERM
before we call subprocess.run().
Daan De Meyer [Thu, 7 Dec 2023 10:21:30 +0000 (11:21 +0100)]
Run image builds in a fork again
This solves two problems:
- When not using a tools tree, we can run qemu outside of the user
namespace which means that we don't need to pass fds to /dev/kvm and
/dev/vhost-vsock to keep things working unprivileged
- The vmspawn verb we're about to introduce will not be able to run
properly inside a user namespace, so we need to make sure we're not
inside a user namespace after the image build.
Compared to our original implementation of this way back with exception
propagation, this time we opt to do things differently by doing all
exception handling and logging inside the fork to avoid having to
propagate exceptions. This makes the overall implementation a lot
simpler.
We can also run the other verbs outside of the user namespace as long
as we're not using a tools tree. Because we want to keep support for
using a tools tree with all verbs, we keep support for running them
inside a user namespace as well. Because we already use INVOKING_USER
everywhere, this actually turns out to require very little changes. We
only need to make sure when starting virtiofsd that we unshare the user
namespace ourselves if we're not uid mapping.