Commit Graph
263 Commits
Author SHA1 Message Date
Daan De Meyer a8211e88c7 gpt-auto-generator: Pass verity settings to dissect_loop_device()
The image policy might be configured to enforce verity protection on the
root or usr partitions. Currently, we get around that by ignoring the root
and usr partitions, given that by the time this code runs in the rootfs these
will have already been mounted.

However, we can't actually ignore the root partition, as we will enable
growfs and/or remounting the root partition rw based on the root partition
we find in the image.

Instead, let's just read any roothash= or usrhash= from the kernel command line
and pass in a populated verity settings struct into dissect_loop_device()
instead of NULL. If NULL is passed, any verity partitions in the image are
ignored. If we pass the default verity settings, the wrong verity partitions might
potentially be picked up, so we make sure to pass a fully populated instance. This
should be sufficient to satisfy any configured image policy verity protection checks.

Reverts 6d6538fb3f

Fixes #38788
2025-09-05 07:48:15 +02:00
Jelle van der Waa 1cce9d930a treewide: correct argument comment to 'ret' where applicable
For functions with one return argument prefer 'ret' as argument comment.
2025-06-04 13:32:24 +02:00
Daan De Meyer 86b9a3e31d tree-wide: Clean up includes
This removes more unused includes from the components already cleaned
up in #37467 and #37457.

Split out of #37344.
2025-05-21 10:49:42 +02:00
Daan De Meyer 8857aa74e5 tree-wide: Clean up includes
This commit cleans up the includes for all the small tools across
the tree.

A few cases of returning EXIT_SUCCESS are replaced with returning
0 to avoid including <stdlib.h>.

Split out of #37344.
2025-05-14 22:34:02 +02:00
Mike Yuan 7369c037e2 fstab/gpt-auto: hook up validatefs to /sysroot/usr/ rather than /sysusr/usr/
We carry a special logic for /usr/ in initrd that it initially gets
mounted to /sysusr/usr/ and later bind mounted to /sysroot/usr/.
When hooking up validatefs it is hence necessary to wait for
the bind mount and validate that, rather than the /sysusr/usr/
established as intermediate transport.

Alternative to #37102
2025-04-12 16:33:22 +02:00
Mike Yuan 39642b0130 gpt-auto: do not add /sysusr/usr/ -> /sysroot/usr/ after switch-root
Follow-up for 7852e301e0
2025-04-12 16:33:22 +02:00
Antonio Alvarez Feijoo cec81b234c gpt-auto-generator: fix memory leak
Follow-up for 74cfd0921c
2025-04-04 20:02:02 +09:00
Lennart Poettering e5d2701bc2 gpt-auto-generator: write fsck override unit to "middle" generator dir
We generally let gpt-auto-generator write to the "late" generator dir,
so that the explicit fstab-generator can write to the "middle" one. And
I think we should leave it that way. But we also want to override the
generic systemd-fsck-root.service service potentially, and if we'd do
that in the "late" generator dir, it would be pointless, since that's
ordered *after* the static version hence would never be taken into
consdiration.

Hence clean this up: keep writing to the late dir for everything,
except for the fsck stuff.
2025-04-03 11:08:57 +02:00
Lennart Poettering 74cfd0921c gpt-auto-generator: parse systemd.image_filter= from kernel cmdline 2025-04-03 11:08:57 +02:00
Lennart Poettering f1395724f6 dissect-image: add a concept for "filtering" partitions we dissect
DDIs may contain multiple versions of the same OS, or even multiple
OSes. Hence it makes sense to not just pick the "newest", whatever that
might be, but only partitions associated with specific images, or in a
specific version.

Let's a concept for such filtering: a per-designator glob expression
that can be applied to the partition label string, and can be used for
such filtering.

Usecase: when picking UKI belonging to OS image X in version Y, make
sure we only pick a /usr/ partition belonging to X in version Y, and a
root and home partition belonging to X in any version.

