]> git.ipfire.org Git - thirdparty/mkosi.git/log
thirdparty/mkosi.git
10 days agoconfig: Fix formatting with newer ruff 4151/head
Daan De Meyer [Thu, 5 Feb 2026 08:53:11 +0000 (09:53 +0100)] 
config: Fix formatting with newer ruff

10 days agoaction: Run apt-get update before installing packages
Daan De Meyer [Thu, 5 Feb 2026 08:31:50 +0000 (09:31 +0100)] 
action: Run apt-get update before installing packages

The repository metadata in the image can get out of date. Let's run
apt-get update to make sure it is fresh.

12 days agoAdd MakeScriptsExecutable= setting to optionally try to make scripts executable befor...
Luca Boccassi [Wed, 28 Jan 2026 22:43:21 +0000 (22:43 +0000)] 
Add MakeScriptsExecutable= setting to optionally try to make scripts executable before bailing out

If it fails, it was going to die() anyway.

OBS sources defined inline (ie, not in a tarball) cannot have the mode preserved,
so it's not possible to have mkosi.build or so as a bare script
in an OBS project, one needs to tar it up and extract it again later,
which means it cannot be edited by the inline editor, which is very
convenient for small and trivial builds like an addon.

13 days agobuild(deps): bump github/codeql-action from 4.31.9 to 4.32.0
dependabot[bot] [Sun, 1 Feb 2026 22:43:27 +0000 (22:43 +0000)] 
build(deps): bump github/codeql-action from 4.31.9 to 4.32.0

Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.9 to 4.32.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/5d4e8d1aca955e8d8589aabd499c5cae939e33c7...b20883b0cd1f46c72ae0ba6d1090936928f9fa30)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
13 days agobuild(deps): bump actions/checkout from 6.0.1 to 6.0.2
dependabot[bot] [Sun, 1 Feb 2026 22:43:12 +0000 (22:43 +0000)] 
build(deps): bump actions/checkout from 6.0.1 to 6.0.2

Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/8e8c483db84b4bee98b60c0593521ed34d9990e8...de0fac2e4500dabe0009e67214ff5f5447ce83dd)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
13 days agodocs: remove superfluous definition colon
Jörg Behrmann [Sat, 9 Aug 2025 12:33:30 +0000 (14:33 +0200)] 
docs: remove superfluous definition colon

2 weeks agomkosi-tools: add libarchive-tools package.
Sofiane HAMAM [Tue, 27 Jan 2026 22:29:46 +0000 (23:29 +0100)] 
mkosi-tools: add libarchive-tools package.

Fix Arch image build failure due to missing bsdtar.
Fixes discussions/4135.

2 weeks agoMerge pull request #4143 from behrmann/fedoranpm
Luca Boccassi [Wed, 28 Jan 2026 10:40:16 +0000 (10:40 +0000)] 
Merge pull request #4143 from behrmann/fedoranpm

ci: add nodejs-npm to tools tree packages for Fedora

2 weeks agoci: switch tools tree from Fedira Rawhide to Arch 4143/head
Jörg Behrmann [Wed, 28 Jan 2026 08:25:27 +0000 (09:25 +0100)] 
ci: switch tools tree from Fedira Rawhide to Arch

2 weeks agoci: try multiple npm binaries in prepare script
Jörg Behrmann [Wed, 28 Jan 2026 07:40:05 +0000 (08:40 +0100)] 
ci: try multiple npm binaries in prepare script

2 weeks agoci: add nodejs-npm to tools tree packages for Fedora
Jörg Behrmann [Wed, 28 Jan 2026 07:27:49 +0000 (08:27 +0100)] 
ci: add nodejs-npm to tools tree packages for Fedora

2 weeks agodocs: Add information about gui mkosi-tools profile
Didr [Tue, 27 Jan 2026 20:23:50 +0000 (21:23 +0100)] 
docs: Add information about gui mkosi-tools profile

2 weeks agoAdd missing call to run_locale_gen()
Martin Hundebøll [Mon, 26 Jan 2026 08:19:56 +0000 (09:19 +0100)] 
Add missing call to run_locale_gen()

And mention the new feature in the news file.

3 weeks agorpm: Set pkgverify_level to digest
Daan De Meyer [Wed, 21 Jan 2026 09:05:24 +0000 (10:05 +0100)] 
rpm: Set pkgverify_level to digest

This was changed to all in rpm 6.0.0, which means that rpm is checking
for signatures from dnf/zypper repos that have gpgcheck=0. dnf5 was updated
to deal with this but for some reason the fix isn't working in Arch and zypper
doesn't deal with this at all, so revert back to the previous level until
package managers can actually deal with this.

