Malte Poll [Fri, 22 Dec 2023 11:41:10 +0000 (12:41 +0100)]
bubblewrap: try to mount /nix/store readonly
Similar to most usrmerged systems, NixOS stores all installed
binaries and libraries in /nix/store.
To make mkosi work on NixOS, the nix store should be mounted by default.
Co-authored-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
Daan De Meyer [Thu, 21 Dec 2023 15:00:44 +0000 (16:00 +0100)]
Run more binaries with bwrap()
Let's sandbox more of the image build. This isolates more of the
build from the host which reduces the chance of leaking in host
specific details into the image.
Daan De Meyer [Wed, 20 Dec 2023 20:31:56 +0000 (21:31 +0100)]
Sandbox more in bwrap()
Let's not make the full root filesystem available to commands
running in bwrap(). Instead, limit it to some select directories.
- /usr
- Various directories from /etc. Note that this also means we can
get rid of mount_tools() as all these directories are now mounted
in bwrap() instead. This also allows us to get rid of the overlay
hack in mount_tools() to create the necessary mount points. The
goal is to get rid of as many of these as possible over time.
- /var/tmp
- /tmp
Because to make this work we have to pass MkosiConfig into bwrap(),
we split off a new file bubblewrap.py with all the bubblewrap stuff.
To avoid having to import MkosiState and bwrap() into tree.py,
install_tree() is moved __init__.py
Daan De Meyer [Thu, 21 Dec 2023 10:07:36 +0000 (11:07 +0100)]
Run depmod and modinfo on host again
Running these in the chroot is much slower when building images for
another architecture. Also, we might soon have a way to prevent dnf
from running depmod (see
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/2743), so
let's adopt that when it is merged.
Michael Ferrari [Wed, 20 Dec 2023 01:12:07 +0000 (02:12 +0100)]
`Output=` now has the version appended if unset
Previously `Output=` would only default to `ImageId=` if unset, but the
output files would have the version appended, resulting in `%o` not
returning the actual name of the output files.
This also moves the default handling to a `default_factory`
Michael Ferrari [Wed, 20 Dec 2023 01:10:53 +0000 (02:10 +0100)]
Output files starting with `Output=` are removed
As preparation for the removal of `config.output_with_version` the
removal of output files now only factors in `config.output` as prefix
and no longer removes based on version suffix, due to that being added
to `config.output` in a following commit.
Daan De Meyer [Tue, 19 Dec 2023 15:29:02 +0000 (16:29 +0100)]
Stop bind mounting /sys in chroot environments
The only reason we do this is to make systemd's unit test suite
pass. https://github.com/systemd/systemd/pull/30527 fixes systemd's
test suite to not fail when /sys is not mounted, so let's drop this
bit.
Daan De Meyer [Sat, 16 Dec 2023 19:31:01 +0000 (20:31 +0100)]
ci: Drop rocky, alma and rhel-ubi
The next commit is going to add a second dimension to the test
matrix which will dramatically introduce the number of CI jobs.
Let's keep things manageable by dropping rhel-ubi, alma and rocky
which should be covered by the centos job already.
Daan De Meyer [Mon, 18 Dec 2023 13:32:31 +0000 (14:32 +0100)]
mkosi-initrd: Drop explicit CompressOutput=yes
This allows the compression passed by mkosi or the default compression
to be used instead. Note that the default is to compress the initrd, so
this doesn't change anything.
Daan De Meyer [Sat, 16 Dec 2023 23:01:56 +0000 (00:01 +0100)]
opensuse: Use curl to fetch repomd.xml
urllib.request.urlopen() means we're responsible for catching all
the exceptions and showing a proper error message to the user.
Instead, let's just shell out to curl to fetch the file which can
translate any errors into user friendly error messages for us.
Daan De Meyer [Sat, 16 Dec 2023 21:58:21 +0000 (22:58 +0100)]
Split out rpm.py and hook up rpm logic with zypper as well
We have a bunch of rpm related logic that's required when using
dnf and zypper so let's split out rpm.py and hook up everything in
both dnf and zypper.
Daan De Meyer [Sat, 16 Dec 2023 21:35:53 +0000 (22:35 +0100)]
Mount over various other directories as well if needed
On Opensuse the openssl certificates are stored in
/var/lib/ca-certificates so let's make sure we mount this directory
from the tools tree into the host as well.
The pacman keyring is stored in /etc/pacman.d/gnupg so we mount over
/etc/pacman.d as well if needed.
Daan De Meyer [Fri, 15 Dec 2023 09:55:23 +0000 (10:55 +0100)]
Use mkosi.key/mkosi.crt for SSH authentication
Instead of using the user's SSH certificate and key, let's use the
X509 certificate and private key generated by 'mkosi genkey' instead.
This saves us from having to rely on ssh-agent to get the public key
or doing otherwise complicated logic to try and find the public and
private key. We also avoid always needing a separate public/private
key just for SSH by automatically converting the X509 certificate to
a SSH public key.
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.