This only adds the basic infrastructure, but doesn't actually expose it
anywhere.
2025-04-03 11:08:57 +02:00
Lennart Poettering 0a64b7ba6e gpt-auto-generator: add support for setting up verity partitions automatically
So far the gpt-auto-generator would only cover unprotected and encrypted
partitions. Teach it handling of verity too.
2025-04-03 11:08:57 +02:00
Lennart Poettering 7852e301e0 gpt-auto-generator: add support for mount.usr=dissect
So far, we did not support auto-discovery the /usr/ partition at boot.
Change that: on explicit request (i.e. mount.usr=dissect) automatically
discover the /usr/ partition based on our usual dissection logic.
2025-04-03 11:08:57 +02:00
Lennart Poettering 198f7badaa gpt-auto-generator: optionally, set up root fs via dissection logic
This introduces root=dissect, which is a lot like root=gpt-auto, but
uses the image dissection logic to find the root partition. It's also
based on the GPT efi var telling us about the root disk, but instead of
just picking some suitable root disk manually it uses the dissection
logic.

This is a big step forward, since it means we can actually make
use of the image policy logic for the root fs too.
2025-04-03 11:08:57 +02:00
Lennart Poettering bed3ff8ebc generator: also suppress fsck early if we are adding a bind mount
There's no point in "fscking a bind mount". Let's not do it hence.
2025-04-03 10:22:46 +02:00
Lennart Poettering f872373a26 generators: hook in validatefs on gpt-auto and fstab generator mounts
Let's turn on validatefs automatically for all auto-discovered
partitions.

Let's add an x-systemd.validatefs option to optionally turn this on for
fstab listed file systems.
2025-03-31 15:14:28 +02:00
Zbigniew Jędrzejewski-Szmek bcc1eebd8f gpt-auto-generator: improve log message
We said "exiting", but then the program continues to do other operations
and log additional messages.
2025-03-27 12:04:47 +01:00
Lennart Poettering 6d6538fb3f gpt-auto-generator: do not apply image policy on the root fs and /usr/ fs
At the moment the gpt-auto generator does its things we already
transitioned into the host OS, i.e. the root fs and /usr/ are mounted.
Hence suppress image policy checks for those two partitions.

This actually matters, because the root hash/usr hash is taken into
consideration for the image policy checks, but we don't have that in
gpt-auto and hence would refuse operation claiming policy conflicts
event though we never actually operate on the root fs via the dissection
logic.
2025-03-06 09:42:18 +01:00
Lennart Poettering 87bffa1eae gpt-auto-generator: move around in_initrd() tests
The partition enumeration only runs on the main system, and we test that
early, hence no point in repeating this in functions further down the
call chain. But let's keep it in place as assert()s, just in case.

Also, move the top-level in_initrd() into add_mounts(), so that the
tests are nicely encapsulated in the code they protect.
2025-03-06 09:42:15 +01:00
Lennart Poettering 14ab9aafc2 gpt-auto: add common parse_gpt_auto_root() parser 2025-03-05 12:38:33 +01:00
Lennart Poettering 1c0b8270f4 gpt-auto-generator: if root=gpt-auto-force is specified ignore factory reset state 2025-03-05 12:38:28 +01:00
Lennart Poettering 1a95fc870a gpt-auto-generator: if root=gpt-auto is specified on kernel cmdline, always wait for /dev/gpt-auto-root symlink
So far our login in gpt-auto-generator when run in the initrd has been
to generate the units that wait for /dev/gpt-auto-root to show up and
mount them only if we have the loader partition EFI variables set. This
is of course not the case for network boots with a UKI kernel, which
means auto-gpt would not work for mounting the rootfs.