3 weeks agodnf: Give advanced users some control over plugins
Daan De Meyer [Tue, 20 Jan 2026 18:25:35 +0000 (19:25 +0100)] 
dnf: Give advanced users some control over plugins

Let's add some environment variables to control plugins for cases
where users have some dnf plugin they can't touch on their host system
which doesn't behave properly in mkosi-sandbox and which they can't
remove themselves.

3 weeks agorun: Improve sandbox command logging
Daan De Meyer [Tue, 20 Jan 2026 07:48:15 +0000 (08:48 +0100)] 
run: Improve sandbox command logging

Replaces #4068

3 weeks agoFix environment variable name for systemd-repart
Daan De Meyer [Mon, 19 Jan 2026 08:10:49 +0000 (09:10 +0100)] 
Fix environment variable name for systemd-repart

4 weeks agoAllow specifying "default" value for Initrds=
Daan De Meyer [Sun, 18 Jan 2026 10:53:30 +0000 (11:53 +0100)] 
Allow specifying "default" value for Initrds=

Also use it as the default value for Initrds= when we decide a default
initrd is needed. This allows both using the default initrd alongside
other initrds as well as disabling building the default initrd by assigning
the empty string to Initrds=.

4 weeks agoAllow setting PORTABLE_PREFIXES= via Environment=
Daan De Meyer [Thu, 15 Jan 2026 19:31:23 +0000 (20:31 +0100)] 
Allow setting PORTABLE_PREFIXES= via Environment=

4 weeks agoopensuse: More GPG key handling fixes
Daan De Meyer [Thu, 15 Jan 2026 12:13:04 +0000 (13:13 +0100)] 
opensuse: More GPG key handling fixes

- Pass GPG keys to rpm --import as paths inside the sandbox. This
  makes sure that overrides from mkosi.sandbox are taken into account.
  e.g. atm we pass mkosi.tools/usr/share/distribution-gpg-keys/... whereas
  now we pass /usr/share/distribution-gpg-keys/...
- Make sure we figure out keys once when using zypper. zypper downloads
  GPG keys (when fetching is enabled) when refreshing repositories. These
  keys are stored in the rpm database in the temporary root we use when
  syncing repository metadata. To make sure they are not lost, we extract
  the keys using rpmkeys and store them in the keyring directory which we
  use from then onwards. For all image builds we then simply import the
  keys from the keyring directory.

4 weeks agoMerge pull request #4122 from DaanDeMeyer/opensuse-fixes
Jörg Behrmann [Thu, 15 Jan 2026 08:54:44 +0000 (09:54 +0100)] 
Merge pull request #4122 from DaanDeMeyer/opensuse-fixes

Opensuse fixes

4 weeks agoopensuse: Log when importing GPG keys into RPM database 4122/head
Daan De Meyer [Wed, 14 Jan 2026 19:08:09 +0000 (20:08 +0100)] 
opensuse: Log when importing GPG keys into RPM database

4 weeks agoopensuse: List local GPG keys for Leap as well
Daan De Meyer [Wed, 14 Jan 2026 18:28:13 +0000 (19:28 +0100)] 
opensuse: List local GPG keys for Leap as well

4 weeks agoopensuse: Log when we're potentially going to curl()
Daan De Meyer [Wed, 14 Jan 2026 18:27:12 +0000 (19:27 +0100)] 
opensuse: Log when we're potentially going to curl()

4 weeks agoopensuse: Fix gpgkey URL
Daan De Meyer [Wed, 14 Jan 2026 18:26:39 +0000 (19:26 +0100)] 
opensuse: Fix gpgkey URL

4 weeks agoopensuse: Simplify error messages slightly
Daan De Meyer [Wed, 14 Jan 2026 18:25:08 +0000 (19:25 +0100)] 
opensuse: Simplify error messages slightly

4 weeks agoopensuse: Import GPG keys downloaded by zypper as well
Daan De Meyer [Wed, 14 Jan 2026 18:24:05 +0000 (19:24 +0100)] 
opensuse: Import GPG keys downloaded by zypper as well

When syncing repository metadata, zypper will download keys if
--gpg-auto-import-keys is specified. When installing packages, we need
to make sure these keys are imported into the rpmdb as well.

4 weeks agoopensuse: Simplify GPG logic
Daan De Meyer [Wed, 14 Jan 2026 18:22:41 +0000 (19:22 +0100)] 
opensuse: Simplify GPG logic

No need to check ourselves, we can delegate the check to find_rpm_gpgkey()
instead.

