Commit Graph
86720 Commits
Author SHA1 Message Date
Daan De Meyer 3363693935 nspawn: Add support for delegated UID ranges
We expose this via --private-users-delegate= which takes the number of
ranges to delegate. On top of delegating the ranges, we also mount in
the nsresourced socket and the mountfsd socket so that nested containers
can use nsresourced to allocate from the delegated ranges and mountfsd to
mount images.

Finally, we also create /run/systemd/dissect-root with systemd-tmpfiles to
make sure it is always available as unpriv users won't be able to create it
themselves.
2026-02-25 11:31:06 +01:00
Daan De Meyer fd05c6c759 vmspawn: Add support for foreign UID range owned directories 2026-02-25 11:31:04 +01:00
Daan De Meyer 104579e401 dissect: Go via service on ENOENT from loop_device_make() as well
ENOENT means /dev/loop-control isn't there which means we're in a
container and should go via mountfsd.

At the same time, reverse the check for fatal actions as almost all
actions can be done via mountfsd, only --attach needs the loop device.
2026-02-24 18:29:37 +01:00
Daan De Meyer 4bc0d8a9a1 mountfsd: Relax user namespace checks
- Allow foreign UID range
- Allow delegated UID ranges

Both of these can now be mapped by nsresourced into user namespaces
and hence should be accepted by mountfsd.
2026-02-24 18:29:37 +01:00
Daan De Meyer 838528104b nsresourced: Optionally map foreign UID range
Whenever delegating UID ranges to a user namespace, it can also be
useful to map the foreign UID range, so that the container running in
the user namespace with delegated UID ranges can download container
images and unpack them to the foreign UID range.

Let's add an option mapForeign to make this possible. Note that this option
gives unprivileged users full access to the any foreign UID range owned directory
that they can access. Hence it is recommended (and already was recommended) to
store foreign UID range owned directories in a 0700 directory owned by the
owner of the tree to avoid access and modifications by other users.

This is already the case for the main users of the foreign UID range,
namely /var/lib/machines, /var/lib/portables and /home/<user> which all
use 0700 as their mode.

Users will also be able to create foreign UID range owned inodes in any
directories their own user can write to (on most systems this means /tmp,
/var/tmp and /home/<user>).
2026-02-24 18:29:37 +01:00
Daan De Meyer 95d05079bf nsresourced: Add support for self mappings with delegations
mkosi does all of its environment setup in an unprivileged user
namespace with an identity mapping. When it invokes nspawn and nspawn
tries to get a transient userns from nsresourced, this fails as no
transient ranges are mapped into mkosi's unprivileged userns (as doing
so would require privileges).

To fix this problem, let's allow allocating unprivileged self user
namespaces in nsresourced, similar to what the kernel allows, except that
we also support delegations for these. This means that mkosi can get its
unprivileged userns as before from nsresourced, but it can also request a
delegated 64K range inside that userns as well, which nsresourced can then
allocate to nspawn later when it asks for one.

Similar to the kernel, we disallow setgroups for self mappings. However,
instead of doing this via /proc/self/setgroups, which applies to the current
user namespace and all its child user namespaces, we use the BPF LSM to deny
setgroups instead, so that it can still be allowed for child user namespaces.
We need this because as soon as a container launches in a child user namespace
using one of the delegated mappings, it has to be able to do setgroups() to be
able to function properly.

To allow mapping the root user, we need to add the CAP_SETFCAP capability to
nsresourced.
2026-02-24 18:29:37 +01:00
Daan De Meyer 025439faaa nsresourced: Add support for delegated ranges
We want to support the scenario where we bind mount the nsresourced
varlink socket into a container to allow nested containers where the
outer container runs in its own transient range from nsresourced but
can still allocate transient ranges for its own nested containers.

To support this use case let's add support for delegation. Delegated
ranges are allocated when allocating the primary range and are propagated
1:1 to the user namespace. We track delegated ranges in ".delegate" files
in the userns registry so that they can't be used for other range allocations.