What's nasty is that we don't know for sure whether the "rootdisk"
loopback device will shown up eventually, as it needs explicit
configuration by the user via the kernel cmdline, or could be configured
entirely indepdenently. Hence, let's tweak the logic when we wat for
/dev/gpt-auto-root as device to mount: make the gpt auto root logic a
tristate: if root=gpt-auto is specified on the cmdline *definitely*
enable the logic. If root= is specified and set to anyting else,
*definitely* disable the logic. And if root= is not specified check for
the EFI partition vars – as before – to conditionalized things.

Or in other words, you can now boot the same image either via ESP/local
boot or via netboot with a kernelcmdline image like this:

    rd.systemd.pull=verify=no,machine,blockdev,bootorigin,raw:rootdisk:image.raw root=gpt-auto rootflags=x-systemd.device-timeout=infinity ip=any
2025-02-21 10:04:15 +01:00
Mike Yuan f4a65d5f2d gpt-auto: take timeout opts in rootflags= into account
We document that rootflags= is honored for gpt-auto,
but only fstab-generator actually carried the logic for
x-systemd.device-timeout= and .mount-timeout=.
Apply that to gpt-auto too.
2024-12-09 19:59:29 +01:00
Mike Yuan 756b6749a2 gpt-auto: define loader partition timeout as macro 2024-12-09 19:25:59 +01:00
Michael Ferrari 28dbee46d5 gpt-auto: remove directory check for ESP mount
Ensure that we always attempt to mount the `ESP` partition to `/boot`
when there is no `XBOOTLDR` partition.

Fixes an issue when booting without a `XBOOTLDR` partition and an empty
root partition, since it would mount the `ESP` partition to `/efi/`
unconditionally causing boot entries to not be under `/boot/` as
recommended by the Boot Loader Specification.
2024-10-16 10:09:38 +09:00
Mike Yuan 1cfe9737cf gpt-auto: use RET_GATHER at one more place 2024-10-15 01:18:26 +02:00
Yu Watanabe 4e494e6aac tree-wise: several cleanups for logging
- drop unnecessary SYNTHETIC_ERRNO() when the logger does not propagate
  error code,
- drop unnecessary '%m' in error message when the error code is
  specified with SYNTHETIC_ERRNO(),
- add missing full stop at the end of log message,
- use RET_GATHER(),
- add missing ", ignoring.",
- upeercase the first letter, etc., etc...
2024-05-01 04:41:06 +09:00
Mike Yuan 622f2dcc71 gpt-auto: ignore fstab_has_node failure
After 8a1326581d,
we always check whether there're mounts under
/boot/ or /efi/ first. Let's relax the check
for fstab_has_node hence, since on initrd-less
systems it might produce wrong results.
2024-03-11 15:34:05 +08:00
Antonio Alvarez Feijoo d0a0059c21 gpt-auto-generator: fix argument passed to parse_image_policy_argument
Otherwise:

```
Feb 19 16:35:34 localhost systemd-gpt-auto-generator[188]: Assertion 's' failed at src/shared/image-policy.c:656, function parse_image_policy_argument(). Aborting.
```

Fixes 06e78680e3
2024-02-19 19:24:25 +00:00
Mike Yuan 4d0b06d535 Merge pull request #31181 from fbuihuu/gpt-auto-more-defensive
gpt-auto-generator: be more defensive when checking the presence of E…
2024-02-12 19:12:17 +08:00
Franck Bui 8a1326581d gpt-auto-generator: be more defensive when checking the presence of ESP in fstab
Looking for the ESP node is useful to shortcut things but if we're told that
the node is not referenced in fstab that doesn't necessarily mean that ESP is
not mounted via fstab. Indeed the check is not reliable in all cases. Firstly
because it assumes that udev already set the symlinks up. This is not the case
for initrd-less boots. Secondly the devname of the ESP partition can be wrongly
constructed by the dissect code. For example, the approach which consists in
appending "p<partnum>" suffix to construct the partition devname from the disk
devname doesn't work for DM devices.