4 weeks agoopensuse: Fetch remote keys as well if RepositoryKeyFetch= is enabled
Daan De Meyer [Tue, 13 Jan 2026 19:55:02 +0000 (20:55 +0100)] 
opensuse: Fetch remote keys as well if RepositoryKeyFetch= is enabled

Also improve error handling for if local keys do not exist.

4 weeks agoci: Use mkosi box for unit test CI as well
Daan De Meyer [Tue, 13 Jan 2026 19:43:38 +0000 (20:43 +0100)] 
ci: Use mkosi box for unit test CI as well

5 weeks agoMerge pull request #4117 from behrmann/tyfixes
Daan De Meyer [Sat, 10 Jan 2026 15:56:12 +0000 (16:56 +0100)] 
Merge pull request #4117 from behrmann/tyfixes

Ty(ping) fixes

5 weeks agoRemove deprecated logging.warn call 4117/head
Jörg Behrmann [Sat, 10 Jan 2026 12:34:05 +0000 (13:34 +0100)] 
Remove deprecated logging.warn call

5 weeks agoRemove unused type ignore statements
Jörg Behrmann [Sat, 10 Jan 2026 12:32:54 +0000 (13:32 +0100)] 
Remove unused type ignore statements

5 weeks agoMake sure we pass the right context to finalize_default_initrd()
DaanDeMeyer [Thu, 8 Jan 2026 17:06:16 +0000 (18:06 +0100)] 
Make sure we pass the right context to finalize_default_initrd()

We mess around with the context object to make it for for use when
reading the subimages. But we need the full context again for parsing
the default initrd later on, so make a copy before we delete stuff and
pass that to finalize_default_initrd()

Fixes #4114

5 weeks agoMerge pull request #4111 from DaanDeMeyer/vsock
Jörg Behrmann [Wed, 7 Jan 2026 09:45:31 +0000 (10:45 +0100)] 
Merge pull request #4111 from DaanDeMeyer/vsock

qemu: Start vsock notify handler thread after starting qemu

5 weeks agoStop running auxiliary programs in systemd scopes 4111/head
DaanDeMeyer [Tue, 6 Jan 2026 20:29:04 +0000 (21:29 +0100)] 
Stop running auxiliary programs in systemd scopes

Similar to the same change made in systemd-vmspawn, let's stop running
virtiofsd, systemd-journal-remote and swtpm in scopes. Nobody ever makes
use of the features this provides and it simplifies our code quite a bit.

This also means we drop the UnitProperties setting, which was effectively
unused anyway.

This allows us to get rid of the --suspend setting in mkosi-sandbox, which
only really existed to allow waiting for systemd-run to finish its setup
before registering the machine. Because registering a machine means it needs
a cgroup, we allow systemd-machined to create the scope itself if needed.

5 weeks agoqemu: Start vsock notify handler thread after starting qemu
DaanDeMeyer [Tue, 6 Jan 2026 19:21:51 +0000 (20:21 +0100)] 
qemu: Start vsock notify handler thread after starting qemu

5 weeks agotools: don't pull in virtiofsd in bookworm tools trees
Jörg Behrmann [Tue, 6 Jan 2026 13:54:40 +0000 (14:54 +0100)] 
tools: don't pull in virtiofsd in bookworm tools trees

6 weeks agobuild(deps): bump github/codeql-action from 4.31.6 to 4.31.9
dependabot[bot] [Fri, 2 Jan 2026 11:50:17 +0000 (11:50 +0000)] 
build(deps): bump github/codeql-action from 4.31.6 to 4.31.9

Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.6 to 4.31.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/fe4161a26a8629af62121b670040955b330f9af2...5d4e8d1aca955e8d8589aabd499c5cae939e33c7)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
6 weeks agobuild(deps): bump actions/checkout from 6.0.0 to 6.0.1
dependabot[bot] [Thu, 1 Jan 2026 22:05:12 +0000 (22:05 +0000)] 
build(deps): bump actions/checkout from 6.0.0 to 6.0.1

Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/1af3b93b6815bc44a9784bd300feb67ff0d1eeb3...8e8c483db84b4bee98b60c0593521ed34d9990e8)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
6 weeks agoopensuse: Import GPG keys for all repositories
DaanDeMeyer [Tue, 30 Dec 2025 21:56:51 +0000 (22:56 +0100)] 
opensuse: Import GPG keys for all repositories

Let's not just import GPG keys for our own repositories, but for
all repositories.

6 weeks agoAdd support for locale-gen
DaanDeMeyer [Tue, 30 Dec 2025 21:17:56 +0000 (22:17 +0100)] 
Add support for locale-gen

