Commit Graph
89280 Commits
Author SHA1 Message Date
Yaping Li d2bdaab55e logind: add ListInhibitors Varlink method
The Varlink ListInhibitors method is the counterpart of D-Bus
ListInhibitors. Like its D-Bus counterpart it is zero-filter and streams
the full list of currently registered inhibitors using the
SD_VARLINK_METHOD_MORE pattern, returning InhibitorInfo objects with
Id, What, Who, Why, Mode, UID, PID, and Since fields.

There is no D-Bus GetInhibitor getter to fold in, so no unique-key
filter is introduced here.
2026-05-22 02:56:24 +00:00
Yaping Li b4de3e5759 logind: add ListSeats Varlink method
The Varlink ListSeats method accepts an optional Id filter, folding in
the D-Bus GetSeat(s) lookup.

Passing Id yields a single reply on match, or NoSuchSeat on miss.
Passing no Id with the 'more' flag streams the full list; passing no
Id without 'more' resolves to the caller's seat (preserving the
ergonomic default of GetSeat). The Id filter supports the special
names "self" and "auto" which resolve to the caller's seat.

The SeatInfo type in the io.systemd.Login Varlink IDL carries all seat
properties matching the D-Bus org.freedesktop.login1.Seat interface.
2026-05-22 02:56:24 +00:00
Yaping Li 355f73a564 logind: add ListUsers Varlink method
The Varlink ListUsers method accepts optional UID and PID filters,
folding in the D-Bus GetUser(u) and GetUserByPID(u) lookups.

Passing a unique-key filter (UID and/or PID) yields a single reply on
match, or NoSuchUser on miss. Passing no filter with the 'more' flag
streams the full list; passing no filter without 'more' resolves to
the caller's user (preserving the ergonomic default of GetUser). If
both UID and PID are specified they must reference the same user,
otherwise NoSuchUser is returned.

The UserInfo type in the io.systemd.Login Varlink IDL carries all
user properties matching the D-Bus org.freedesktop.login1.User
interface.
2026-05-22 02:56:24 +00:00
Yaping Li 1f9fb6300b logind: add ListSessions Varlink method
The Varlink ListSessions method accepts optional Id and PID filters,
folding in the D-Bus GetSession(s) and GetSessionByPID(u) lookups.

Passing a unique-key filter (Id and/or PID) yields a single reply on
match, or NoSuchSession on miss. Passing no filter streams the full
list (requires the 'more' flag). Specifying both Id and PID acts as a
consistency check: both must refer to the same session, otherwise
NoSuchSession is returned.

The Id filter supports the special names "self" and "auto" which
resolve to the caller's session. The SessionInfo type in the
io.systemd.Login Varlink IDL carries all session properties matching
the D-Bus org.freedesktop.login1.Session interface.
2026-05-22 02:56:24 +00:00
Yaping Li ecf309cab8 logind: let {session,user,seat}_get_idle_hint() return bool and always set output timestamp
These helpers returned int but in practice only ever produced 0/1.
session_get_idle_hint() silently swallowed negative returns from
get_tty_atime()/get_process_ctty_atime() and fell through to
return false; user_get_idle_hint() and seat_get_idle_hint() propagated
errors from session_get_idle_hint() that could no longer occur.

Change all three to return bool and always set *t on non-NULL output.
session_get_idle_hint() previously did not set *t on the
!SESSION_CLASS_CAN_IDLE() early return; fix by defaulting *t at the
top of the function. Callers that read *t after a false return now see
DUAL_TIMESTAMP_NULL rather than uninitialized memory.

Update all callers: drop dead < 0 error checks, drop > 0 coercion,
drop DUAL_TIMESTAMP_NULL pre-init at sites that only pass &t to the
helpers.
2026-05-22 02:56:22 +00:00
Yaping Li 4d2bc332f3 sd-varlink: skip IDL validation on synthetic empty terminator
When a streaming method's callback returns 0 with no replies enqueued and
sd_varlink_set_sentinel() was passed NULL (POINTER_MAX), the framework
emits an empty parameters reply via sd_varlink_reply(v, NULL) as a clean
stream terminator. That call validated the empty parameters against the
method's output IDL — which always failed when the IDL declared any
mandatory output field, generating a spurious 'didn't pass validation'
warning even though the empty terminator is correct by construction.

Move the body of sd_varlink_reply() into a static varlink_reply_internal()
that takes a skip_validation flag. The public sd_varlink_reply() keeps
its existing behavior (validation enabled). Add a static
varlink_reply_terminator() helper that wraps
varlink_reply_internal(v, NULL, /* skip_validation= */ true), and route
varlink_dispatch_sentinel() through it for the synthetic empty terminator,
so both the synchronous dispatch path (varlink_dispatch_method()) and the
fiber path (varlink_fiber_entry()) skip validation in one place.

