From: Daan De Meyer Date: Tue, 22 Nov 2022 13:27:30 +0000 (+0100) Subject: repart: Add --skip-partitions= X-Git-Tag: v253-rc1~450^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F25482%2Fhead;p=thirdparty%2Fsystemd.git repart: Add --skip-partitions= --include-partitions and --exclude-partitions now fully exclude partitions from repart. Whenever a partition type is excluded, we don't take any partitions of that type into account at all when running systemd-repart. --skip-partitions= is introduced to do what --exclude-partitions did previously. Any skipped partitions are taken into acount when doing size calculations, but are not yet populated. Why do we need both concepts? Exclusion is needed so that we can use shared repart definitions to generate bootable and non-bootable images. When generating a non-bootable image, we use --exclude-partitions to exclude the ESP partition. Skipping is needed so that we can populate the root partition while skipping the ESP partition, get the roothash of the root partition, use that to generate a UKI, and finally populate the ESP partition with the UKI included. --- diff --git a/man/systemd-repart.xml b/man/systemd-repart.xml index 6559fceedb4..2c74afbe0fa 100644 --- a/man/systemd-repart.xml +++ b/man/systemd-repart.xml @@ -372,11 +372,18 @@ are excluded. If is used, all partitions that are specified are excluded. Both options take a comma separated list of GPT partition type UUIDs or identifiers (see Type= in - repart.d5). All - partitions that are excluded using these options are still taken into account when calculating the - sizes and offsets of other partitions, but aren't actually written to the disk image. The net effect - of this option is that if you run systemd-repart again without these options, the - missing partitions will be added as if they had not been excluded the first time + repart.d5). + + + + + PARTITION + + This option specifies which partition types systemd-repart should + skip. All partitions that are skipped using this option are still taken into account when calculating + the sizes and offsets of other partitions, but aren't actually written to the disk image. The net + effect of this option is that if you run systemd-repart again without these + options, the missing partitions will be added as if they had not been skipped the first time systemd-repart was executed. diff --git a/src/partition/repart.c b/src/partition/repart.c index 855780f47ff..7e56cc51551 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -145,6 +145,8 @@ static bool arg_split = false; static sd_id128_t *arg_filter_partitions = NULL; static size_t arg_n_filter_partitions = 0; static FilterPartitionsType arg_filter_partitions_type = FILTER_PARTITIONS_NONE; +static sd_id128_t *arg_skip_partitions = NULL; +static size_t arg_n_skip_partitions = 0; STATIC_DESTRUCTOR_REGISTER(arg_root, freep); STATIC_DESTRUCTOR_REGISTER(arg_image, freep); @@ -385,7 +387,7 @@ static void partition_foreignize(Partition *p) { p->verity = VERITY_OFF; } -static bool partition_skip(const Partition *p) { +static bool partition_exclude(const Partition *p) { assert(p); if (arg_filter_partitions_type == FILTER_PARTITIONS_NONE) @@ -398,6 +400,16 @@ static bool partition_skip(const Partition *p) { return arg_filter_partitions_type == FILTER_PARTITIONS_INCLUDE; } +static bool partition_skip(const Partition *p) { + assert(p); + + for (size_t i = 0; i < arg_n_skip_partitions; i++) + if (sd_id128_equal(p->type.uuid, arg_skip_partitions[i])) + return true; + + return false; +} + static Partition* partition_unlink_and_free(Context *context, Partition *p) { if (!p) return NULL; @@ -1559,6 +1571,9 @@ static int partition_read_definition(Partition *p, const char *path, const char if (r < 0) return r; + if (partition_exclude(p)) + return 0; + if (p->size_min != UINT64_MAX && p->size_max != UINT64_MAX && p->size_min > p->size_max) return log_syntax(NULL, LOG_ERR, path, 1, SYNTHETIC_ERRNO(EINVAL), "SizeMinBytes= larger than SizeMaxBytes=, refusing."); @@ -1657,7 +1672,7 @@ static int partition_read_definition(Partition *p, const char *path, const char } else if (streq(p->split_name_format, "-")) p->split_name_format = mfree(p->split_name_format); - return 0; + return 1; } static int find_verity_sibling(Context *context, Partition *p, VerityMode mode, Partition **ret) { @@ -1732,6 +1747,8 @@ static int context_read_definitions( r = partition_read_definition(p, *f, dirs); if (r < 0) return r; + if (r == 0) + continue; LIST_INSERT_AFTER(partitions, context->partitions, last, p); last = TAKE_PTR(p); @@ -5405,9 +5422,12 @@ static int help(void) { " Generate JSON output\n" " --split=BOOL Whether to generate split artifacts\n" " --include-partitions=PARTITION1,PARTITION2,PARTITION3,…\n" - " Only operate on partitions of the specified types\n" + " Ignore partitions not of the specified types\n" " --exclude-partitions=PARTITION1,PARTITION2,PARTITION3,…\n" - " Don't operate on partitions of the specified types\n" + " Ignore partitions of the specified types\n" + " --skip-partitions=PARTITION1,PARTITION2,PARTITION3,…\n" + " Take partitions of the specified types into account\n" + " but don't populate them yet\n" "\nSee the %s for details.\n", program_invocation_short_name, ansi_highlight(), @@ -5445,6 +5465,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_SPLIT, ARG_INCLUDE_PARTITIONS, ARG_EXCLUDE_PARTITIONS, + ARG_SKIP_PARTITIONS, }; static const struct option options[] = { @@ -5474,6 +5495,7 @@ static int parse_argv(int argc, char *argv[]) { { "split", required_argument, NULL, ARG_SPLIT }, { "include-partitions", required_argument, NULL, ARG_INCLUDE_PARTITIONS }, { "exclude-partitions", required_argument, NULL, ARG_EXCLUDE_PARTITIONS }, + { "skip-partitions", required_argument, NULL, ARG_SKIP_PARTITIONS }, {} }; @@ -5754,6 +5776,13 @@ static int parse_argv(int argc, char *argv[]) { break; + case ARG_SKIP_PARTITIONS: + r = parse_partition_types(optarg, &arg_skip_partitions, &arg_n_skip_partitions); + if (r < 0) + return r; + + break; + case '?': return -EINVAL; diff --git a/test/units/testsuite-58.sh b/test/units/testsuite-58.sh index a225ac8beec..01eec207459 100755 --- a/test/units/testsuite-58.sh +++ b/test/units/testsuite-58.sh @@ -154,13 +154,14 @@ device: $imgs/zzz unit: sectors first-lba: 2048 last-lba: 2097118 -$imgs/zzz1 : start= 2048, size= 591856, type=933AC7E1-2EB4-4F13-B844-0E14E2AEF915, uuid=4980595D-D74A-483A-AA9E-9903879A0EE5, name=\"home-first\", attrs=\"GUID:59\" -$imgs/zzz4 : start= 1777624, size= 131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=78C92DB8-3D2B-4823-B0DC-792B78F66F1E, name=\"swap\"" +$imgs/zzz1 : start= 2048, size= 1775576, type=933AC7E1-2EB4-4F13-B844-0E14E2AEF915, uuid=4980595D-D74A-483A-AA9E-9903879A0EE5, name=\"home-first\", attrs=\"GUID:59\" +$imgs/zzz2 : start= 1777624, size= 131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=78C92DB8-3D2B-4823-B0DC-792B78F66F1E, name=\"swap\"" runas testuser systemd-repart --definitions="$defs" \ --dry-run=no \ --seed="$seed" \ - --exclude-partitions=root \ + --empty=force \ + --skip-partitions=home,root \ "$imgs/zzz" output=$(sfdisk -d "$imgs/zzz" | grep -v -e 'sector-size' -e '^$') @@ -171,7 +172,6 @@ device: $imgs/zzz unit: sectors first-lba: 2048 last-lba: 2097118 -$imgs/zzz1 : start= 2048, size= 591856, type=933AC7E1-2EB4-4F13-B844-0E14E2AEF915, uuid=4980595D-D74A-483A-AA9E-9903879A0EE5, name=\"home-first\", attrs=\"GUID:59\" $imgs/zzz4 : start= 1777624, size= 131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=78C92DB8-3D2B-4823-B0DC-792B78F66F1E, name=\"swap\"" runas testuser systemd-repart --definitions="$defs" \