If locales are configured in /etc/locale.gen, let's run locale-gen.

6 weeks agoMerge pull request #4100 from Ma27/systemd-hacking-on-nixos
Daan De Meyer [Tue, 30 Dec 2025 15:15:17 +0000 (16:15 +0100)] 
Merge pull request #4100 from Ma27/systemd-hacking-on-nixos

6 weeks agonixos: Use repository key fetching by default on nixos
DaanDeMeyer [Mon, 29 Dec 2025 18:54:01 +0000 (19:54 +0100)] 
nixos: Use repository key fetching by default on nixos

nixos generally won't have any keys in the expected locations so let's
use repository key fetching by default if we're building from a nixos
host (or tools tree).

6 weeks agomkosi/run: pass through LD_LIBRARY_PATH 4100/head
Maximilian Bosch [Mon, 29 Dec 2025 17:06:18 +0000 (18:06 +0100)] 
mkosi/run: pass through LD_LIBRARY_PATH

The sandbox expects that the host has a `libseccomp.so` in its global
search-path (usually `/usr/lib`). However, that path doesn't exist on
NixOS. Another standard way of passing lookup paths to `dlopen()` is
using LD_LIBRARY_PATH which is now passed through to the sandbox.

6 weeks agotreewide: use `/usr/bin/env bash` instead of `/bin/bash` as shebang
Maximilian Bosch [Mon, 29 Dec 2025 17:04:21 +0000 (18:04 +0100)] 
treewide: use `/usr/bin/env bash` instead of `/bin/bash` as shebang

E.g. NixOS doesn't have a `/bin/bash` and some of the scripts are seemingly
running inside the host's context. Hence, use the more cautious variant of
`/usr/bin/env bash` and just do it everywhere for consistency.

6 weeks agomkosi/run: inherit store paths from nix-shell into sandbox
Maximilian Bosch [Sun, 2 Nov 2025 14:14:09 +0000 (15:14 +0100)] 
mkosi/run: inherit store paths from nix-shell into sandbox

On NixOS most interesting stuff is either in store-paths from $PATH
(e.g. when working in a nix-shell).

Add these PATH entries to the new $PATH and ensure everything
interesting is in the sandbox.

7 weeks agodocs: Reword dependencies vs tools tree requirement a bit
DaanDeMeyer [Sat, 27 Dec 2025 17:57:58 +0000 (18:57 +0100)] 
docs: Reword dependencies vs tools tree requirement a bit

7 weeks agodocs: Minor correction on enabling unprivileged namespaces
ssooffiiaannee [Sat, 27 Dec 2025 16:02:39 +0000 (17:02 +0100)] 
docs: Minor correction on enabling unprivileged namespaces

apparmor_restrict_unprivileged_unconfined should be set to 0 to allow
unprivileged namespaces.

7 weeks agodocs: Update unprivileged user namespace docs
DaanDeMeyer [Sat, 27 Dec 2025 12:00:28 +0000 (13:00 +0100)] 
docs: Update unprivileged user namespace docs

Let's not recommend fiddling around with apparmor profiles, but
instead recommend enabling unprivileged user namespaces unconditionally.
Users that care about security can figure out apparmor profiles on their own.

Also reorder and reword the REQUIREMENTS section in general.

7 weeks agokmod: Only use --modname if available
DaanDeMeyer [Fri, 26 Dec 2025 18:22:05 +0000 (19:22 +0100)] 
kmod: Only use --modname if available

--modname is only available since 2022, and not available in kmod in
CentOS Stream 9, so query if it is available and only use it if it is
available.

Querying --help every time isn't the most efficient but adds negligible
time to the modinfo step in practice.

7 weeks agoarch: Download archlinux-keyring with pacman
DaanDeMeyer [Fri, 26 Dec 2025 09:55:24 +0000 (10:55 +0100)] 
arch: Download archlinux-keyring with pacman

curl-ing the Arch Linux website fails quite often due to connection
issues. Let's try downloading the archlinux-keyring package with
Pacman so we go directly to a mirror and avoid hitting the Arch
Linux website.

7 weeks agoMerge pull request #4092 from DaanDeMeyer/kmod
Daan De Meyer [Fri, 26 Dec 2025 09:41:28 +0000 (10:41 +0100)] 
Merge pull request #4092 from DaanDeMeyer/kmod

kmod: Stop retrieving dependency info of all modules

7 weeks agokmod: Reorder ko extension list 4092/head
DaanDeMeyer [Thu, 25 Dec 2025 20:41:11 +0000 (21:41 +0100)] 
kmod: Reorder ko extension list