Without this, callers who want 'streaming method, possibly empty result'
semantics had to either fire a logically wrong 'NotFound'-style error
sentinel on empty (sysext.List, BootControl.ListBootEntries pattern) or
mark every output field NULLABLE just to placate the validator (the
io.systemd.Manager.EnqueueMarkedJobs approach), misrepresenting the
contract — exactly the tradeoff the FIXME in pcrlock.c flagged. With
this change, the empty terminator is invisible to the IDL validator and
the FIXME is no longer needed.

Co-developed-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 02:34:11 +00:00
Luca Boccassi b256396e2a Update NEWS 2026-05-21 21:59:17 +01:00
Luca Boccassi 918c592272 bootctl: add A/B fallback for sd-boot updates (#41650)
On `bootctl install`, two EFI boot entries are registered: one for the
primary sd-boot binary and one for a fallback. On `bootctl update`, the
existing primary binary is rotated to the fallback path before the new
version is installed, so the fallback entry always points to the
previous known-good binary.

```
$ sudo bootctl install
...
Created EFI boot entry "Linux Boot Manager".
Created EFI boot entry "Fallback Linux Boot Manager".
$ sudo bootctl update
Copied "/boot/EFI/systemd/systemd-bootaa64.efi" to "/boot/EFI/systemd/systemd-boot-fallbackaa64.efi".
Copied "/usr/lib/systemd/boot/efi/systemd-bootaa64.efi" to "/boot/EFI/systemd/systemd-bootaa64.efi".
$ efibootmgr
...
Boot0004* Linux Boot Manager        HD(...)/\EFI\systemd\systemd-bootaa64.efi
Boot0005* Fallback Linux Boot Manager     HD(...)/\EFI\systemd\systemd-boot-fallbackaa64.efi
```

Fixes: #23805
2026-05-21 21:56:05 +01:00
Luca Boccassi 818397761e Update NEWS 2026-05-21 21:49:22 +01:00
Luca Boccassi 2f2203c231 boot,stub: explicitly measure select SMBIOS objects (#42233)
This is supposed to protect our SMBIOS type 11 importing for
credentials. Note that firmwares are supposed to measure SMBIOS anyway
to PCR 1. Alas firmware doesn't really do that in various cases. Hence
let's do so again, for select objects.

This closes a gap where some of the input for OS (i.e. system
credentials places in smbios11) isn't measured properly.

(I really want this to get into v261, because this will fuck up the PCRs
a bit more, and we already have the new separator measurement in v261,
hence there's value in getting this merged at the same time, so that we
don't break the measurements a 2nd time)
2026-05-21 21:44:42 +01:00
Lennart Poettering 0761c9f493 update TODO 2026-05-21 21:44:06 +01:00
Lennart Poettering 14a05bd208 pcrlock: port --help to help-util.[ch] apis 2026-05-21 21:44:06 +01:00
Lennart Poettering 8cc5dbe9cd pcrlock: decode new smbios events 2026-05-21 21:44:06 +01:00
Lennart Poettering e4f0935f19 bootctl: show SMBIOS feature flags 2026-05-21 21:44:06 +01:00
Lennart Poettering c3d8c2d25c docs: document the new smbios measurements 2026-05-21 21:44:06 +01:00
Luca Boccassi 2b8ba0e05a Update NEWS 2026-05-21 21:13:10 +01:00
Yu Watanabe 580bd17d90 Use malloc'ed strings instead of static libc buffers for user and group lookup (#42184)
Preparation for other work.
2026-05-22 05:09:56 +09:00
Luca Boccassi ecec206cb4 hostnamed,pid1,firstboot: introduce "machine tags" concept (#42223)
Fixes: #38591
2026-05-21 20:57:34 +01:00
Luca Boccassi c7655af547 ci: ignore failures to chown journal in GHA jobs
Otherwise when the build fails, this fails, and the GUI jumps to the
chown failure instead of the actual failure

Follow-up for 35bf1c8264
2026-05-21 20:43:56 +01:00
Daan De Meyer 1d102a663e meson: Add libucontext to libshared_deps
Fixes #42236
2026-05-21 19:41:37 +01:00
Clayton Craft 301b4193a0 bootctl: remove fallback EFI Boot#### variable on uninstall
This cleans up the fallback Boot#### entry that was registered on
install. The logic cleaning up variables was moved from verb_remove into
a new remove_variables function, which mirrors the install side.
2026-05-21 11:30:46 -07:00
Clayton Craft 6e0ebe437b bootctl: register fallback EFI Boot#### entry on install
This adds a second install_boot_option call to register a Boot#### entry
pointing at systemd-boot-fallback{arch}.efi, and place it immediately
after the primary entry in BootOrder.

The fallback file does not exist on the ESP on first install and is
only created on first update when the existing primary binary is
rotated to the fallback path. We register the variable anyway, so
that the entry exists in the BootOrder once the fallback file shows up.
Until then, firmware that reaches the fallback entry will fail to
load it and fall through to the next entry in BootOrder, which is
fine. install_boot_option gains a require_existing parameter so the
existing early return on a missing ESP path can be skipped for the
fallback, where a missing path is expected.

This also does a bit of refactoring by splitting the bottom part of
run_install() into a new install_variables() function that handles
registering both the primary and fallback entries.
2026-05-21 11:30:45 -07:00
Clayton Craft 037b9a0680 bootctl: back up sd-boot binary to fallback path on update
When a primary sd-boot binary already exists on the ESP and is being
updated, it is copied to systemd-boot-fallback{arch}.efi before installing
the new version. This gives firmware a fallback Boot#### entry pointing
to the previous binary in case the new one fails to load.

The fallback is preserved (not overwritten) when its product and version
match the currently booted bootloader (read from the LoaderInfo EFI
variable), since that means it already holds the known good binary that
booted this session. In all other cases it is overwritten with the current
primary, when no fallback exists yet, when LoaderInfo is unavailable, or
when the fallback's product or version differs from what booted.

This also moves the version_check() call up so its result determines
both the rotation decision and the main copy, and avoids a duplicate
check (and duplicate "Skipping..." log) when the binary is already
current.
2026-05-21 11:30:45 -07:00
Clayton Craft 6c356b6a8b bootctl: add after_slot parameter to insert_into_order()
This adds an after_slot parameter that, when not set to UINT16_MAX,
requests that the new slot be placed immediately after the given slot in
BootOrder. When after_slot is set and the new slot already exists in
BootOrder, it will leave its position alone. This is so that if a user
reorders it, we don't stomp on their changes.
2026-05-21 11:26:59 -07:00
Clayton Craft bb520fd6a5 bootctl: add description and ret_slot parameters to install_boot_option()
This moves creation of the EFI boot option description out of
install_boot_option and into the caller, and adds a ret_slot output
parameter for capturing the assigned BootOrder slot. This allows reusing
the function for installing variables with different descriptions.
2026-05-21 11:26:59 -07:00
Clayton Craft 1027cbd8ae bootctl: rename install_variables/remove_variables to install/remove_boot_option
These functions install or remove a single EFI Boot#### entry, not
"all variables," so this renames them to better reflect what they do.
2026-05-21 11:26:59 -07:00
Clayton Craft a2ba538ead bootctl: fix removing variables on uninstall
remove_variables looks up the EFI boot entry by matching both the path
and the partition UUID and it wasn't actually removing any entries
because verb_remove was passing SD_ID128_NULL, so the lookup never
matched and Boot#### entries were left behind on uninstall.

Fixes 38433a6
2026-05-21 11:26:59 -07:00
Rocker Zhang a52e0f87f5 systemctl: also attempt kexec image extraction on EINVAL
load_kexec_kernel() retries kexec_file_load() with an extracted kernel
(decompressed Image / ZBOOT PE / UKI) when the kernel rejects the image,
but it only does so when kexec_file_load() failed with ENOEXEC. On arm64
that retry never happens: arm64's image_probe()
(arch/arm64/kernel/kexec_image.c) returns -EINVAL on an ARM64_IMAGE_MAGIC
mismatch, whereas x86's bzImage64_probe() and the generic
kexec_image_probe_default() return -ENOEXEC. So `systemctl kexec` of a
UKI on arm64 skips the extraction path and falls back to the
/usr/sbin/kexec binary, which is no longer a dependency since e107c7ead0
("systemctl: replace kexec-tools dependency with direct kexec_file_load()
syscall") -- leaving kexec broken.

Accept EINVAL in addition to ENOEXEC. This is safe: the extraction in
kexec_maybe_decompress_kernel() re-gates on the actual file magic (MZ /
compression headers) and is a no-op returning 0 for anything else, so an
EINVAL that is not a format mismatch just falls through to the existing
fallback as before.

Fixing this in systemd (rather than only in the kernel) is appropriate:
systemd must keep working with already-shipped arm64 kernels whose
kexec_file_load() returns EINVAL for an unrecognized image magic.

Relates to: https://github.com/systemd/systemd/issues/28538

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 19:00:58 +01:00
Lennart Poettering 29c6d1c125 boot: measure select SMBIOS objects explicitly 2026-05-21 18:34:01 +02:00
Lennart Poettering 9990c03295 update TODO 2026-05-21 18:30:16 +02:00
Lennart Poettering 9a28e54b54 ci: add test for new machine-tags concept 2026-05-21 18:30:16 +02:00
Lennart Poettering b6d9a987f7 firstboot: allow configuring machine tags via firstboot 2026-05-21 18:30:16 +02:00
Lennart Poettering 461ec6facc condition: add a condition that matches against the machine tags 2026-05-21 18:30:16 +02:00
Lennart Poettering 71eac88e5f hostnamectl: add support for tagging the machine 2026-05-21 18:30:16 +02:00
Lennart Poettering 290a417699 hostnamectl: port to new --help API 2026-05-21 18:30:16 +02:00
Lennart Poettering 1b94530b14 hostnamed: introduce "machine tags" concept
For management purposes it's useful to be able to "tag" a machine with
various labels. Let's add a field for that to /etc/machine-info and make
it settable.

Fixes: #38591
2026-05-21 18:30:16 +02:00
Lennart Poettering 5e82a8d6ee hostnamed: port to regular string_is_safe() 2026-05-21 18:30:16 +02:00
Lennart Poettering 7f5503f15d tpm2: add nvpcr allocation priorities (#42227)
nvindex space is very scarce, let's hence introduce "priorities" on
nvpcrs, so that if we haven't got enough space for all we have some
control which ones get dropped and which ones kept.
2026-05-21 18:19:39 +02:00
Lennart Poettering 740a5ce947 core: introduce ConditionFraction= that is true on a certain percantage of the fleet 2026-05-21 18:19:07 +02:00
Daan De Meyer ecaac1c0a2 TEST-08-INITRD: Set up exitrd on boot rather than including in image
Just copy the initramfs from the VM rather than doing it during
the image build.
2026-05-21 18:06:07 +02:00
Zbigniew Jędrzejewski-Szmek c83ff0e58d user-util: return malloc'ed strings in get_user_creds
get_user_creds would use getpwnam() and then returns strings pointing
into the static buffer. This seems very iffy. Let's duplicate the
strings properly
2026-05-21 18:02:05 +02:00
Zbigniew Jędrzejewski-Szmek 3ecd6b69cf user-util: stop mangling groupname in get_group_creds
The param was input/output, which is unexpected and confusing and
actually made most callers much more complicated than they needed to be.
The function was playing fast and loose with the return value. In some
cases it was returning a static string, which would be completely fine.
But in other case it was returning a pointer into the getgrgid static
buffer, i.e. that return value could be overwritten. AFAICT, this didn't
matter in any of the callers, but we shouldn't do that anyway.

So use a separate output param with an allocated string that the caller
is responsible for.

It turns out that all callers pass NULL (outside of tests) and zero for
flags. So the function _could_ be simplified. But get_user_creds is
called with all the params actually used, and I think having the the
functions so different wouldn't be nice. I first wrote a commit to
drop the unused params, but then I discarded it.

The error message in exec-invoke.c is fixed.
2026-05-21 18:02:05 +02:00
Zbigniew Jędrzejewski-Szmek 3d0a05dcc3 core/exec-invoke: fix bogus error code
r was bogus here. getusername_malloc() can only fail on oom,
so we can simplify this.
2026-05-21 18:02:05 +02:00
Luca Boccassi df506aa9ef Translations update from Fedora Weblate (#42231)
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-05-21 16:16:33 +01:00
joo es 38c0073d43 po: Translated using Weblate (Arabic)
Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: joo es <jonnyse@users.noreply.translate.fedoraproject.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/ar/
Translation: systemd/main
2026-05-21 15:10:13 +00:00
김인수 dd76dfa4a0 po: Translated using Weblate (Korean)
Currently translated at 100.0% (270 of 270 strings)

Co-authored-by: 김인수 <simmon@nplob.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/ko/
Translation: systemd/main
2026-05-21 15:10:13 +00:00
Luca Boccassi 9f016b3810 Update NEWS 2026-05-21 16:05:52 +01:00
Rocker Zhang 1bd2acf193 test: cover lingering users surviving a soft-reboot in TEST-82
Regression coverage for the soft-reboot linger bug fixed in
9f25feb4ed ("logind: keep lingering users at startup-time GC", #41789):
a lingering user's user@.service was started after a hardware reboot but
not after `systemctl soft-reboot`, because logind GC'd the user at
startup before user_start() ran.

On the first boot, enable lingering for the pre-existing testuser and
wait for its user@UID.service to come up. After the first soft-reboot
(which keeps the same persistent rootfs), assert the service is active
again — this is the regression check. Disable lingering again before the
nextroot switch in the second boot so the lingering user doesn't leak
into the later boots' minimal overlay rootfs.

Verified locally in a qemu/KVM VM: passes with the fix present, and with
the fix reverted the second-boot assertion times out (the lingering user
is GC'd in logind startup and user@UID.service never comes back),
confirming the test exercises the bug.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 16:02:43 +01:00
Lennart Poettering f4c5fabbf3 ci: add a CI test for nvpcr priorization 2026-05-21 16:31:51 +02:00
Lennart Poettering 89c837a5f8 docs: document the .nvpcr file format superficially 2026-05-21 16:31:51 +02:00