We make one exception for delegated ranges though, if we get a request from
a user namespace that is a child of the user namespace that owns the delegated
ranges, we allow allocating from the delegated range. The parent userns already
has full ownership over the child userns, so it doesn't matter that the parent
userns and the child userns share the same range. This allows making use of
delegated ranges without having to run another copy of nsresourced inside the
parent userns to hand out from the delegated range.

To support recursive delegations, we keep track of the previous owners of the
delegated range and restore ownership to the last previous owner when the current
owner is freed.
2026-02-24 18:29:37 +01:00
Daan De Meyer 6c2d437585 nsresourced: Allow operations outside transient UID/GID ranges
The purpose of the userns-restrict BPF-LSM program is to prevent the
transient ranges leaking to disk, so let's allow operations outside the
transient UID ranges, even if the mount is not allowlisted.

This is preparation for the next commits where we'll add support for mapping
the current user and the foreign UID range into the user namespaces provisioned
by nsresourced. Operations creating files/directories as these UIDs/GIDs should
not need the corresponding mount to be allowlisted with nsresourced.
2026-02-24 18:29:37 +01:00
Mike Yuan 21fd534ae8 systemctl: introduce enqueue-marked-jobs verb (#40810) 2026-02-24 18:08:22 +01:00
Yu Watanabe 93e1b0f328 man: coredump: KeepFree/MaxUse clarification of default values (#40796)
On sd-coredump for both `MaxUse` and `KeepFree` defaults has a caveat,
it may set it differently if not explicit configured.
On `MaxUse` it'll cap to 4GiB as seem
[here](https://github.com/systemd/systemd/blob/d39b10371964d048a3c5d7dbf84552ecdba66bbe/src/coredump/coredump-vacuum.c#L82).
Similar for `KeepFree`
[here](https://github.com/systemd/systemd/blob/d39b10371964d048a3c5d7dbf84552ecdba66bbe/src/coredump/coredump-vacuum.c#L98)

Also show that `MaxUse` takes precedence.

Making this clear at the man page
2026-02-25 01:35:38 +09:00
Antonio Alvarez Feijoo 8ea1ae25ab import/pull-oci: fix several OOM checks
Follow-up for a9f6ba0496
2026-02-24 17:34:09 +01:00
Kai Lüke e48b6fca76 journalctl: order systemd-journalctl.socket after systemd-sysusers
The socket failed on boot due to a ordering problem caused by
systemd-sysusers running later and thus the socket group was still
missing. The socket unit can only start when systemd-sysusers created
the group.
Order the socket after systemd-sysusers.service to have the group
available.
2026-02-25 00:15:11 +09:00
Yu Watanabe 20ce80436e udev: hwdb: replace ID_INPUT_JOYSTICK_INTEGRATION (#40761)
Could ask to Bastien Nocera who originally commited the joysticks hwdb
integration
https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1429#note_3338386
and stated that was for use in iio-sensor but later anything was done.

As the variable was never used replace it with the new variable actually
in the process to be use in libinput. Even more at least some of the
idea that was planed for ID_INPUT_JOYSTICK_INTEGRATION could be done in
libinput.

Actually ID_INPUT_JOYSTICK_INTEGRATION was never used anywhere, replace
it with ID_INTEGRATION.

Follow up: a4381cae8b.
2026-02-25 00:13:15 +09:00
Mike Yuan 81f31dccb8 man/systemctl: deprecate --marked 2026-02-24 16:00:05 +01:00
Mike Yuan c008f88ded systemctl: introduce enqueue-marked-jobs verb, stop lumping it with distinct verbs 2026-02-24 16:00:05 +01:00
Mike Yuan a8ceed0000 Revert "systemctl: allow --marker with start/stop too"
This reverts commit 351b4dd123.

I'm pretty sure we should not create more of these multiplexer
interfaces, which in this specific also leads to a fair bit of
confusion: start/stop/reload-or-restart --marked all enqueue
all job types.

Instead, a dedicated verb will be introduced in later commits.
2026-02-24 15:48:53 +01:00
Yu Watanabe c418543a65 include: update kernel headers from v7.0-rc1
In v7.0-rc1, the kernel introduces typelimits.h to define __KERNEL_INT_MIN/_MAX.
Also, NULL_FS_MAGIC has been introduced for immutable rootfs..
2026-02-24 23:08:52 +09:00
Yu Watanabe fb0078ae69 test: test io.systemd.JournalAccess
Follow-up for a109189fab.
2026-02-24 12:59:38 +00:00
Yu Watanabe 3cfb169988 errno-list: filter out EFSBADCRC and EFSCORRUPTED
These are introduced in kernel v7.0.
2026-02-24 12:58:09 +00:00
Luca Boccassi a11f07d78c NEWS: update for recent merges 2026-02-24 12:00:06 +00:00
Alessandro Astone d0ad8f1175 udev: Trigger uaccess builtin on xaccess-* prefix
Fixup xaccess trigger after the rework.
There's no single `xaccess` tag anymore; instead we match on a prefix.
2026-02-24 11:54:15 +00:00
Luca Boccassi d70a73c05b resolved: Add ifindex=0 support for BrowseServices to browse all mDNS interfaces (#40133)
With v259, resolved can be used to replace Avahi for mDNS service
discovery and announcement. One key difference in the API is that Avahi
by default browses on all available interfaces by passing a special
`AVAHI_IF_UNSPEC` (-1) interface index value. With this change, passing
ifindex value `0` can be used to achieve the same , so this will work:
```
# Browse on all available interfaces
varlinkctl call --more unix:/run/systemd/resolve/io.systemd.Resolve \
    io.systemd.Resolve.BrowseServices \
    '{"domain":"local","type":"_display._tcp","ifindex":0,"flags":0}'
```
Not having to iterate through all interfaces on the client side then
also makes it more straight forward to build a resolve-avahi-compat
library for painlessly replacing Avahi with systemd-resolved.

A PoC compat lib requiring this change is available at
https://github.com/LorbusChris/resolve-avahi-compat
2026-02-24 11:53:47 +00:00
Luca Boccassi 92ca07e93c Some bug fixes for logind inhibitors (#40400)
See individual commits

Related:
- https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4040
- https://gitlab.gnome.org/GNOME/gnome-session/-/merge_requests/170
-
https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/3309
2026-02-24 11:50:01 +00:00
Adrian Vovk b965ce61aa NEWS: Add note about logind's Can* return values
We've changed them to return additional values, which may be a breaking
change for desktop environments. In practice, it doesn't seem to be a
major issue. However, let's make sure to document the changes in the
NEWS anyway!
2026-02-23 20:03:08 -05:00
Adrian Vovk 482aa607a5 login1: Emit NCurrentInhibitors changed events
Currently, there's no way for a desktop environment to detect when a
systemd inhibitor has been added or removed. This means that a desktop
environment that wishes to show current inhibitors to the user will be
either forced to poll systemd or just use stale data.

Now, the desktop can listen for changed events on NCurrentInhibitors and
call GetInhibitors() in response to that.
2026-02-23 20:03:07 -05:00
Adrian Vovk 46075fc92b login1: Add "inhibited" state to Can* methods
Desktops cannot currently tell the difference between a power action
being set to challenge permanently (i.e. because the sysadmin wanted to
restrict the given user) and a power action being set to challenge
because it's temporarily inhibited.

Thus, a desktop might take an action that is valid in the first case but
not the second case. For instance: GNOME hides all of its automatic
suspend settings from the UI whenever a sleep inhibitor is active.

This now returns a new state: "inhibited". It communicates to the
desktop that the action is available normally, but at the moment the
desktop isn't allowed to perform the action due to an inhibitor.

Related: https://github.com/systemd/systemd/issues/37311
2026-02-23 20:03:06 -05:00
Zbigniew Jędrzejewski-Szmek 04d2a86e66 manager: add needs-stop/needs-start (#40709)
Intend to use these in the deb packaging scriptlets

Fixes: #19755
2026-02-24 00:36:06 +01:00
Luca Boccassi f895dae683 mkosi: update debian commit reference to 89a825b80ee85e58b530cd95438988a6fb3531a3
* 89a825b80e Install new files for upstream build
* 38b1a75eaa systemd.postinst: update journal catalog after reexecing managers
* 9420ffa0dd Install new files for upstream build
* cb5fdf4df0 Install sd-report from new path
* 2501efe312 homed: drop dependency satisfied since bookworm/noble
* 424262b674 d/control: add TODO
* 9aaa01c99d d/libsystemd-shared.preinst: refuse to upgrade without unified cgroupv2 hierarchy
* 7d0ac8a4b8 Install new files for upstream build
* 7e55d41841 Do not install legacy.conf in upstream builds
* 190387958e d/e/checkout-upstream: try to install build deps with sudo in case it fails
* 2a4aa9f426 Disable installing runlevel targets for upstream build
* e02600f2d9 Install new files for upstream build
* 0f1a56cf10 Update changelog for 259.1-1 release
* e463300b1a d/e/checkout-upstream: try to install build deps again after switching to CI branch
* b3f72821e5 Install ask-password polkit policy file
* 8219d561ae Restrict the tpm2-generator manpage to arches where it is built
* 30a0f27283 systemd.postinst: reexec system manager before user instances
* 1fc9ea2790 systemd.postinst: reexec before restarting any service
* d9991aeb22 d/control: use libarchive13t64 | libarchive13 for bookworm/jammy
* b750346711 d/control: make systemd-container Depends: libarchive13t64

Fixes https://github.com/systemd/systemd/issues/40777
2026-02-23 23:14:37 +00:00
Luca Boccassi 61b31f7999 sd-device,udev: several fixlets and cleanups for managing tags (#40786) 2026-02-23 21:53:28 +00:00
Lennart Poettering ab83c7489d sysupdated: Split Update() into Acquire() and Install() D-Bus methods (#40628)
These mirror the `sysupdate acquire` and `sysupdate install` verbs,
which are themselves a split of `sysupdate update` into downloading and
installing stages.

I have dropped the existing `Update()` method in the final commit, as
per the suggestion on
https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/2004#note_2145880.
If the D-Bus API for `sysupdated` is considered stable now, though, I
can drop that commit.

CC @AdrianVovk

Fixes https://github.com/systemd/systemd/issues/34814
2026-02-23 22:08:37 +01:00
Daan De Meyer 868fdc5520 Several follow-ups for JournalAccess varlink interface (#40794) 2026-02-23 20:17:31 +01:00
André Paiusco cbd7b9033b man: coredump: MaxUse takes precedence 2026-02-23 16:43:09 +00:00
Philip Withnall 8b5374d6c2 sysupdated: Drop the Update() D-Bus method
Now that it’s been replaced by `Acquire()` and `Install()`, there’s no
need to expose it as a separate method. Wrappers around `sysupdated` can
still expose an ‘update’ convenience verb by calling those two methods.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Helps: https://github.com/systemd/systemd/issues/34814
2026-02-23 16:35:19 +00:00
Philip Withnall 7537717aed test: Expand sysupdate test to test updatectl update
This further expands the sysupdate test to run the suite a fourth time,
testing that `updatectl update` behaves the same as `sysupdate update`
and `sysupdate acquire; sysupdate update --offline`.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2026-02-23 16:35:15 +00:00
Philip Withnall b0ca987cd9 updatectl: Expose partial/pending updates in the updatectl list output
And expand the tests to catch if any more JSON fields are added to the
sysupdated output in future without being added to `updatectl`’s parser.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Helps: https://github.com/systemd/systemd/issues/34814
2026-02-23 16:35:10 +00:00
Philip Withnall a5ff474a2b updatectl: Use sysupdated’s Acquire() and Install() methods
Rather than calling `Update()`. This should allow us to eventually drop
`Update()`.

This should just be an internal change, and should not result in any
user-visible changes to the behaviour of `updatectl update`.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Helps: https://github.com/systemd/systemd/issues/34814
2026-02-23 16:35:05 +00:00
Philip Withnall f0b2ea63f4 sysupdated: Add Acquire() and Install() D-Bus methods
These mirror the `sysupdate acquire` and `sysupdate update --offline`
verbs, which are themselves a split of `sysupdate update` into
downloading and installing stages.

The existing `sysupdated` `Update()` method is kept for now, for
convenience. It might be dropped in future.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Helps: https://github.com/systemd/systemd/issues/34814
2026-02-23 16:35:01 +00:00
André Paiusco 1e2c2a04fc man: coredump: KeepFree/MaxUse clarification of default values 2026-02-23 16:22:32 +00:00
Mike Yuan d39b103719 core: Introduce ConditionPathIsSocket= (#40791) 2026-02-23 17:07:28 +01:00
DaanDeMeyer f29edb227c repart: Use new mkfs.xfs support for populating from directories
xfsprogs 6.17.0 added support for populating xfs filesystems from
directories. As this supports extended attributes unlike our current
hack with protofiles. Let's make use of the new feature in mkfs-util.c

As there's no clean way to do feature detection on the mkfs.xfs binary,
we drop support for the old hack with protofiles that we had before.
2026-02-23 15:04:41 +00:00
Luca Boccassi 351b4dd123 systemctl: allow --marker with start/stop too 2026-02-23 13:05:23 +00:00
Luca Boccassi f3a34fcc3a manager: add 'needs-stop/needs-start' markers
Useful for packaging scripts, when units are removed.
When multiple markers are assigned without +/-, the last one wins.
When using +/-, the job merging logic is followed to the extent possible.
2026-02-23 13:05:23 +00:00
Daan De Meyer a51e5bd1f1 core: Introduce ConditionPathIsSocket= 2026-02-23 13:08:49 +01:00
Daan De Meyer 54b745d7bb test-condition: Migrate to new assertion macros 2026-02-23 12:28:10 +01:00
Daan De Meyer a2a78602b0 mountfsd: Try to polkit auth when the verity key is not available
If we include a verity signature but the corresponding key is not in
the kernel keyring or userspace, try to get polkit auth similar to how
we do the same if the image doesn't pass the policy.
2026-02-23 12:11:04 +01:00
Luca Boccassi 0e3e62cfc7 Translations update from Fedora Weblate (#40789)
Translations update from [Fedora
Weblate](https://translate.fedoraproject.org) for
[systemd/main](https://translate.fedoraproject.org/projects/systemd/main/).



Current translation status:

![Weblate translation
status](https://translate.fedoraproject.org/widget/systemd/main/horizontal-auto.svg)
2026-02-23 10:54:21 +00:00
Mike Yuan d8302c2fd9 journalctl-vl-server: allow querying units for specific uid in system scope
This also moves journal_add_unit_matches() back to
journalctl-filter.[ch], as I see more appropriate.
2026-02-23 10:43:00 +01:00
Mike Yuan bd994b2f81 journalctl-vl-server: do not output in reverse order
While at it, do not log from varlink method callback,
as per our usual style.
2026-02-23 10:21:57 +01:00
Mike Yuan 9d193c8f13 journalctl-vl-server: 'entry' is never NULL 2026-02-23 10:21:57 +01:00
Mike Yuan ffe69b3fa1 journalctl-vl-server: use SD_JSON_BUILD_PAIR_VARIANT 2026-02-23 10:21:57 +01:00