Hence this patch makes the logic more defensive and do not mount neither ESP
nor XBOOTLDR automatically if any path in paths that starts with /efi or /boot
exists.
2024-02-12 09:30:35 +01:00
Mike Yuan b409aacb0a mountpoint-util: introduce path_is_mount_point_full 2024-02-06 15:09:28 +08:00
Lennart Poettering 0d5f59a248 gpt-auto-generator: enable TPM2 unlocking in gpt-auto-generator
If we detect a TPM, let's also unlock the disk with it, if it has an
enrollment for that.

Fixes: #30176
2023-11-28 15:36:20 +00:00
Lennart Poettering 6b5fe5d75e gpt-auto-generator: hook in "growfs" for the root fs if the GPT flag 59 says so
Fixes: #29791
2023-11-15 13:21:15 +01:00
Lennart Poettering 40b1224ea7 gpt-auto-generator: don't eat up errors of generator_enable_remount_fs_service()
I cannot see a reason why we should ignore this error, so let's not. We
use RET_GATHER() on the returns anyway, i.e. collect errors but
continue, so it makes sense to collect this one too.
2023-11-15 13:21:10 +01:00
Lennart Poettering ca8ac0f9b5 gpt-auto-generator: add comment + assert() explaining mode of invocation
We are not invoked in the initrd, and that deserves a comment.
2023-11-15 13:21:06 +01:00
Lennart Poettering 5253b4a99f gpt-auto-generator: drop in_initrd() check in add_partition_root_rw()
This call is never called in the initrd, hence we can drop the extra
check, as it is redundant. Let's keep it as an assert() though, as a
form of code-enforced documentation.
2023-11-15 13:20:53 +01:00
Lennart Poettering be8f478c0f efi-loader: rename efi_stub_measured() → efi_measured_uki()
Let's say "uki" rather than "stub", since that is just too generic, and
we shouldn't limit us to our own stub anyway, but generally define a
concept of a "measured UKI", which is a UKI that measures its part to
PCR 11.

This is mostly preparation for exposing this check to the user via
ConditionSecurity=.
2023-09-27 11:51:13 +02:00
Mike Yuan 121ce4a687 generators: use generator_open_unit_file where appropriate 2023-08-19 01:15:01 +01:00
Yu Watanabe a8d3315ba4 tree-wise: drop unnecessary use of proc_cmdline_key_streq()
If the key does not contain '-' or '_', then it is not necessary to use
proc_cmdline_key_streq(), and streq() is sufficient.

This also adds missing assertions about 'key' argument.
2023-08-09 03:16:31 +09:00
Yu Watanabe ec57a4ea49 meson: move declarations of dissect and friends 2023-08-01 02:31:36 +09:00
Zbigniew Jędrzejewski-Szmek 7f4b3dc043 gpt-auto-generator: fix warnings about unused func when !ENABLE_EFI 2023-07-31 14:04:55 +02:00
Mike Yuan 7893a547eb gpt-auto: don't mount ESP if there's an fstab entry for it
Follow-up for #28511

Fixes #28550
2023-07-29 20:06:41 +08:00
Daan De Meyer 7ccb171c4c Merge pull request #28359 from keszybz/ret-gather
Add RET_GATHER macro to make continue-but-remember-first-error functions easier
2023-07-28 14:28:35 +02:00
Mike Yuan 69d7f35ce4 gpt-auto: skip mounting ESP if fstab for /boot/ uses the same device as discovered one
Follow-up for 6a488fa7cc

Currently, if an fstab entry for /boot/ exists, we'll skip to try /efi/
instead. However, if it's already using the same device as the discovered
one, we should not duplicate the mount.
2023-07-26 15:00:06 +08:00
Zbigniew Jędrzejewski-Szmek fa989c74a6 gpt-auto-generator: use RET_GATHER, return first error 2023-07-13 11:40:15 +02:00
Mike Yuan 68f8a86a46 gpt-auto: expand the loader partition UUID check to include XBOOTLDR
Before this commit, we only accept the case when LoaderDevicePartUUID
points to the ESP, while XBOOTLDR is mounted unconditionally.

