Can you create a PR on github.com/agherzhan/meta-raspberrypi
On 2/28/25 3:14 PM, Abdelkhalek Mansouri via lists.yoctoproject.org wrote:
From: "abdelkhalek-mansouri" <abdelkhalek.manso...@gmail.com>
Description:
This patch introduces support for an A/B partition layout in the rpi-sdimg
image creation
process, enabling dual root filesystem partitions. This enhancement allows for
more robust and flexible
system updates by providing a fallback partition.
Key Changes:
New Variables Introduced:
ROOTFS_PARTITION_SIZE: Specifies the size of each root filesystem partition.
The default value is set to 4 GB.
RPI_AB_PARTITION_LAYOUT: Determines the partition layout. The default value is
0, which indicates
a single root filesystem partition. Setting this variable to 1 enables the A/B
partition layout.
Disk Layout:
Single Partition Layout:
0 -> IMAGE_ROOTFS_ALIGNMENT - reserved for other
data
IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - bootloader and kernel
BOOT_SPACE -> SDIMG_SIZE - rootfs
A/B Partition Layout:
0 -> IMAGE_ROOTFS_ALIGNMENT - reserved for
other data
IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - bootloader and
kernel
BOOT_SPACE -> ROOTFS_A - rootfs for
partition A
ROOTFS_A -> ROOTFS_B - rootfs for
partition B
Signed-off-by: abdelkhalek-mansouri <abdelkhalek.manso...@gmail.com>
Signed-off-by: abdelkhalek-mansouri <abdelkhalek.manso...@gmail.com>
---
classes/sdcard_image-rpi.bbclass | 100 +++++++++++++++++++++++++++----
1 file changed, 89 insertions(+), 11 deletions(-)
diff --git a/classes/sdcard_image-rpi.bbclass b/classes/sdcard_image-rpi.bbclass
index ddcd69d..7f719dd 100644
--- a/classes/sdcard_image-rpi.bbclass
+++ b/classes/sdcard_image-rpi.bbclass
@@ -21,6 +21,27 @@ inherit image_types
# ^ ^ ^ ^
# | | | |
# 0 4MiB 4MiB + 48MiB 4MiB + 48Mib +
SDIMG_ROOTFS
+#
+# In case of A/B symmetric setup:
+#
+# The disk layout used is:
+#
+# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved
for other data
+# IMAGE_ROOTFS_ALIGNEMENT -> BOOT_SPACE - bootloader
and kernel
+# BOOT_SPACE -> ROOTFS_A - rootfs for
partition A
+# ROOTFS_A -> ROOTFS_B - rootfs for
partition B
+# Default Free space =
1.3x
+# Use
IMAGE_OVERHEAD_FACTOR to add more space
+# <--------->
+# 4MiB 48MiB ROOTFS_A
ROOTFS_B
+# <-----------------------> <----------> <---------------------->
<------------------>
+# ------------------------ ------------ ------------------------
--------------------
+# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_PARTITION_A |
ROOTFS_PARTITION_B |
+# ------------------------ ------------ ------------------------
--------------------
+# ^ ^ ^ ^
^
+# | | | |
|
+# 0 4MiB 4MiB + 48MiB 4MiB + 48MiB + ROOTFS_A
4MiB + 48MiB + ROOTFS_A + ROOTFS_B
+
# This image depends on the rootfs image
IMAGE_TYPEDEP:rpi-sdimg = "${SDIMG_ROOTFS_TYPE}"
@@ -36,6 +57,13 @@ BOOT_SPACE ?= "49152"
# Set alignment to 4MB [in KiB]
IMAGE_ROOTFS_ALIGNMENT = "4096"
+# Set Rootfs partition size [in KiB] by default 4GB
+ROOTFS_PARTITION_SIZE ?= "4194304"
+
+# Variable to enable or disable A/B partiton layout for dual root filesystem
setup
+# Set to 0 by default to use a single root filesystem layout
+RPI_AB_PARTITION_LAYOUT ?= "0"
+
# Use an uncompressed ext3 by default as rootfs
SDIMG_ROOTFS_TYPE ?= "ext3"
SDIMG_ROOTFS = "${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${SDIMG_ROOTFS_TYPE}"
@@ -75,23 +103,51 @@ IMAGE_CMD:rpi-sdimg () {
# Align partitions
BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1)
BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} %
${IMAGE_ROOTFS_ALIGNMENT})
- SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} +
$ROOTFS_SIZE)
- echo "Creating filesystem with Boot partition ${BOOT_SPACE_ALIGNED} KiB and RootFS $ROOTFS_SIZE KiB"
+ if [ "${RPI_AB_PARTITION_LAYOUT}" = "0" ]; then
+ SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} +
${ROOTFS_SIZE})
+ echo "Creating filesystem with Boot partition ${BOOT_SPACE_ALIGNED} KiB and
RootFS $ROOTFS_SIZE KiB"
+ else
+ ROOTFS_SIZE_ALIGNED=$(expr ${ROOTFS_SIZE} + ${IMAGE_ROOTFS_ALIGNMENT}
- 1)
+ ROOTFS_SIZE_ALIGNED=$(expr ${ROOTFS_SIZE_ALIGNED} -
${ROOTFS_SIZE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT})
+
+ if [ ${ROOTFS_SIZE_ALIGNED} > ${ROOTFS_PARTITION_SIZE} ]; then
+ ROOTFS_PARTITION_SIZE=${ROOTFS_SIZE_ALIGNED}
+ fi
+
+ SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} +
${ROOTFS_PARTITION_SIZE} \* 2)
+ echo "Creating filesystem with Boot partition ${BOOT_SPACE_ALIGNED} KiB and
two RootFS partition with $ROOTFS_SIZE KiB each"
+ fi
# Check if we are building with device tree support
DTS="${@make_dtb_boot_files(d)}"
# Initialize sdcard image file
- dd if=/dev/zero of=${SDIMG} bs=1024 count=0 seek=${SDIMG_SIZE}
+ dd if=/dev/zero of=${SDIMG} bs=1K count=0 seek=${SDIMG_SIZE}
# Create partition table
parted -s ${SDIMG} mklabel msdos
+
# Create boot partition and mark it as bootable
- parted -s ${SDIMG} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT}
$(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT})
+ parted -s ${SDIMG} unit KiB mkpart primary fat32 \
+ ${IMAGE_ROOTFS_ALIGNMENT} \
+ $(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT})
parted -s ${SDIMG} set 1 boot on
+
# Create rootfs partition to the end of disk
- parted -s ${SDIMG} -- unit KiB mkpart primary ext2 $(expr
${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) -1s
+ if [ "${RPI_AB_PARTITION_LAYOUT}" = "0" ]; then
+ parted -s ${SDIMG} -- unit KiB mkpart primary ext2 \
+ $(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT}) \
+ -1s
+ else
+ parted -s ${SDIMG} -- unit KiB mkpart primary ext2 \
+ $(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT}) \
+ $(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} +
${ROOTFS_PARTITION_SIZE})
+
+ parted -s ${SDIMG} -- unit KiB mkpart primary ext2 \
+ $(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} +
${ROOTFS_PARTITION_SIZE}) \
+ -1s
+ fi
parted ${SDIMG} print
# Create a vfat image with boot files
@@ -170,13 +226,35 @@ IMAGE_CMD:rpi-sdimg () {
fi
# Burn Partitions
- dd if=${WORKDIR}/boot.img of=${SDIMG} conv=notrunc seek=1 bs=$(expr
${IMAGE_ROOTFS_ALIGNMENT} \* 1024)
- # If SDIMG_ROOTFS_TYPE is a .xz file use xzcat
- if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz"
- then
- xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc seek=1 bs=$(expr
1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024)
+ dd if=${WORKDIR}/boot.img of=${SDIMG} conv=notrunc \
+ seek=$(expr ${IMAGE_ROOTFS_ALIGNMENT}) bs=1K
+
+ if [ "${RPI_AB_PARTITION_LAYOUT}" = "0" ]; then
+ # If SDIMG_ROOTFS_TYPE is a .xz file use xzcat
+ if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz"
+ then
+ xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc \
+ seek=$(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT})
bs=1K
+ else
+ dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc \
+ seek=$(expr ${BOOT_SPACE_ALIGNED} +
${IMAGE_ROOTFS_ALIGNMENT}) bs=1K
+ fi
else
- dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024
\* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024)
+ # If SDIMG_ROOTFS_TYPE is a .xz file use xzcat
+ if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz"
+ then
+ xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc \
+ seek=$(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT})
bs=1K
+
+ xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc \
+ seek=$(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT}
+ ${ROOTFS_PARTITION_SIZE}) bs=1K
+ else
+ dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc \
+ seek=$(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT})
bs=1K
+
+ dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc \
+ seek=$(expr ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} +
${ROOTFS_PARTITION_SIZE}) bs=1K
+ fi
fi
}
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#64900): https://lists.yoctoproject.org/g/yocto/message/64900
Mute This Topic: https://lists.yoctoproject.org/mt/111444313/21656
Group Owner: yocto+ow...@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/yocto/unsub
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-