It's unsure whether python uses a hash based lookup for this or not,
so let's list the most commonly expected extensions first. Kernel
modules tend to be compressed these days, so those are the ones we
list first, with preference to zstd and xz.

7 weeks agokmod: Use same ko glob everywhere
DaanDeMeyer [Thu, 25 Dec 2025 20:40:06 +0000 (21:40 +0100)] 
kmod: Use same ko glob everywhere

7 weeks agokmod: Stop retrieving dependency info of all modules
DaanDeMeyer [Thu, 25 Dec 2025 19:48:47 +0000 (20:48 +0100)] 
kmod: Stop retrieving dependency info of all modules

Instead of running modinfo once to retrieve the dependency information
of all modules, let's only retrieve the dependency information of the
modules that are to be included in the image and their transitive
dependencies. This means we have to run modinfo multiple times, but with
far fewer modules than before. This ends up being faster than retrieving
the dependency information of all modules, especially after the optimization
from e276dac87a530efac4376a5059b980f2d43460f5.

For the mkosi default image build on Arch Linux this reduces the time for
calculating the required kernel modules and firmware on my laptop from 5s
to 0.5s.

Co-Authored-By: Laurence Kiln <246209442+LaurenceKiln@users.noreply.github.com>
7 weeks agokmod: Use Sequence instead of Reversible/Iterable
DaanDeMeyer [Thu, 25 Dec 2025 20:02:49 +0000 (21:02 +0100)] 
kmod: Use Sequence instead of Reversible/Iterable

We generally use Sequence everywhere else as well and there's no good
reason to use Reversible/Iterable here, so let's switch to Sequence.

7 weeks agokmod: Streamline step logging
DaanDeMeyer [Thu, 25 Dec 2025 19:56:01 +0000 (20:56 +0100)] 
kmod: Streamline step logging

Let's track the full runtime of filter_kernel_modules(), filter_firmware()
and resolve_module_dependencies().

7 weeks agoMerge pull request #4091 from p5/dev/p5/reproducibility-updates
Daan De Meyer [Thu, 25 Dec 2025 19:51:51 +0000 (20:51 +0100)] 
Merge pull request #4091 from p5/dev/p5/reproducibility-updates

Fix reproducibility for microcode initrd and gzip compression

7 weeks agokmod: Move modinfo output parsing into modinfo()
DaanDeMeyer [Thu, 25 Dec 2025 19:18:32 +0000 (20:18 +0100)] 
kmod: Move modinfo output parsing into modinfo()

7 weeks agocompressor_command: Use gzip -n for reproducible output 4091/head
Robert Sturla [Thu, 25 Dec 2025 18:02:13 +0000 (18:02 +0000)] 
compressor_command: Use gzip -n for reproducible output

The gzip format includes an MTIME field in its header that stores the
modification time of the original file. This causes compressed archives
to differ between builds even when the uncompressed content is identical.

Add the --no-name flag to gzip which suppresses storing the original
filename and timestamp, making gzip output reproducible.

Signed-off-by: Robert Sturla <rsturla@redhat.com>
7 weeks agobuild_microcode_initrd: Normalize timestamps for reproducible builds
Robert Sturla [Thu, 25 Dec 2025 18:00:22 +0000 (18:00 +0000)] 
build_microcode_initrd: Normalize timestamps for reproducible builds

When building the microcode initrd, files are created in a temporary
directory with current timestamps. These timestamps are then embedded
in the CPIO archive, causing non-reproducible builds even when
SourceDateEpoch is set.

Fix this by normalizing the modification times of all files in the
microcode root directory to source_date_epoch before creating the
CPIO archive.

Signed-off-by: Robert Sturla <rsturla@redhat.com>
7 weeks agoMerge pull request #4090 from DaanDeMeyer/proc
Jörg Behrmann [Wed, 24 Dec 2025 13:31:04 +0000 (14:31 +0100)] 
Merge pull request #4090 from DaanDeMeyer/proc

sandbox: Drop --proc

7 weeks agoFix --debug-shell 4090/head
DaanDeMeyer [Wed, 24 Dec 2025 10:53:57 +0000 (11:53 +0100)] 
Fix --debug-shell

While we're at it, let's save ourselves from having to reason about
Python's capture rules for nested functions by moving _preexec() out
of spawn() and passing in arguments via functools.partial().

7 weeks agosandbox: Drop --proc
DaanDeMeyer [Wed, 24 Dec 2025 10:35:32 +0000 (11:35 +0100)] 
sandbox: Drop --proc

