mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
Merge pull request #28632 from DaanDeMeyer/repart-synthesize
repart: Add --copy-from option
This commit is contained in:
@@ -440,6 +440,14 @@
|
||||
due to missing permissions.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--copy-from=</option><arg>IMAGE</arg></term>
|
||||
|
||||
<listitem><para>Instructs <command>systemd-repart</command> to copy the partitions from the given
|
||||
image. The partitions from the given image are synthesized into partition definitions that are
|
||||
parsed before the partition definition files.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<xi:include href="standard-options.xml" xpointer="help" />
|
||||
<xi:include href="standard-options.xml" xpointer="version" />
|
||||
<xi:include href="standard-options.xml" xpointer="no-pager" />
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,10 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "dissect-image.h"
|
||||
#include "extract-word.h"
|
||||
#include "fd-util.h"
|
||||
#include "fdisk-util.h"
|
||||
#include "parse-util.h"
|
||||
|
||||
#if HAVE_LIBFDISK
|
||||
|
||||
@@ -75,4 +77,79 @@ int fdisk_partition_get_type_as_id128(struct fdisk_partition *p, sd_id128_t *ret
|
||||
return sd_id128_from_string(pts, ret);
|
||||
}
|
||||
|
||||
int fdisk_partition_get_attrs_as_uint64(struct fdisk_partition *pa, uint64_t *ret) {
|
||||
uint64_t flags = 0;
|
||||
const char *a;
|
||||
int r;
|
||||
|
||||
assert(pa);
|
||||
assert(ret);
|
||||
|
||||
/* Retrieve current flags as uint64_t mask */
|
||||
|
||||
a = fdisk_partition_get_attrs(pa);
|
||||
if (!a) {
|
||||
*ret = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&a, &word, ",", EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
if (streq(word, "RequiredPartition"))
|
||||
flags |= SD_GPT_FLAG_REQUIRED_PARTITION;
|
||||
else if (streq(word, "NoBlockIOProtocol"))
|
||||
flags |= SD_GPT_FLAG_NO_BLOCK_IO_PROTOCOL;
|
||||
else if (streq(word, "LegacyBIOSBootable"))
|
||||
flags |= SD_GPT_FLAG_LEGACY_BIOS_BOOTABLE;
|
||||
else {
|
||||
const char *e;
|
||||
unsigned u;
|
||||
|
||||
/* Drop "GUID" prefix if specified */
|
||||
e = startswith(word, "GUID:") ?: word;
|
||||
|
||||
if (safe_atou(e, &u) < 0) {
|
||||
log_debug("Unknown partition flag '%s', ignoring.", word);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (u >= sizeof(flags)*8) { /* partition flags on GPT are 64-bit. Let's ignore any further
|
||||
bits should libfdisk report them */
|
||||
log_debug("Partition flag above bit 63 (%s), ignoring.", word);
|
||||
continue;
|
||||
}
|
||||
|
||||
flags |= UINT64_C(1) << u;
|
||||
}
|
||||
}
|
||||
|
||||
*ret = flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdisk_partition_set_attrs_as_uint64(struct fdisk_partition *pa, uint64_t flags) {
|
||||
_cleanup_free_ char *attrs = NULL;
|
||||
int r;
|
||||
|
||||
assert(pa);
|
||||
|
||||
for (unsigned i = 0; i < sizeof(flags) * 8; i++) {
|
||||
if (!FLAGS_SET(flags, UINT64_C(1) << i))
|
||||
continue;
|
||||
|
||||
r = strextendf_with_separator(&attrs, ",", "%u", i);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return fdisk_partition_set_attrs(pa, strempty(attrs));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -19,4 +19,7 @@ int fdisk_new_context_fd(int fd, bool read_only, uint32_t sector_size, struct fd
|
||||
int fdisk_partition_get_uuid_as_id128(struct fdisk_partition *p, sd_id128_t *ret);
|
||||
int fdisk_partition_get_type_as_id128(struct fdisk_partition *p, sd_id128_t *ret);
|
||||
|
||||
int fdisk_partition_get_attrs_as_uint64(struct fdisk_partition *pa, uint64_t *ret);
|
||||
int fdisk_partition_set_attrs_as_uint64(struct fdisk_partition *pa, uint64_t flags);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -18,87 +18,6 @@ void partition_info_destroy(PartitionInfo *p) {
|
||||
p->device = mfree(p->device);
|
||||
}
|
||||
|
||||
static int fdisk_partition_get_attrs_as_uint64(
|
||||
struct fdisk_partition *pa,
|
||||
uint64_t *ret) {
|
||||
|
||||
uint64_t flags = 0;
|
||||
const char *a;
|
||||
int r;
|
||||
|
||||
assert(pa);
|
||||
assert(ret);
|
||||
|
||||
/* Retrieve current flags as uint64_t mask */
|
||||
|
||||
a = fdisk_partition_get_attrs(pa);
|
||||
if (!a) {
|
||||
*ret = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&a, &word, ",", EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
if (streq(word, "RequiredPartition"))
|
||||
flags |= SD_GPT_FLAG_REQUIRED_PARTITION;
|
||||
else if (streq(word, "NoBlockIOProtocol"))
|
||||
flags |= SD_GPT_FLAG_NO_BLOCK_IO_PROTOCOL;
|
||||
else if (streq(word, "LegacyBIOSBootable"))
|
||||
flags |= SD_GPT_FLAG_LEGACY_BIOS_BOOTABLE;
|
||||
else {
|
||||
const char *e;
|
||||
unsigned u;
|
||||
|
||||
/* Drop "GUID" prefix if specified */
|
||||
e = startswith(word, "GUID:") ?: word;
|
||||
|
||||
if (safe_atou(e, &u) < 0) {
|
||||
log_debug("Unknown partition flag '%s', ignoring.", word);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (u >= sizeof(flags)*8) { /* partition flags on GPT are 64-bit. Let's ignore any further
|
||||
bits should libfdisk report them */
|
||||
log_debug("Partition flag above bit 63 (%s), ignoring.", word);
|
||||
continue;
|
||||
}
|
||||
|
||||
flags |= UINT64_C(1) << u;
|
||||
}
|
||||
}
|
||||
|
||||
*ret = flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fdisk_partition_set_attrs_as_uint64(
|
||||
struct fdisk_partition *pa,
|
||||
uint64_t flags) {
|
||||
|
||||
_cleanup_free_ char *attrs = NULL;
|
||||
int r;
|
||||
|
||||
assert(pa);
|
||||
|
||||
for (unsigned i = 0; i < sizeof(flags) * 8; i++) {
|
||||
if (!FLAGS_SET(flags, UINT64_C(1) << i))
|
||||
continue;
|
||||
|
||||
r = strextendf_with_separator(&attrs, ",", "%u", i);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return fdisk_partition_set_attrs(pa, strempty(attrs));
|
||||
}
|
||||
|
||||
int read_partition_info(
|
||||
struct fdisk_context *c,
|
||||
struct fdisk_table *t,
|
||||
|
||||
@@ -160,6 +160,27 @@ last-lba: 2097118
|
||||
$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\""
|
||||
|
||||
systemd-repart --offline="$OFFLINE" \
|
||||
--empty=create \
|
||||
--size=1G \
|
||||
--dry-run=no \
|
||||
--seed="$seed" \
|
||||
--copy-from="$imgs/zzz" \
|
||||
"$imgs/copy"
|
||||
|
||||
output=$(sfdisk -d "$imgs/copy" | grep -v -e 'sector-size' -e '^$')
|
||||
|
||||
assert_eq "$output" "label: gpt
|
||||
label-id: 1D2CE291-7CCE-4F7D-BC83-FDB49AD74EBD
|
||||
device: $imgs/copy
|
||||
unit: sectors
|
||||
first-lba: 2048
|
||||
last-lba: 2097118
|
||||
$imgs/copy1 : start= 2048, size= 1775576, type=933AC7E1-2EB4-4F13-B844-0E14E2AEF915, uuid=4980595D-D74A-483A-AA9E-9903879A0EE5, name=\"home-first\", attrs=\"GUID:59\"
|
||||
$imgs/copy2 : start= 1777624, size= 131072, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=78C92DB8-3D2B-4823-B0DC-792B78F66F1E, name=\"swap\""
|
||||
|
||||
rm "$imgs/copy" # Save disk space
|
||||
|
||||
systemd-repart --offline="$OFFLINE" \
|
||||
--definitions="$defs" \
|
||||
--dry-run=no \
|
||||
|
||||
Reference in New Issue
Block a user