From a8c47660bbbcc2ffc483beaa17d5c806f73849b3 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 23 Jan 2019 11:34:31 +0100 Subject: [PATCH] dissect: automatically detect boot loader spec $BOOT partition The boot loader spec supports two places to store boot loader configuration: the ESP and a generic replacement for it in case the ESP is not available or not suitable. Let's look for both. --- src/shared/dissect-image.c | 65 +++++++++++++++++++++++++++++++------- src/shared/dissect-image.h | 1 + 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 94df2fe255f..2dbc0bdb3d4 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -495,6 +495,14 @@ int dissect_image( designator = PARTITION_ESP; fstype = "vfat"; + + } else if (sd_id128_equal(type_id, GPT_XBOOTLDR)) { + + if (pflags & GPT_FLAG_NO_AUTO) + continue; + + designator = PARTITION_XBOOTLDR; + rw = !(pflags & GPT_FLAG_READ_ONLY); } #ifdef GPT_ROOT_NATIVE else if (sd_id128_equal(type_id, GPT_ROOT_NATIVE)) { @@ -610,21 +618,53 @@ int dissect_image( } else if (is_mbr) { - if (pflags != 0x80) /* Bootable flag */ - continue; + switch (blkid_partition_get_type(pp)) { - if (blkid_partition_get_type(pp) != 0x83) /* Linux partition */ - continue; + case 0x83: /* Linux partition */ + + if (pflags != 0x80) /* Bootable flag */ + continue; - if (generic_node) - multiple_generic = true; - else { - generic_nr = nr; - generic_rw = true; - generic_node = strdup(node); - if (!generic_node) + if (generic_node) + multiple_generic = true; + else { + generic_nr = nr; + generic_rw = true; + generic_node = strdup(node); + if (!generic_node) + return -ENOMEM; + } + + break; + + case 0xEA: { /* Boot Loader Spec extended $BOOT partition */ + _cleanup_free_ char *n = NULL; + sd_id128_t id = SD_ID128_NULL; + const char *sid; + + /* First one wins */ + if (m->partitions[PARTITION_XBOOTLDR].found) + continue; + + sid = blkid_partition_get_uuid(pp); + if (sid) + (void) sd_id128_from_string(sid, &id); + + n = strdup(node); + if (!n) return -ENOMEM; - } + + m->partitions[PARTITION_XBOOTLDR] = (DissectedPartition) { + .found = true, + .partno = nr, + .rw = true, + .architecture = _ARCHITECTURE_INVALID, + .node = TAKE_PTR(n), + .uuid = id, + }; + + break; + }} } } @@ -1497,6 +1537,7 @@ static const char *const partition_designator_table[] = { [PARTITION_HOME] = "home", [PARTITION_SRV] = "srv", [PARTITION_ESP] = "esp", + [PARTITION_XBOOTLDR] = "xbootldr", [PARTITION_SWAP] = "swap", [PARTITION_ROOT_VERITY] = "root-verity", [PARTITION_ROOT_SECONDARY_VERITY] = "root-secondary-verity", diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index f50b40ea115..ded43f331a5 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -29,6 +29,7 @@ enum { PARTITION_HOME, PARTITION_SRV, PARTITION_ESP, + PARTITION_XBOOTLDR, PARTITION_SWAP, PARTITION_ROOT_VERITY, /* verity data for the PARTITION_ROOT partition */ PARTITION_ROOT_SECONDARY_VERITY, /* verity data for the PARTITION_ROOT_SECONDARY partition */ -- 2.47.3