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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to