Commit Graph
89205 Commits
Author SHA1 Message Date
Luca Boccassi 20615d2d47 core: add FileDescriptorStorePreserve=on-success option (#42160)
Currently with FileDescriptorStorePreserve=yes the FD store is kept
around
regardless of what happens to a unit, which is useful in many cases. But
in
some cases, for example when complex services crash horribly, it's hard
to
reason about what was in the intermediate state, and it's better to
start
fresh.

Add a new 'on-success' option for the FileDescriptorStorePreserve=
setting
that keeps it around only for as long as the unit doesn't go to a
persistently
failed state.

This is especially useful in combination with LUO, where we don't want
to
keep around LUO sessions created by units that then proceeded to crash
and
burn, and might be in a bad state afterwards.
2026-05-21 12:08:33 +01:00
Daan De Meyer 05a4f7755a test-btrfs: skip info test when GET_SUBVOL_INFO ioctl is unsupported
On 32-bit userspace running against a 64-bit kernel
BTRFS_IOC_GET_SUBVOL_INFO returns -ENOTTY: struct
btrfs_ioctl_get_subvol_info_args embeds four btrfs_ioctl_timespec
values, and that timespec struct (__u64 sec; __u32 nsec) packs to 12
bytes on i386 but 16 on x86_64 due to differing __u64 alignment.
sizeof(struct) is part of the ioctl cmd number via _IOR(), so the cmd
emitted by 32-bit userspace doesn't match the case label compiled by
the 64-bit kernel and the switch falls through to -ENOTTY.

btrfs already handles this exact class of bug for
BTRFS_IOC_SET_RECEIVED_SUBVOL via a btrfs_ioctl_timespec_32 struct
plus a _32 cmd alias in fs/btrfs/ioctl.c, but GET_SUBVOL_INFO (added
in 2018, four years after that fix) didn't get the same treatment.
Until a kernel patch lands the test can't exercise the ioctl on
32-bit, so convert TEST(info) to TEST_RET(info) and return
EXIT_TEST_SKIP with a clear message when -ENOTTY comes back. The
other tests in the file use ioctls that already have working compat
paths and remain unaffected.
2026-05-21 12:06:21 +01:00
Luca Boccassi d46dae085f network: several fixlets for NDisc (#42218)
Unfortunately, previously the path to test-ndisc-send has been wrong, so
some test cases have not been checked in our mkosi CIs. And two test
cases have been broken.

The test case `test_ndisc_redirect` was not updated when the logic in
networkd was changed by 9142bd5a8e. The
change itself should be OK. So, the test case is updated.

The test case `test_ndisc_mtu` was broken when the commit
32417c1723 is merged. The commit is not
correct, as we cannot set IPv6 MTU larger than interface MTU. So, the
offending commit is reverted.
2026-05-21 12:05:34 +01:00
Daan De Meyer a080cb356c core: better errors and more fields for io.systemd.Unit.StartTransient (#42161)
core: add User,Group,SupplementaryGroups,Nice to varlink
 Unit.StartTransient

This commit adds more writable fields to the
io.systemd.Unit.StartTransient
varlink method. With this its possible to set:
User,Group,SupplementaryGroups,Nice values.

Plus tests for them.

---

core: report unsupported service fields in varlink calls

Just like for the unsupported/bad exec_fields we should show
a message about what field is bad for service parameters. This
commit adds it using the same pattern. The JSON parser works in
fail-fast mode so we only display the first bad field (and
it depends on the parser what it finds first).
2026-05-21 13:03:29 +02:00
Daan De Meyer 56bc502f6f math-util: round to declared FP precision consistently across architectures
Add -fexcess-precision=standard so gcc inserts ISO C99 conformant
rounding at assignments, casts, and returns — without it, double values
on x87 happily stay at 80-bit extended precision across operations and
diverge from the SSE/x86_64 behavior, making strict equality comparisons
architecture-dependent.

The flag doesn't fully cover x87: per gcc PR#323
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323), a function return
value carried in ST(0) can arrive at the caller still at 80-bit, so a
double that ought to compare equal to a same-magnitude literal picks up
extra mantissa bits and doesn't. Wrap fp_equal in volatile-double
temporaries to force a memory roundtrip — the only operation that
reliably truncates on x87 — so its callers get consistent results
regardless of how the operands were produced.

Add a TEST(fp_equal) case that exercises the previously-broken pattern:
a runtime 1.0/10.0 computed inside a noinline helper, returned across
the function ABI boundary, then compared against the literal 0.1.
Without the volatile truncation this assertion fails on 32-bit gcc.
2026-05-21 11:53:32 +01:00
Lennart Poettering 9c2d331f5b docs: extend credentials docs with notes about imds 2026-05-21 10:51:59 +01:00
Luca Boccassi 67dea1409b core: add FileDescriptorStorePreserve=on-success option
Currently with FileDescriptorStorePreserve=yes the FD store is kept around
regardless of what happens to a unit, which is useful in many cases. But in
some cases, for example when complex services crash horribly, it's hard to
reason about what was in the intermediate state, and it's better to start
fresh.

Add a new 'on-success' option for the FileDescriptorStorePreserve= setting
that keeps it around only for as long as the unit doesn't go to a persistently
failed state.

This is especially useful in combination with LUO, where we don't want to
keep around LUO sessions created by units that then proceeded to crash and
burn, and might be in a bad state afterwards.
2026-05-21 10:14:08 +01:00
Luca Boccassi 00276b963c test: avoid test-fdstore failing units when exiting
This is used as payload, so ensure the wrapping unit/container
doesn't register a failure when this exits

Follow-up for 9de91f0f4c
2026-05-21 10:13:17 +01:00
Sebastian Bernardt 34db7a21a6 cleanup: VLAN Id -> VLAN ID
"VLAN ID" is used throughout the documentation and codebase, but appears
(when present) in `networkctl status` tables as `VLan Id`.
2026-05-21 17:42:29 +09:00
Aritra Basu dadc77c5fb network: restart DHCPv6, NDisc, and RADV when tracked IPv6LL is dropped
When the tracked IPv6 link-local address is removed, networkd clears
link->ipv6ll_address, but keeps DHCPv6, NDisc, and RADV running. These
engines keep using a stale source identity which affects the following:
- DHCPv6 client continues to send Solicit/Renew/Rebind from a nonexistent
  source address.
- NDisc continues to send Router Solicitations from a nonexistent source
  address. Router Advertisements cannot be received properly.
- RADV continues to advertise with a stale source address. This can lead
  to downstream hosts configuring invalid routes.
- DHCP-PD prefixes remain configured without a valid upstream DHCPv6 path.

Added link_ipv6ll_lost() to stop IPv6 dynamic engines and related states:
- sd_dhcp6_client_stop()
- ndisc_stop() + ndisc_flush()
- sd_radv_stop()

This is called from address_drop() when the dropped address matches the
tracked IPv6LL. After clearing the tracked address, it scans for another
ready link-local address on the interface. If found, this is set as
link->ipv6ll_address and link_ipv6ll_gained() is called to restart the
engines with the new source identity.

This resolves the FIXME in address_drop().

Signed-off-by: Aritra Basu <aritrbas+gh@cisco.com>
2026-05-21 17:39:30 +09:00
Rocker Zhang 9f25feb4ed logind: keep lingering users at startup-time GC
manager_startup() runs manager_gc(m, /* drop_not_started= */ false)
before the user_start() loop. user_may_gc()'s linger guard requires
user_unit_active() to be true to keep a user, but at this point the
per-user units have not been started yet, so for any lingering user
that ended up in the user_gc_queue the guard falls through and
manager_gc frees the User struct before user_start() ever runs.

This only manifests after `systemctl soft-reboot`, because /run is
tmpfs and survives soft-reboot: /run/systemd/users/UID files persist,
and manager_enumerate_users() in src/login/logind.c explicitly calls
user_add_to_gc_queue() for every UID it loads from there. Cold boot is
unaffected because /run is empty, so the linger users that come in via
manager_enumerate_linger_users() never enter the GC queue at all and
reach user_start() directly.

Special-case the startup-time GC: if a linger file exists, keep the
user regardless of unit state — user_start() is about to run and will
queue the appropriate jobs. Steady-state GC (drop_not_started=true, in
the event loop) still requires user_unit_active() so we don't hold on
to records for lingering users whose units genuinely died.

Fixes: https://github.com/systemd/systemd/issues/41789

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 08:53:07 +01:00
Paul Meyer ebd70a53d4 vmspawn: add shell completion for --coco
Fixes 4f8215add2.

Signed-off-by: Paul Meyer <katexochen0@gmail.com>
2026-05-21 08:44:53 +01:00
Daan De Meyer 74d392ed1b tree-wide: standardize header names across src/fundamental, src/basic and src/shared
Drop the -fundamental suffix from src/fundamental/ headers in favor of names
that match their src/basic/ or src/shared/ counterparts (e.g.
macro-fundamental.h -> macro.h, assert-fundamental.h -> assert-util.h,
cleanup-fundamental.h -> cleanup-util.h). Rename src/basic/{btrfs,label}.{c,h}
to use the -util suffix to match the existing shared/btrfs-util and
shared/label-util siblings. Rename src/shared/mkdir-label.{c,h} to mkdir.{c,h}
and src/shared/tmpfile-util-label.{c,h} to tmpfile-util.{c,h} to match the
corresponding src/basic names.

This saves us from having to come up with separate names for files that do
the same thing across tiers, and it makes it easier to move stuff between
src/fundamental, src/basic and src/shared: consumers just #include "foo.h"
and pick up whichever tier their -I path resolves to first, so call sites
don't need to be updated when an API moves between layers.

Where a higher-tier wrapper exists (e.g. src/basic/macro.h wrapping
src/fundamental/macro.h), the wrapper uses an explicit "../fundamental/foo.h"
or "../basic/foo.h" relative include for the lower-tier header. We can't use
GCC's #include_next directive for this — when the wrapper is reachable both
via same-dir-as-source lookup and via -I (e.g. -Isrc/shared) for the
directory it lives in, #include_next advances by exactly one slot in libcpp's
internal directory chain and lands on the same physical directory it was
already in, never reaching the lower-tier sibling (see make_cpp_dir() in
gcc/libcpp/files.cc:1986).

To make sure the right headers are always picked up, the include directories
are reordered so that e.g. src/shared always takes priority over src/basic and
similar for the other directories.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 10:33:03 +09:00
Yu Watanabe 7e77105988 test-network: follow-up for modem manager test and add test case for networkctl dhcp-lease (#42203) 2026-05-21 09:10:30 +09:00
Lennart Poettering 85d47bfa92 firstboot: make clear where the full screen console wizards end
The three first boot screens are visually separated from the console
output before them via the "chome" and welcome strings and sufficient
whitespace. But so far they weren't from the output after them. This is
sometimes a big confusing. Let's add a bit of a separator between the
end and what comes next, too.

Just cosmetics, nothing else.
2026-05-21 09:09:38 +09:00
Yu Watanabe 6cb65dacd1 vmspawn: rearrange --help and man page a bit (#42200)
This does not change man page or --help contents at all, but it does
introduce new sections, and moves some knobs between sections. It also
reorders things in the man page so that man page and --help show items
in the same order again.
2026-05-21 09:07:34 +09:00
Lennart Poettering 20ab4a8b15 report: use new --help formatting calls 2026-05-21 09:05:26 +09:00
Yu Watanabe dece52443c test-network: fix path to test-ndisc-send
Follow-up for 9dcdf16b25.

Previously, test cases that use test-ndisc-send executable did not
tested in our mkosi CIs...
2026-05-21 07:53:18 +09:00
Yu Watanabe 2e1cf55dba Revert "network: fix max MTU check for IPv6 MTU adjustments"
This reverts commit 32417c1723.

IPv6 MTU cannot be larger than the current interface MTU.
The previous behavior is correct.
2026-05-21 07:53:12 +09:00
Yu Watanabe d9b7fdf06a test-network: fix test case for Neighbor Announcement message handling
After 9142bd5a8e, when NA without router
flag is received, the corresponding redirect route and the default route
is removed, but the other routes are kept.

The corresponding test case was not updated by the commit, and the test
case has been unfortunately skipped...

This fixes the test case, and added more checks.
2026-05-21 07:53:12 +09:00
Yu Watanabe 0080566c92 test-network: add test cases for 'networkctl dhcp-lease' command
Addresses the request:
https://github.com/systemd/systemd/pull/42137#pullrequestreview-4305664376
2026-05-21 07:51:16 +09:00
Yu Watanabe 18f2e9bcfa test-network: try to stop test-modem-manager-mock.service only when necessary
Otherwise, all test cases that does not create/start the service emits
the following error:
```
Failed to stop test-modem-manager-mock.service: Unit test-modem-manager-mock.service not loaded.
```

Moreover, without this change, extra 'systemctl daemon-reload' is triggered after
all test cases. That's super heavy, especially when the test is running on
sanitizers.

Follow-up for abe3d570f8.
2026-05-21 07:10:50 +09:00
Yu Watanabe ba13cd1245 include: update kernel headers from v7.1-rc4
It seems there is no notable changes to us.
2026-05-21 07:07:37 +09:00
Yu Watanabe 52421acf17 test-network: use networkctl_status() helper function at one more place 2026-05-21 07:06:32 +09:00
Yu Watanabe 8e7665f87f Bump minimum required version of musl to 1.2.6 (#42208)
musl v1.2.6 has been released on 2026-03-20, and alpine-edge already has it:
https://pkgs.alpinelinux.org/package/edge/main/x86_64/musl
2026-05-21 07:04:12 +09:00
Luca Boccassi 8b675d315b mkosi: update debian commit reference to 3e1930512d1efee7e11b619a5f493b3229594a51
* 3e1930512d Downgrade dependency on dbus to recommends in sd-container
* 61d6ecf0a0 Conflict with sysuser-helper
* fbc4646437 autopkgtest: add dependency on procps
2026-05-20 22:46:56 +01:00
Lennart Poettering 95fe2d07ed man: order --secure-boot= to the same location in man page as in --help for vmspawn 2026-05-20 23:40:22 +02:00
Lennart Poettering b12a365866 vmspawn: move --kernel=/--initrd= under the "Execution" section
This has little to do with host configuration (where it was so far), and
a lot with what being executed, let's move it over.

Note that --help and man page so far differed here quite a bit: the
former had the "Execution" section, the latter didn't. This creates it
in the man page, to bring the two back in sync.
2026-05-20 23:39:47 +02:00
Lennart Poettering 183ec272ef vmspawn: split out networking related options into its own "Networking" section in --help 2026-05-20 23:38:30 +02:00
Lennart Poettering f9a40f7aa3 vmspawn: split 'Integration' section into 'Logging' and 'SSH'
Each of the two has multiple options, hence let's split them out.
2026-05-20 23:37:32 +02:00
Lennart Poettering 1a0b17df32 vmspawn: move image related knobs close to --image=
(Also, arrange the order if the image options group in the man page to
the same as in the --help text)
2026-05-20 23:37:31 +02:00
Yu Watanabe 6a35ae68cb NEWS: mention bump of musl requirement 2026-05-21 05:06:35 +09:00
Yu Watanabe 12b9760800 musl: drop several statx definitions
Those dropped definitions have been provided since musl v1.2.6.
2026-05-21 05:06:35 +09:00
Yu Watanabe bc40f6cc32 musl: drop renameat2() wrapper
musl provides renameat2() since v1.2.6:
https://git.musl-libc.org/cgit/musl/commit/?id=05ce67fea99ca09cd4b6625cff7aec9cc222dd5a
2026-05-21 05:06:35 +09:00
Yu Watanabe f405aa53c3 README: bump required minimum version of musl to 1.2.6
musl v1.2.6 has been released on 2026-03-20:
https://git.musl-libc.org/cgit/musl/commit/?id=9fa28ece75d8a2191de7c5bb53bed224c5947417

alpine/postmarketos already have musl v1.2.6 in the edge repository:
https://pkgs.alpinelinux.org/package/edge/main/x86_64/musl

Also, Yocto Project 6.0 (wrynose) already has v1.2.6.

Let's bump the requirement now.
2026-05-21 05:06:35 +09:00
Philip Withnall 8c0f9073c7 updatectl: Add a --no-ask-password argument
While commit 83c1e8ff5f added support for interactive polkit
authentication in `updatectl`, some users might want to disable that for
some use cases; so add the standard `--no-ask-password` argument.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Helps: https://github.com/systemd/systemd/issues/37412
2026-05-21 04:24:55 +09:00
Yu Watanabe bcbae0c132 Couple of rearragements for src/core/meson.build (#42207)
Net result is `import-creds.c` moving from libcore to systemd
2026-05-21 04:18:14 +09:00
Daan De Meyer 393b908669 ci: run the musl build & test under mkosi with a postmarketOS tools tree (#42171) 2026-05-20 21:03:14 +02:00
Yu Watanabe 5904cee941 include: move several missing definitions to musl
Those moved ones have been defined in glibc <= 2.34, and only
necessary when built with musl.

Follow-up for c8c1bcf194.
2026-05-21 03:51:26 +09:00
Yu Watanabe b17723e66b firstboot: auto-fill keymap/locale questions with data from firmware, if available (#42177)
Let's make the installer experience a tiny bit nicer, and prefill
everything with the data the firmware gives us.
2026-05-21 03:50:43 +09:00
Yu Watanabe 594f2314b2 dns-packet: bail out early if the packet is too short (#42189)
This should address the nit from Claude in
https://github.com/systemd/systemd/pull/42178#pullrequestreview-4320763076.
2026-05-21 03:43:18 +09:00
Daan De Meyer c7113f6b3c ci: run the musl build & test under mkosi with a postmarketOS tools tree
Drop the standalone Unit-tests (musl) workflow that ran on an Alpine sandbox
spun up by jirutka/setup-alpine, and merge it into unit-tests.yml as a new
build-musl job that provisions a postmarketOS tools tree via mkosi and runs
the meson build + test suite through 'mkosi box'. postmarketOS is musl-native,
so the musl-gcc / -idirafter /usr/include wrappers the Fedora tools tree
needed are gone; the linter.yml's own musl build step also goes away since
the unit-tests workflow now covers it (and tests it).

postmarketOS doesn't ship a downstream systemd packaging spec, so the new
tools tree config in mkosi.tools.conf/mkosi.conf.d/postmarketos.conf does not
set PrepareScripts and lists build deps manually. mkosi.sync now early-exits
when PKG_SUBDIR is unset so the missing pkgenv entry doesn't trip set -u.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 17:22:35 +00:00
Daan De Meyer 65f076f4b0 test-path: Skip test when we can't create a cgroup
Instead of having CI runner specific checks, let's just
skip the test if we get EXIT_CGROUP which is what we get
when we can't create a cgroup. This makes the check work
independently of CI runner, and specifically also on github
actions.
2026-05-20 17:22:35 +00:00
Luca Boccassi e13e69de7c meson: move one source file from libcore to systemd array 2026-05-20 18:15:56 +01:00
Luca Boccassi fd16d4ac54 meson: reorder core sources alphabetically 2026-05-20 18:15:56 +01:00
Luca Boccassi 70b6dc7631 meson: reorder core sources array
To hint that sources should be added to the lowest common denominator
first
2026-05-20 18:15:56 +01:00
Daan De Meyer fc7a32df38 test-path: Migrate to test framework and macros
- Also clean up the logging in check_states() to
  only log on state changes so it's less noisy.
2026-05-20 16:04:26 +00:00
Daan De Meyer eb69a3c59d test-path: Fail earlier on start-limit-hit 2026-05-20 16:04:26 +00:00
Daan De Meyer fde1cccf31 meson: Skip coccinelle suite by default
It's not fully passing yet so disable it by default until it is.
clang-tidy follows the same model.
2026-05-20 16:04:26 +00:00
Daan De Meyer b01dcb3a81 test-ukify: Skip kernel images we can't access 2026-05-20 16:04:26 +00:00