This is trivially replaced with --bind /proc $DST, so let's drop the
separate option. Maybe in the future we'll add --proc back but have it
actually mount a new procfs instance.

7 weeks agoMerge pull request #4089 from DaanDeMeyer/sandbox
Daan De Meyer [Wed, 24 Dec 2025 10:15:35 +0000 (11:15 +0100)] 
Merge pull request #4089 from DaanDeMeyer/sandbox

Various fixes

7 weeks agorun: Remove hack to keep packed file descriptors intact 4089/head
DaanDeMeyer [Wed, 24 Dec 2025 08:35:39 +0000 (09:35 +0100)] 
run: Remove hack to keep packed file descriptors intact

Now that we execute execvp() in the preexec function and therefore
skip python's close file descriptors logic, we don't need our hack
anymore to tell python the right file descriptors to close so let's
drop it.

7 weeks agomkosi-tools: Install libmicrohttpd explicitly on Arch
DaanDeMeyer [Wed, 24 Dec 2025 08:31:34 +0000 (09:31 +0100)] 
mkosi-tools: Install libmicrohttpd explicitly on Arch

It was made an optional dependency of the systemd package.

7 weeks agosandbox: Refactor mount_rbind()
DaanDeMeyer [Wed, 24 Dec 2025 08:14:13 +0000 (09:14 +0100)] 
sandbox: Refactor mount_rbind()

Let's split out separate functions for the mount API syscalls.

7 weeks agoRemove unneeded lambdas
DaanDeMeyer [Tue, 23 Dec 2025 19:58:15 +0000 (20:58 +0100)] 
Remove unneeded lambdas

7 weeks agoMerge pull request #4086 from DaanDeMeyer/fix
Daan De Meyer [Tue, 23 Dec 2025 20:12:35 +0000 (21:12 +0100)] 
Merge pull request #4086 from DaanDeMeyer/fix

run: Call execvpe() from preexec function

7 weeks agorun: Call execvpe() from preexec function 4086/head
DaanDeMeyer [Tue, 23 Dec 2025 16:17:01 +0000 (17:17 +0100)] 
run: Call execvpe() from preexec function

Python does its own executable lookup in $PATH before executing the preexec function, and
hence before we have set up the sandbox which influences the lookup results. To get around
that, let's call execvpe() ourselves inside the preexec() function, and not give Python the
chance to do it itself. This ensures we can do the proper executable lookup after setting
up the sandbox. If we can't find the executable, do nothing, and let Python do its own
search logic so it can return a proper error, which we cannot do from the preexec function.
Note that by doing this we also skip Python closing all open file descriptors except the
ones specified by the user in pass_fds, but since Python opens all file descriptors with
O_CLOEXEC anyway, we'll assume we're good and don't need to close open file descriptors
explicitly.

7 weeks agoMerge pull request #4087 from behrmann/morelint
Daan De Meyer [Tue, 23 Dec 2025 18:27:31 +0000 (19:27 +0100)] 
Merge pull request #4087 from behrmann/morelint

More linters

7 weeks agolinter: enable flake8-bugbear 4087/head
Jörg Behrmann [Tue, 23 Dec 2025 16:05:37 +0000 (17:05 +0100)] 
linter: enable flake8-bugbear

7 weeks agorun: use nosandbox for default sandbox arguments
Jörg Behrmann [Tue, 23 Dec 2025 16:25:17 +0000 (17:25 +0100)] 
run: use nosandbox for default sandbox arguments

This also adds nosandbox as an immutable function for bugbear to silence B008
[1].

[1] https://docs.astral.sh/ruff/rules/function-call-in-default-argument/

7 weeks agoClear environment in scopedenv before recreating it
Jörg Behrmann [Tue, 23 Dec 2025 16:17:57 +0000 (17:17 +0100)] 
Clear environment in scopedenv before recreating it

This fixes B003 [1].

[1] https://docs.astral.sh/ruff/rules/assignment-to-os-environ/

7 weeks agoDon't name unused variable in find_unused_vsock_cid
Jörg Behrmann [Tue, 23 Dec 2025 16:16:38 +0000 (17:16 +0100)] 
Don't name unused variable in find_unused_vsock_cid

This fixes B007 [1].

[1] https://docs.astral.sh/ruff/rules/unused-loop-control-variable/

7 weeks agoClobber original ValueError when GIT_CONFIG_COUNT fails to parse.
Jörg Behrmann [Tue, 23 Dec 2025 16:15:28 +0000 (17:15 +0100)] 
Clobber original ValueError when GIT_CONFIG_COUNT fails to parse.

