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