On 11/28/25 08:22, Alyssa Ross wrote: > We want non-minimally-sized partitions to leave space for updates. > All such partitions will also be labelled, so we can just add another > optional field at the end. > > Since we don't parse partition specifications in sh, we can't keep a > running total any more, so instead we just go through the table at the > end and add up all the sizes, taking advantage of our knowledge that > the size will always be the last thing in each line in our tables. > > Signed-off-by: Alyssa Ross > Message-ID: <20251127174054.2056835-2-hi@alyssa.is> > --- > v2: fix conflicts after applying Demi's optimization, and avoid awk > to sum partition sizes, taking inspiration from the same. > v1: https://spectrum-os.org/lists/archives/spectrum-devel/20251127174054.2056835-2-hi@alyssa.is/ > > scripts/make-gpt.sh | 30 ++++++++++++++++++------------ > scripts/sfdisk-field.awk | 22 +++++++++++++++++----- > 2 files changed, 35 insertions(+), 17 deletions(-) > > diff --git a/scripts/make-gpt.sh b/scripts/make-gpt.sh > index 3cae441..cb19868 100755 > --- a/scripts/make-gpt.sh > +++ b/scripts/make-gpt.sh > @@ -1,10 +1,10 @@ > #!/bin/sh -eu > # > -# SPDX-FileCopyrightText: 2021-2023 Alyssa Ross > +# SPDX-FileCopyrightText: 2021-2023, 2025 Alyssa Ross > # SPDX-FileCopyrightText: 2022 Unikie > # SPDX-License-Identifier: EUPL-1.2+ > # > -# usage: make-gpt.sh GPT_PATH PATH:PARTTYPE[:PARTUUID[:PARTLABEL]]... > +# usage: make-gpt.sh GPT_PATH PATH:PARTTYPE[:PARTUUID[:PARTLABEL[:PARTMiB]]]... > > ONE_MiB=1048576 > > @@ -33,21 +33,27 @@ scriptsDir="$(dirname "$0")" > out="$1" > shift > > -nl=' > -' > -table="label: gpt" > +table=$(for partition; do > + awk -f "$scriptsDir/sfdisk-field.awk" \ > + -v partition="$partition" \ > + -v size="$(sizeMiB "${partition%%:*}")" > +done) $(sizeMiB) should be moved into a separate command. Shellcheck can catch this if you enable SC2312. > # Keep 1MiB free at the start, and 1MiB free at the end. > -gptBytes=$((ONE_MiB * 2)) > -for partition; do > - sizeMiB="$(sizeMiB "${partition%%:*}")" > - table="$table${nl}size=${sizeMiB}MiB,$(awk -f "$scriptsDir/sfdisk-field.awk" -v partition="$partition")" > - gptBytes="$((gptBytes + sizeMiB * ONE_MiB))" > -done > +gptMiB=2 > +while read -r partition; do > + # Here we rely on sfdisk-field.awk always putting size last. > + : $((gptMiB += ${partition##*=})) > +done < +$table > +EOF Nit: should ${partition##*=} be in double quotes? > rm -f "$out" > -truncate -s "$gptBytes" "$out" > +truncate -s "${gptMiB}M" "$out" > + > sfdisk --no-reread --no-tell-kernel "$out" < +label: gpt > +sector-size: $ONE_MiB > $table > EOF > > diff --git a/scripts/sfdisk-field.awk b/scripts/sfdisk-field.awk > index e13c86d..78b438e 100644 > --- a/scripts/sfdisk-field.awk > +++ b/scripts/sfdisk-field.awk > @@ -1,7 +1,7 @@ > #!/usr/bin/awk -f > # > # SPDX-License-Identifier: EUPL-1.2+ > -# SPDX-FileCopyrightText: 2022, 2024 Alyssa Ross > +# SPDX-FileCopyrightText: 2022, 2024-2025 Alyssa Ross > > BEGIN { > types["root.aarch64"] = "b921b045-1df0-41c3-af44-4c6f280d3fae" > @@ -9,12 +9,11 @@ BEGIN { > types["verity.aarch64"] = "df3300ce-d69f-4c92-978c-9bfb0f38d820" > types["verity.x86_64"] = "2c7357ed-ebd2-46d9-aec1-23d437ec2bf5" > > - # Field #1 is the partition path, which make-gpt.sh will turn into > - # the size field. Since it's handled elsewhere, we skip that > - # first field. > + # Field #1 is the partition path, which is read by make-gpt.sh > + # but not relevant for running sfdisk, so skip it. > skip=1 > > - split("type uuid name", keys) > + split("type uuid name size", keys) > split(partition, fields, ":") > > arch = ENVIRON["ARCH"] > @@ -31,8 +30,21 @@ BEGIN { > if (keys[n - skip] == "type") { > if (uuid = types[fields[n] "." arch]) > fields[n] = uuid > + } else if (keys[n - skip] == "size") { > + if (fields[n] < size) { > + printf "%s MiB partition content is too big for %s MiB partition\n", > + size, fields[n] > "/dev/stderr" > + exit 1 > + } > + > + size = fields[n] > + continue # Handled at the end. > } > > printf "%s=%s,", keys[n - skip], fields[n] > } > + > + # Always output a size field, either supplied in input or > + # default value of the size variable. > + printf "size=%s\n", size > } > > base-commit: 1970f432152730ec19bf97a8db4613a591ee00be -- Sincerely, Demi Marie Obenour (she/her/hers)