This fixes B904 [1]. The original error is safe to discard, since we give a
proper error message to act on the error.

[1] https://docs.astral.sh/ruff/rules/raise-without-from-inside-except/

7 weeks agoFix: capturing of loop variable for systemd-dissect call
Jörg Behrmann [Tue, 23 Dec 2025 16:12:40 +0000 (17:12 +0100)] 
Fix: capturing of loop variable for systemd-dissect call

This fixes B023 [1]. Before only the last loop value would be captured.

[1] https://docs.astral.sh/ruff/rules/function-uses-loop-variable/

7 weeks agolinter: take all W lints from pycodestyle
Jörg Behrmann [Tue, 23 Dec 2025 15:50:13 +0000 (16:50 +0100)] 
linter: take all W lints from pycodestyle

This doesn't add any new warnings, so it seems okay to add.

7 weeks agorun: Pass cmd instead of cmdline
DaanDeMeyer [Tue, 23 Dec 2025 16:16:37 +0000 (17:16 +0100)] 
run: Pass cmd instead of cmdline

cmd is already stringified.

7 weeks agolinter: reformat ruff's linter.select table
Jörg Behrmann [Tue, 23 Dec 2025 15:49:18 +0000 (16:49 +0100)] 
linter: reformat ruff's linter.select table

7 weeks agoConfigure pyright included files
DaanDeMeyer [Mon, 22 Dec 2025 19:33:08 +0000 (20:33 +0100)] 
Configure pyright included files

Let's configure the files on which pyright should run to avoid long
startup times where it tries to check every single file in the workspace
directory.

7 weeks agoqemu: Register with systemd-machined in user session
Daan De Meyer [Mon, 22 Dec 2025 13:54:52 +0000 (14:54 +0100)] 
qemu: Register with systemd-machined in user session

Now that machine registration works unprivileged
since systemd v259, let's switch to unconditionally
registering machines with the user session
systemd-machined instance.

This breaks compat but the previous implementation
arguably wasn't useful or used, since registration
would only be done when running as root or if the
Register= feature was explicitly enabled. And if
not running as root, you'd have to authenticate
every time when booting the image to register it
which is arguably too annoying that anyone actually
bothered with it.

As vmspawn doesn't yet support registering with the
user machined instance, we stop registering vmspawn
machines for now. https://github.com/systemd/systemd/pull/40185
will add support for user machined regisration to
vmspawn.

For nspawn we stick with system machined registration
for now.

8 weeks agoCreate package cache dir before invoking pacman
Sebastian Wiesner [Sun, 21 Dec 2025 06:48:47 +0000 (07:48 +0100)] 
Create package cache dir before invoking pacman

Fixes #4081, works around upstream issue, see
https://gitlab.archlinux.org/pacman/pacman/-/issues/292

8 weeks agoMerge pull request #4080 from DaanDeMeyer/reflink
Jörg Behrmann [Sat, 20 Dec 2025 19:06:12 +0000 (20:06 +0100)] 
Merge pull request #4080 from DaanDeMeyer/reflink

util: Add reflink file-copying helpers

8 weeks agoCache hwdb step 4080/head
Daan De Meyer [Fri, 19 Dec 2025 20:02:30 +0000 (21:02 +0100)] 
Cache hwdb step

Running hwdb takes roughly a second and is
unlikely to ever rely on files added by extra
trees or such, so let's cache the step instead of
re-running it every single time.

8 weeks agotree-wide: Migrate some uses of copy_tree() to copyfile()
Daan De Meyer [Fri, 19 Dec 2025 20:00:04 +0000 (21:00 +0100)] 
tree-wide: Migrate some uses of copy_tree() to copyfile()

8 weeks agoutil: Add reflink file-copying helpers
Daan De Meyer [Fri, 19 Dec 2025 19:53:09 +0000 (20:53 +0100)] 
util: Add reflink file-copying helpers

shutil.copyfile() doesn't do reflinks internally,
so let's add our own helpers which do.

8 weeks agodistribution: do not default to release=VERSION_ID for openSUSE Tumbleweed
Antonio Alvarez Feijoo [Fri, 19 Dec 2025 11:14:11 +0000 (12:14 +0100)] 
distribution: do not default to release=VERSION_ID for openSUSE Tumbleweed

`config_default_release()` calls `detect_distribution()` to get the default
release if it's not set, which picks the value from os-release's `VERSION_ID`.
In openSUSE Tumbleweed this property has the snapshot number. Since
`mkosi-initrd` does not set `Release=` via config, mkosi thinks that it's Leap
and fails:

