Extended partitions cannot be resized like primary partitions because
both the last logical partition and the EBR primary partition containing
it need to be expanded.
To do this, add a second SED directive for removing the parition size of
the EBR partition. This part is detected by having either type `f` (Win
95 Ext') or `5` (Extended).
Signed-off-by: Harald Seiler <
h...@denx.de>
---
Notes:
Changes in v2:
- Keep a type `f` EBR as type `f`.
- Update comment to better explain what is done.
I've built myself a little test-suite to see how this script
behaves when given different layouts. It seems to work just fine
now for the following cases:
- Expanding last partition of a GPT.
- Expanding last partition of an MBR without extended partitions.
- Expanding last (logical) partition of an MBR when the last
primary partition is the EBR.
Having the EBR somewhere in the middle is *not* supported. The
script will fail with an error message, without accidentally
ruining the layout. I think such a case is too rare to be worth
supporting.
.../files/expand-last-partition.sh | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh b/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
index 08c69db30529..7175dfd38b7e 100755
--- a/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
+++ b/meta/recipes-support/expand-on-first-boot/files/expand-last-partition.sh
@@ -17,12 +17,20 @@ if [ "${ROOT_DEV}" = "${BOOT_DEV}" ]; then
exit 1
fi
-LAST_PART="$(sfdisk -d ${BOOT_DEV} 2>/dev/null | tail -1 | cut -d ' ' -f 1)"
+LAST_PART="$(sfdisk -d "${BOOT_DEV}" 2>/dev/null | tail -1 | cut -d ' ' -f 1)"
-# Remove all hints to the current medium (last-lba) and last partition size,
-# then ask sfdisk to recreate the partitioning
-sfdisk -d "${BOOT_DEV}" 2>/dev/null | grep -v last-lba | \
- sed 's|\('"${LAST_PART}"' .*, \)size=[^,]*, |\1|' | \
+# Transform the partition table as follows:
+#
+# - Remove any 'last-lba' header so sfdisk uses the entire available space.
+# - If this partition table is MBR and an extended partition container (EBR)
+# exists, we assume this needs to be expanded as well; remove its size
+# field so sfdisk expands it.
+# - For the previously fetched last partition, also remove the size field so
+# sfdisk expands it.
+sfdisk -d "${BOOT_DEV}" 2>/dev/null | \
+ grep -v last-lba | \
+ sed 's|^\(.*, \)size=[^,]*, \(type=[f5]\)$|\1\2|' | \
+ sed 's|^\('"${LAST_PART}"' .*, \)size=[^,]*, |\1|' | \
sfdisk --force "${BOOT_DEV}"
# Inform the kernel about the partitioning change
--
2.25.4