After this commit, we check if LoaderDevicePartUUID points to either
ESP or XBOOTLDR. If it does, mount both, else nothing gets mounted.
2023-06-20 11:15:48 +02:00
Lennart Poettering a9b837aa34 generators: change TimeoutSec=0 to TimeoutSec=infinity
With these settings we intend to turn off timeouts for possibly
interactive/slow commands. The officially documented way to turn off the
time-outs is to setting them to infinity. So far we set them to zero
here though.

This lead to some confusiong, for example #18224. Let's fix this by
uniformly spelling out TimeoutSec=infinity.

This doesn't change behaviour. It just makes our generated files match
what we document, without relying on historic compat support.

Fixes: #18224
2023-06-06 12:38:16 +01:00
Zbigniew Jędrzejewski-Szmek 6a488fa7cc gpt-auto-generator: rework/simplify logic for picking /efi or /boot
I started looking into https://github.com/uapi-group/specifications/issues/35.

BLS says:
> Otherwise [no existing XBOOTLDR partition], if on GPT and an ESP is found and
> it is large enough (let’s say at least 1G) it should be used as $BOOT and
> used as primary location to place boot loader menu resources in.

> It is recommended to mount $BOOT to /boot/, and the ESP to /efi/.

DPS says:
> The ESP used for the current boot is automatically mounted to /efi/ (or
> /boot/ as fallback), unless a different partition is mounted there (possibly
> via /etc/fstab, or because the Extended Boot Loader Partition — see below —
> exists) or the directory is non-empty on the root disk.

I don't think we want to mount the same partition in two places.
If the same partition is not mounted in two places, then the two specs are
contradictory.

The code in gpt-auto-generator implemented the logic from the DPS. It is
modified to implement the logic from BLS.

Effectively:
- if both /boot and /efi are available:
  - if both XBOOTLDR and ESP exist:
    ESP on /efi, XBOOTLDR on /boot
  - if only ESP exists:
    ESP on /boot
  - if only XBOOTLDR exists:
    XBOOTLDR on /boot
- if only /boot is available:
  - if XBOOTLDR exists:
    XBOOTLDR on /boot
  - if only ESP exists:
    ESP on /boot
- if only /efi is available:
  - if ESP exists:
    ESP on /efi

"Available" means that it the mount point is not mounted over and does not
contain files. If the directory doesn't exist, it is also "available" and will
be created later when the mount or automount unit is started.

Thus, the generator attempts to match the partitions and mount points to the
extent possible. In all cases, /boot is the primary place to install kernels.
ESP can be found on /boot or /efi, depending on the situation.

If this patch is merged, I'll submit fixes for BLS and DPS to describe the
same logic.
2023-05-29 22:53:08 +02:00
David Tardon 9a2982b687 gpt-auto-generator: also honor systemd.swap=no 2023-05-25 19:30:32 +02:00
Zbigniew Jędrzejewski-Szmek 4953e39c70 gpt-auto-generator: "translate" errno codes into proper messages
E.g. in logs on jammy-ppc64el in https://github.com/systemd/systemd/pull/27294:
Apr 16 17:42:50 H systemd-gpt-auto-generator[300]: Failed to dissect partition table of block device /dev/sda: No message of desired type
Apr 16 17:42:50 H (sd-execu[295]: /usr/lib/systemd/system-generators/systemd-gpt-auto-generator failed with exit status 1.

ee0e6e476e made this particular condition not an
error. But for other errnos we want to print a better message too.
dissect_loop_device_and_warn() already does this, but it always prints the
error at error level. We want to suppress some of the errors, so let's make the
print helper public and do the error suppression in the caller.
2023-04-18 11:58:33 +02:00