```
$ mkosi-initrd
‣ Validating certificates and keys
‣ Building main image
‣  Copying in sandbox trees…
‣  Installing openSUSE
Warning: Enforced setting: $releasever=20251217
Loading repository data...
Reading installed packages...
'Leap-release' not found in package names. Trying capabilities.
No provider of 'Leap-release' found.
‣ "zypper --installroot=/buildroot --cache-dir=/var/cache/zypp --non-interactive --no-refresh --releasever=20251217 --no-gpg-checks install --download in-advance --no-recommends --force-resolution filesystem Leap-release" returned non-zero exit code 104.
‣ "mkosi --force --directory= --format=cpio --output=initrd --output-directory=/tmp/tmpcvx9let7 --extra-tree=/usr/lib/modules/6.17.0-2-default:/usr/lib/modules/6.17.0-2-default --extra-tree=/usr/lib/firmware:/usr/lib/firmware '--remove-files=/usr/lib/firmware/*-ucode' --build-sources= --include=mkosi-initrd --kernel-modules=host --extra-tree=/usr/lib/modules/6.17.0-1-default/updates/hdaps.ko:/usr/lib/modules/6.17.0-1-default/updates/hdaps.ko --extra-tree=/usr/lib/modules/6.17.0-1-default/updates/thinkpad_ec.ko:/usr/lib/modules/6.17.0-1-default/updates/thinkpad_ec.ko --extra-tree=/usr/lib/modules/6.17.0-1-default/updates/tp_smapi.ko:/usr/lib/modules/6.17.0-1-default/updates/tp_smapi.ko --package-cache-dir=/var --cache-only=metadata --output-mode=600 --include /usr/lib/mkosi-initrd --include /etc/mkosi-initrd --sandbox-tree=/tmp/tmp0tjr7mwr --extra-tree=/etc/vconsole.conf:/etc/vconsole.conf" returned non-zero exit code 104.
```

Fixes 0b701c690ddcf3543bc1a698a1977ea390dbfd36

8 weeks agosandbox: Add close context manager
Daan De Meyer [Fri, 19 Dec 2025 19:50:00 +0000 (20:50 +0100)] 
sandbox: Add close context manager

8 weeks agoWrap build_microcode_initrd in complete_step
Laurence Kiln [Thu, 18 Dec 2025 17:00:18 +0000 (19:00 +0200)] 
Wrap build_microcode_initrd in complete_step

8 weeks agoFix typo in manpage
Laurence Kiln [Thu, 18 Dec 2025 16:52:24 +0000 (18:52 +0200)] 
Fix typo in manpage

8 weeks agomkosi-addon: drop Output=addon, addon.py already has a default
Luca Boccassi [Wed, 17 Dec 2025 20:38:46 +0000 (20:38 +0000)] 
mkosi-addon: drop Output=addon, addon.py already has a default

addon.py already passes mkosi-local.addon.efi by default if nothing
else is given, so it's not necessary to override it here. And it makes
it impossible to give custom names via Output= in your own config.

8 weeks agosandbox: return raw error code from the kernel and friends on failure
Yu Watanabe [Wed, 17 Dec 2025 16:44:42 +0000 (01:44 +0900)] 
sandbox: return raw error code from the kernel and friends on failure

When a system error occurs, the libseccomp returns -ECANCELED and
hides the original error code. That makes harder to debug the failure.
Let's make libseccomp propagate the original error code.

8 weeks agoconfig: replace deprecated sandbox verb with box in help message
Yu Watanabe [Wed, 17 Dec 2025 19:43:44 +0000 (04:43 +0900)] 
config: replace deprecated sandbox verb with box in help message

Follow-up for f1eab5a783bd3f5f0fb6a1d3dd60e9517cfae353.

8 weeks agoMerge pull request #4061 from LaurenceKiln/measure_steps
Daan De Meyer [Wed, 17 Dec 2025 18:53:36 +0000 (19:53 +0100)] 
Merge pull request #4061 from LaurenceKiln/measure_steps

8 weeks agoMigrate log_step to complete_step in places 4061/head
Laurence Kiln [Wed, 17 Dec 2025 18:15:22 +0000 (20:15 +0200)] 
Migrate log_step to complete_step in places

8 weeks agoReport duration of complete_step with --debug
Laurence Kiln [Wed, 17 Dec 2025 18:01:50 +0000 (20:01 +0200)] 
Report duration of complete_step with --debug

8 weeks agosandbox: fix wrong errno passed to OSError()
Yu Watanabe [Wed, 17 Dec 2025 16:25:58 +0000 (01:25 +0900)] 
sandbox: fix wrong errno passed to OSError()