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
 }
 
-- 
2.43.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#64897): https://lists.yoctoproject.org/g/yocto/message/64897
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]
-=-=-=-=-=-=-=-=-=-=-=-

  • [yocto] [meta-raspberrypi]... Abdelkhalek Mansouri via lists.yoctoproject.org

Reply via email to