diff --git a/man/systemd-repart.xml b/man/systemd-repart.xml index 6559fceedb..2c74afbe0f 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 855780f47f..7e56cc5155 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 a225ac8bee..01eec20745 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" \