From 00c17ad5cfe395df6a07b352ebd03b9e352be8c4 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 11 Mar 2025 11:14:15 +0100 Subject: [PATCH 1/3] mountfsd: complete varlink introspection comments --- .../varlink-io.systemd.MountFileSystem.c | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/shared/varlink-io.systemd.MountFileSystem.c b/src/shared/varlink-io.systemd.MountFileSystem.c index 423f275059..977552dd2d 100644 --- a/src/shared/varlink-io.systemd.MountFileSystem.c +++ b/src/shared/varlink-io.systemd.MountFileSystem.c @@ -21,32 +21,55 @@ static SD_VARLINK_DEFINE_ENUM_TYPE( static SD_VARLINK_DEFINE_STRUCT_TYPE( PartitionInfo, - SD_VARLINK_DEFINE_FIELD(designator, SD_VARLINK_STRING, 0), + SD_VARLINK_FIELD_COMMENT("The designator of this partition."), + SD_VARLINK_DEFINE_FIELD_BY_TYPE(designator, PartitionDesignator, 0), + SD_VARLINK_FIELD_COMMENT("Indicates whether this partition is marked for writable (non-read-only) operations."), SD_VARLINK_DEFINE_FIELD(writable, SD_VARLINK_BOOL, 0), + SD_VARLINK_FIELD_COMMENT("Indicates whether this partition is marked for automatic growing."), SD_VARLINK_DEFINE_FIELD(growFileSystem, SD_VARLINK_BOOL, 0), + SD_VARLINK_FIELD_COMMENT("Indicates the numeric partition number of this partition, or null if the image does not carry a partition table, and this object covers the whole block device."), SD_VARLINK_DEFINE_FIELD(partitionNumber, SD_VARLINK_INT, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Indicates the intended CPU architecture of the partition, in case the partition type encodes such information."), SD_VARLINK_DEFINE_FIELD(architecture, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("The partition UUID identifying the partition."), SD_VARLINK_DEFINE_FIELD(partitionUuid, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("The file system type for the mount"), SD_VARLINK_DEFINE_FIELD(fileSystemType, SD_VARLINK_STRING, 0), + SD_VARLINK_FIELD_COMMENT("The partition label string of this partition."), SD_VARLINK_DEFINE_FIELD(partitionLabel, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("The size of the partition in bytes."), SD_VARLINK_DEFINE_FIELD(size, SD_VARLINK_INT, 0), + SD_VARLINK_FIELD_COMMENT("The start offset of the partition in bytes."), SD_VARLINK_DEFINE_FIELD(offset, SD_VARLINK_INT, 0), + SD_VARLINK_FIELD_COMMENT("A mount file descriptor to assign to a location."), SD_VARLINK_DEFINE_FIELD(mountFileDescriptor, SD_VARLINK_INT, 0)); static SD_VARLINK_DEFINE_METHOD( MountImage, + SD_VARLINK_FIELD_COMMENT("File descriptor of the image file to mount and to assign to the user namespace. Must be a regular, i.e. non-O_PATH file descriptor."), SD_VARLINK_DEFINE_INPUT(imageFileDescriptor, SD_VARLINK_INT, 0), + SD_VARLINK_FIELD_COMMENT("File descriptor to the user namespace to assign this image to. If not specified uses the host user namespace."), SD_VARLINK_DEFINE_INPUT(userNamespaceFileDescriptor, SD_VARLINK_INT, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Mounts the image read-only."), SD_VARLINK_DEFINE_INPUT(readOnly, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Grows the contained file systems if necessary and indicated, before mounting them."), SD_VARLINK_DEFINE_INPUT(growFileSystems, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Takes a literal password in case of an encrypted image"), SD_VARLINK_DEFINE_INPUT(password, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Takes an image policy string (see systemd.image-policy(7) for details) to apply while mounting the image"), SD_VARLINK_DEFINE_INPUT(imagePolicy, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), VARLINK_DEFINE_POLKIT_INPUT, + SD_VARLINK_FIELD_COMMENT("An array with information about contained partitions that have been prepared for mounting, as well as their mount file descriptors."), SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(partitions, PartitionInfo, SD_VARLINK_ARRAY), + SD_VARLINK_FIELD_COMMENT("The used image policy."), SD_VARLINK_DEFINE_OUTPUT(imagePolicy, SD_VARLINK_STRING, 0), + SD_VARLINK_FIELD_COMMENT("The size of the image in bytes."), SD_VARLINK_DEFINE_OUTPUT(imageSize, SD_VARLINK_INT, 0), + SD_VARLINK_FIELD_COMMENT("The sector size of the image in bytes"), SD_VARLINK_DEFINE_OUTPUT(sectorSize, SD_VARLINK_INT, 0), + SD_VARLINK_FIELD_COMMENT("The name of the image"), SD_VARLINK_DEFINE_OUTPUT(imageName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("The UUID of the image"), SD_VARLINK_DEFINE_OUTPUT(imageUuid, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)); static SD_VARLINK_DEFINE_ENUM_TYPE( @@ -68,7 +91,7 @@ static SD_VARLINK_DEFINE_METHOD( SD_VARLINK_DEFINE_INPUT(userNamespaceFileDescriptor, SD_VARLINK_INT, SD_VARLINK_NULLABLE), SD_VARLINK_FIELD_COMMENT("Whether to mark the resulting mount file descriptor as read-only. If not specified defaults to false."), SD_VARLINK_DEFINE_INPUT(readOnly, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE), - SD_VARLINK_FIELD_COMMENT("Which kinda of UID/GID mapping to apply to the resulting mount file descriptor."), + SD_VARLINK_FIELD_COMMENT("Which kind of UID/GID mapping to apply to the resulting mount file descriptor."), SD_VARLINK_DEFINE_INPUT_BY_TYPE(mode, MountMapMode, SD_VARLINK_NULLABLE), VARLINK_DEFINE_POLKIT_INPUT, SD_VARLINK_FIELD_COMMENT("The freshly allocated mount file descriptor for the mount."), @@ -91,13 +114,19 @@ SD_VARLINK_DEFINE_INTERFACE( &vl_type_PartitionInfo, SD_VARLINK_SYMBOL_COMMENT("Selects the type of UID/GID mapping to apply."), &vl_type_MountMapMode, - SD_VARLINK_SYMBOL_COMMENT("Takes a disk image file descriptor as input, returns a set of mount file descriptors for it."), + SD_VARLINK_SYMBOL_COMMENT("Takes a disk image file descriptor as input, returns a set of mount file descriptors for it, plus meta information about the image and the partitions selected for mounting."), &vl_method_MountImage, SD_VARLINK_SYMBOL_COMMENT("Takes a directory file descriptor as input, returns a mount file descriptor."), &vl_method_MountDirectory, + SD_VARLINK_SYMBOL_COMMENT("Disk image is not compatible with this service."), &vl_error_IncompatibleImage, + SD_VARLINK_SYMBOL_COMMENT("Multiple suitable root partitions found."), &vl_error_MultipleRootPartitionsFound, + SD_VARLINK_SYMBOL_COMMENT("No suitable root partition found."), &vl_error_RootPartitionNotFound, + SD_VARLINK_SYMBOL_COMMENT("The specified image policy disallows mounting this disk image"), &vl_error_DeniedByImagePolicy, + SD_VARLINK_SYMBOL_COMMENT("The authentication key for this image is not available."), &vl_error_KeyNotFound, + SD_VARLINK_SYMBOL_COMMENT("Verity could not be set up."), &vl_error_VerityFailure); From 0ecfcc9790d8efced4372097aa49857b117a0d9f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 11 Mar 2025 11:43:17 +0100 Subject: [PATCH 2/3] mountfsd: also return suggested mount point paths for the returned partitions When mounting a disk image we return a bunch of mount fds referencing the various partitions in the disk, along with some metadata about them. One key metadata field is the "designator" which is supposed to tell clients what is what, and where to mount it. Let's make this more explicit: let's also include the literal relative path where each mount shall be placed, to simplify implementations of clients that do not care about the concept of designators. --- src/mountfsd/mountwork.c | 11 ++++++++++- src/shared/gpt.c | 2 +- src/shared/gpt.h | 2 ++ src/shared/varlink-io.systemd.MountFileSystem.c | 4 +++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/mountfsd/mountwork.c b/src/mountfsd/mountwork.c index ded0f3c4bc..eaf72893aa 100644 --- a/src/mountfsd/mountwork.c +++ b/src/mountfsd/mountwork.c @@ -510,6 +510,14 @@ static int vl_method_mount_image( TAKE_FD(pp->fsmount_fd); + const char *m = partition_mountpoint_to_string(d); + _cleanup_strv_free_ char **l = NULL; + if (!isempty(m)) { + l = strv_split_nulstr(m); + if (!l) + return log_oom_debug(); + } + r = sd_json_variant_append_arraybo( &aj, SD_JSON_BUILD_PAIR("designator", SD_JSON_BUILD_STRING(partition_designator_to_string(d))), @@ -522,7 +530,8 @@ static int vl_method_mount_image( SD_JSON_BUILD_PAIR_CONDITION(!!pp->label, "partitionLabel", SD_JSON_BUILD_STRING(pp->label)), SD_JSON_BUILD_PAIR("size", SD_JSON_BUILD_INTEGER(pp->size)), SD_JSON_BUILD_PAIR("offset", SD_JSON_BUILD_INTEGER(pp->offset)), - SD_JSON_BUILD_PAIR("mountFileDescriptor", SD_JSON_BUILD_INTEGER(fd_idx))); + SD_JSON_BUILD_PAIR("mountFileDescriptor", SD_JSON_BUILD_INTEGER(fd_idx)), + JSON_BUILD_PAIR_STRV_NON_EMPTY("mountPoint", l)); if (r < 0) return r; } diff --git a/src/shared/gpt.c b/src/shared/gpt.c index 9d7ffcecd9..a443cc5e99 100644 --- a/src/shared/gpt.c +++ b/src/shared/gpt.c @@ -115,7 +115,7 @@ static const char *const partition_mountpoint_table[_PARTITION_DESIGNATOR_MAX] = [PARTITION_VAR] = "/var\0", }; -DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(partition_mountpoint, PartitionDesignator); +DEFINE_STRING_TABLE_LOOKUP_TO_STRING(partition_mountpoint, PartitionDesignator); #define _GPT_ARCH_SEXTET(arch, name) \ { SD_GPT_ROOT_##arch, "root-" name, ARCHITECTURE_##arch, .designator = PARTITION_ROOT }, \ diff --git a/src/shared/gpt.h b/src/shared/gpt.h index e64ba8439d..7a67eddebe 100644 --- a/src/shared/gpt.h +++ b/src/shared/gpt.h @@ -41,6 +41,8 @@ PartitionDesignator partition_verity_sig_to_data(PartitionDesignator d); const char* partition_designator_to_string(PartitionDesignator d) _const_; PartitionDesignator partition_designator_from_string(const char *name) _pure_; +const char* partition_mountpoint_to_string(PartitionDesignator d) _const_; + const char* gpt_partition_type_uuid_to_string(sd_id128_t id); const char* gpt_partition_type_uuid_to_string_harder( sd_id128_t id, diff --git a/src/shared/varlink-io.systemd.MountFileSystem.c b/src/shared/varlink-io.systemd.MountFileSystem.c index 977552dd2d..54f500a7c5 100644 --- a/src/shared/varlink-io.systemd.MountFileSystem.c +++ b/src/shared/varlink-io.systemd.MountFileSystem.c @@ -42,7 +42,9 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE( SD_VARLINK_FIELD_COMMENT("The start offset of the partition in bytes."), SD_VARLINK_DEFINE_FIELD(offset, SD_VARLINK_INT, 0), SD_VARLINK_FIELD_COMMENT("A mount file descriptor to assign to a location."), - SD_VARLINK_DEFINE_FIELD(mountFileDescriptor, SD_VARLINK_INT, 0)); + SD_VARLINK_DEFINE_FIELD(mountFileDescriptor, SD_VARLINK_INT, 0), + SD_VARLINK_FIELD_COMMENT("A relative path indicating the intended mount point for this file system, if applicable. May contain multiple paths, for certain partitions that can be mounted to multiple distinct places."), + SD_VARLINK_DEFINE_FIELD(mountPoint, SD_VARLINK_STRING, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY)); static SD_VARLINK_DEFINE_METHOD( MountImage, From 5721b9bc46abc8aa4c2aeeb3543b34a0c40098b9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 11 Mar 2025 11:58:49 +0100 Subject: [PATCH 3/3] update TODO --- TODO | 1 - 1 file changed, 1 deletion(-) diff --git a/TODO b/TODO index 05ada632de..62c7f8b30d 100644 --- a/TODO +++ b/TODO @@ -152,7 +152,6 @@ Features: - io.systemd.Hostname - io.systemd.Journal - io.systemd.ManagedOOM - - io.systemd.MountFileSystem - io.systemd.Network - io.systemd.PCRExtend - io.systemd.PCRLock