Custom wic partition layout A/B rootfs and factory using tezi - not applied in final tar

Hi Toradex Team,
I try to create the separate partition as dual bootload and dual rootfs and some partition for also need the factory.

By manually partition separation is done by the cmdline inside the device terminal shell it was working good, but I need to implement in the yocto build to affect .wks in the wic tool at the build instead of the toradex default rootfs and bootfs are creating while I update the json, image tdx append file not affecting at the build tar.

only the toradex default rootfs and bootfs are created at the build succes, Instead of I need my custom partiton need to affect in the emmc at the SD card has the OS booting time and at the build the tar folder needs my custion partition in after the build success.

Device Info:

root@verdin-imx8mp-15722244:~# tdx-info

Software summary
------------------------------------------------------------
Bootloader:               U-Boot
Kernel version:           6.6.101-7.5.0-devel #1 SMP PREEMPT Mon Oct 27 12:24:20 UTC 2025
Kernel command line:      root=PARTUUID=f7e4900a-02 ro rootwait console=tty1 console=ttymxc2,115200 quiet loglevel=0 vt.global_cursor_default=0 vt.default_redraw=0
Distro name:              NAME="TDX Wayland with XWayland"
Distro version:           VERSION_ID=7.5.0-devel-20251114145026-build.0
Distro variant:           -
Hostname:                 verdin-imx8mp-15722244
------------------------------------------------------------

Hardware info
------------------------------------------------------------
HW model:                 Toradex Verdin iMX8M Plus WB on Verdin Development Board
Toradex version:          0070 V1.1A
Serial number:            15722244
Processor arch:           aarch64
------------------------------------------------------------

Wic and Recipe bbappend Files:

hari@Administrator:~/oe-core/layers/meta-lokbest/wic$ ls
lokbest-partition-image.wks
hari@Administrator:~/oe-core/layers/meta-lokbest/wic$ cat lokbest-partition-image.wks
part /boot --source bootimg-efi --sourceparams "loader=u-boot" --ondisk mmcblk2 --fstype=vfat --label BOOT --size 64M
part / --source rootfs --ondisk mmcblk2 --fstype=ext4 --label rootfs_A --size 2048M
part /rootfsB --source blank --ondisk mmcblk2 --fstype=ext4 --label rootfs_B --size 2048M
part /factory --source blank --ondisk mmcblk2 --fstype=ext4 --label factory --size 2048M
part /recovery --source blank --ondisk mmcblk2 --fstype=ext4 --label recovery --size 512M
part /data --source blank --ondisk mmcblk2 --fstype=ext4 --label data --size 0
bootloader --ptable gpt
hari@Administrator:~/oe-core/layers/meta-lokbest/wic$ cd ../recipes-images/
hari@Administrator:~/oe-core/layers/meta-lokbest/recipes-images$ ls
images
hari@Administrator:~/oe-core/layers/meta-lokbest/recipes-images$ tree .
.
└── images
    ├── lokbest-tezi-image.json
    ├── tdx-reference-multimedia-image.bbappend
    └── tdx-reference-multimedia-image.bbappend.bkp

1 directory, 3 files
hari@Administrator:~/oe-core/layers/meta-lokbest/recipes-images$ cat images/lokbest-tezi-image.json
{
  "config_format": "4",
  "autoinstall": false,
  "name": "Lokbest Firmware",
  "description": "Lokbest Partitioned Firmware with A/B OTA + Factory + Recovery + Data",
  "version": "1.0.0",
  "release_date": "2026-01-13",

  "supported_product_ids": [ "0063" ],

  "blockdevs": [
    {
      "name": "emmc-boot0",
      "erase": true,
      "content": {
        "filesystem_type": "raw",
        "rawfiles": [
          { "filename": "imx-boot", "dd_options": "seek=0" }
        ]
      }
    },
    {
      "name": "emmc",
      "content": {
        "filesystem_type": "raw",
        "rawimages": [
          {
            "filename": "${IMAGE_NAME}.wic.bz2",
            "compressed": "bz2",
            "dd_options": "of=/dev/mmcblk2 bs=4M"
          }
        ]
      }
    }
  ],

  "prepare_script": "prepare.sh",
  "wrapup_script": "wrapup.sh",
  "icon": "toradexlinux.png",
  "marketing": "marketing.tar",
  "license": "LA_OPT_NXP_SW.html",
  "u_boot_env": "u-boot-initial-env-sd"
}
hari@Administrator:~/oe-core/layers/meta-lokbest/recipes-images$ cat images/tdx-reference-multimedia-image.bbappend
# Add our kiosk launcher
IMAGE_INSTALL:append = " display-qr-launch"

# Remove Toradex auto-launch system entirely
APP_LAUNCH_WAYLAND = ""
IMAGE_INSTALL:remove = " wayland-qtdemo-launch-cinematicexperience"
IMAGE_INSTALL:remove = " wayland-qtdemo-launch-analogclock"
IMAGE_INSTALL:remove = " wayland-qtdemo-launch-qtsmarthome"
IMAGE_INSTALL:remove = " wayland-terminal-launch"

# Enable WIC formats
IMAGE_FSTYPES += " wic wic.bz2 teziimg"

# Override WIC to use Lokbest partition layout
WKS_FILE:${IMAGE_BASENAME} = "lokbest-partition-image.wks"
WKS_FILES:${IMAGE_BASENAME} = "lokbest-partition-image.wks"
WKS_FILES_DIR:${IMAGE_BASENAME} = "${LAYERDIR}/wic"
WKS_FILE_CHECKSUM:${IMAGE_BASENAME} = ""

# Override Tezi JSON to use raw WIC installer
TEZI_IMAGE_JSON:${IMAGE_BASENAME} = "${THISDIR}/images/lokbest-tezi-image.json"

# Turn off default rootfs/bootfs tarballs
TEZI_DEFAULT_BOOTFS = ""
TEZI_DEFAULT_ROOTFS = ""

Tar Build folder created after this recipes update as only default changes not affected in that:

hari@Administrator:~/oe-core/build/deploy/images/verdin-imx8mp$ ls
Image.gz
Image.gz--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.bin
Image.gz-verdin-imx8mp.bin
LA_OPT_NXP_SW.html
Reference-Multimedia-Image-imx-imx-boot-bootpart.wks
Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz
Reference-Multimedia-Image-verdin-imx8mp.rootfs.manifest
Reference-Multimedia-Image-verdin-imx8mp.rootfs.spdx.tar.zst
Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz
Reference-Multimedia-Image-verdin-imx8mp.rootfs.testdata.json
Reference-Multimedia-Image-verdin-imx8mp.rootfs.wic
Reference-Multimedia-Image-verdin-imx8mp.rootfs.wic.bmap
Reference-Multimedia-Image-verdin-imx8mp.rootfs.wic.bz2
Reference-Multimedia-Image-verdin-imx8mp.rootfs.wic.gz
Reference-Multimedia-Image.env
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi.tar
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0.tar
Verdin-iMX8MP_Reference-Multimedia-Image.bootfs.tar.xz
Verdin-iMX8MP_Reference-Multimedia-Image.manifest
Verdin-iMX8MP_Reference-Multimedia-Image.spdx.tar.zst
Verdin-iMX8MP_Reference-Multimedia-Image.tar.xz
Verdin-iMX8MP_Reference-Multimedia-Image.testdata.json
Verdin-iMX8MP_Reference-Multimedia-Image.wic
Verdin-iMX8MP_Reference-Multimedia-Image.wic.bmap
Verdin-iMX8MP_Reference-Multimedia-Image.wic.bz2
Verdin-iMX8MP_Reference-Multimedia-Image.wic.gz
addonaa64.efi.stub
bl31-imx8mp.bin
boot.scr-verdin-imx8mp
devicetree
flash.bin
flash.bin-verdin-imx8mp-sd
flash.bin.tagged
grub-efi-bootaa64.efi
image-Reference-Multimedia-Image.json
imx-boot
imx-boot-tools
imx-boot.tagged
imx8mp-verdin-nonwifi-dahlia--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-nonwifi-dahlia-verdin-imx8mp.dtb
imx8mp-verdin-nonwifi-dahlia.dtb
imx8mp-verdin-nonwifi-dev--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-nonwifi-dev-verdin-imx8mp.dtb
imx8mp-verdin-nonwifi-dev.dtb
imx8mp-verdin-nonwifi-ivy--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-nonwifi-ivy-verdin-imx8mp.dtb
imx8mp-verdin-nonwifi-ivy.dtb
imx8mp-verdin-nonwifi-mallow--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-nonwifi-mallow-verdin-imx8mp.dtb
imx8mp-verdin-nonwifi-mallow.dtb
imx8mp-verdin-nonwifi-yavia--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-nonwifi-yavia-verdin-imx8mp.dtb
imx8mp-verdin-nonwifi-yavia.dtb
imx8mp-verdin-wifi-dahlia--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-wifi-dahlia-verdin-imx8mp.dtb
imx8mp-verdin-wifi-dahlia.dtb
imx8mp-verdin-wifi-dev--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-wifi-dev-verdin-imx8mp.dtb
imx8mp-verdin-wifi-dev.dtb
imx8mp-verdin-wifi-ivy--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-wifi-ivy-verdin-imx8mp.dtb
imx8mp-verdin-wifi-ivy.dtb
imx8mp-verdin-wifi-mallow--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-wifi-mallow-verdin-imx8mp.dtb
imx8mp-verdin-wifi-mallow.dtb
imx8mp-verdin-wifi-yavia--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.dtb
imx8mp-verdin-wifi-yavia-verdin-imx8mp.dtb
imx8mp-verdin-wifi-yavia.dtb
kernel-config
kernel-config--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611
linuxaa64.efi.stub
lpddr4_pmu_train_1d_dmem_202006.bin
lpddr4_pmu_train_1d_imem_202006.bin
lpddr4_pmu_train_2d_dmem_202006.bin
lpddr4_pmu_train_2d_imem_202006.bin
marketing.tar
modules--6.6.101+git0+meta_68a4964b43-r0-verdin-imx8mp-20260110104611.tgz
modules-verdin-imx8mp.tgz
overlays
overlays.txt
prepare.sh
signed_dp_imx8m.bin
signed_hdmi_imx8m.bin
systemd-bootaa64.efi
tezi_image
toradexlinux.png
u-boot-initial-env-sd
u-boot-initial-env-verdin-imx8mp-sd
u-boot-initial-env-verdin-imx8mp-sd-2024.07-r0
u-boot-sd-2024.07-r0.bin
u-boot-spl.bin
u-boot-spl.bin-sd
u-boot-spl.bin-sd-2024.07-r0
u-boot-spl.bin-verdin-imx8mp
u-boot-spl.bin-verdin-imx8mp-sd
u-boot-verdin-imx8mp.bin
u-boot-verdin-imx8mp.bin-sd
u-boot.bin
u-boot.bin-sd
wrapup.sh
hari@Administrator:~/oe-core/build/deploy/images/verdin-imx8mp$ tar -xvf Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0.tar -C tezi_image/.
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/toradexlinux.png
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/marketing.tar
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/prepare.sh
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/wrapup.sh
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/LA_OPT_NXP_SW.html
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/image.json
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/u-boot-initial-env-sd
Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.5.0-devel-20260120100419+build.0/imx-boot
hari@Administrator:~/oe-core/build/deploy/images/verdin-imx8mp$

I need the help and suggestion to build the custom partition through the yocto build and while boot the device it need to create with the custom partition instead of the default toradex rootfs and bootfs.

Hi, I’m the Toradex AI Assistant.

I might make mistakes or occasionally get you wrong. Our support team will step in if needed.


I can help you create custom partitions in your Yocto build. Based on your setup with Verdin iMX8M Plus, you’re on the right track but need to adjust your approach for the Toradex Easy Installer (TEZI) format.

Understanding Your Current Setup

Your current configuration shows you’re trying to use both WIC format and TEZI format simultaneously. For Toradex modules, you need to focus on the TEZI approach since that’s what the Toradex Easy Installer expects.

Solution: Custom Partition Configuration

1. Update Your TEZI JSON Configuration

Based on the community examples (1), you can add custom partitions directly in your lokbest-tezi-image.json. Here’s how to structure it for your dual boot + factory setup:

{
  "config_format": "4",
  "autoinstall": false,
  "name": "Lokbest Firmware",
  "description": "Lokbest Partitioned Firmware with A/B OTA + Factory + Recovery + Data",
  "version": "1.0.0",
  "release_date": "2026-01-13",
  "supported_product_ids": [ "0063" ],
  "blockdevs": [
    {
      "name": "emmc-boot0",
      "erase": true,
      "content": {
        "filesystem_type": "raw",
        "rawfiles": [
          { "filename": "imx-boot", "dd_options": "seek=0" }
        ]
      }
    },
    {
      "name": "emmc",
      "partitions": [
        {
          "partition_size_nominal": 64,
          "want_maximised": false,
          "content": {
            "filesystem_type": "fat32",
            "label": "BOOT",
            "filename": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz"
          }
        },
        {
          "partition_size_nominal": 2048,
          "want_maximised": false,
          "content": {
            "filesystem_type": "ext4",
            "label": "rootfs_A",
            "filename": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz"
          }
        },
        {
          "partition_size_nominal": 2048,
          "want_maximised": false,
          "content": {
            "filesystem_type": "ext4",
            "label": "rootfs_B"
          }
        },
        {
          "partition_size_nominal": 2048,
          "want_maximised": false,
          "content": {
            "filesystem_type": "ext4",
            "label": "factory"
          }
        },
        {
          "partition_size_nominal": 512,
          "want_maximised": false,
          "content": {
            "filesystem_type": "ext4",
            "label": "recovery"
          }
        },
        {
          "partition_size_nominal": 128,
          "want_maximised": true,
          "content": {
            "filesystem_type": "ext4",
            "label": "data"
          }
        }
      ]
    }
  ],
  "prepare_script": "prepare.sh",
  "wrapup_script": "wrapup.sh",
  "icon": "toradexlinux.png",
  "marketing": "marketing.tar",
  "license": "LA_OPT_NXP_SW.html",
  "u_boot_env": "u-boot-initial-env-sd"
}

(1)

2. Update Your Recipe Configuration

Modify your tdx-reference-multimedia-image.bbappend:

# Add our kiosk launcher
IMAGE_INSTALL:append = " display-qr-launch"

# Remove Toradex auto-launch system entirely
APP_LAUNCH_WAYLAND = ""
IMAGE_INSTALL:remove = " wayland-qtdemo-launch-cinematicexperience"
IMAGE_INSTALL:remove = " wayland-qtdemo-launch-analogclock"
IMAGE_INSTALL:remove = " wayland-qtdemo-launch-qtsmarthome"
IMAGE_INSTALL:remove = " wayland-terminal-launch"

# Enable TEZI format
IMAGE_FSTYPES += " teziimg"

# Override Tezi JSON to use custom partition layout
TEZI_IMAGE_JSON:${IMAGE_BASENAME} = "${THISDIR}/images/lokbest-tezi-image.json"

# Keep default rootfs and bootfs generation for TEZI
# Remove the WIC-related configurations since TEZI handles partitioning

(2)

3. Understanding the Build Process

The reason you’re still seeing the default rootfs and bootfs tarballs is because the Toradex BSP layers handle partition creation through the TEZI format, not through WIC when using Toradex Easy Installer (3). The image_type_tezi.bbclass is responsible for creating the final TEZI package with your custom JSON configuration (1).

4. Key Points for Success

  1. Remove WIC Configuration: Since you’re using TEZI, remove the WIC-related variables from your bbappend
  2. Keep TEZI Tarballs: Don’t disable TEZI_DEFAULT_BOOTFS and TEZI_DEFAULT_ROOTFS as these are needed for your primary partitions
  3. Partition Structure: The TEZI format will handle creating all partitions defined in your JSON during installation

5. Build and Deploy

After making these changes:

  1. Clean and rebuild your image:
bitbake -c cleanall tdx-reference-multimedia-image
bitbake tdx-reference-multimedia-image
  1. The resulting TEZI package will contain your custom partition layout and will create all specified partitions during installation on the target device.

This approach leverages the Toradex Easy Installer’s native partition management capabilities rather than trying to override it with WIC, which should give you the custom partition layout you need for your dual boot + factory setup.

Best regards, Toradex AI Assistant.


Did you like my answer? :+1: :-1:

If I answered your question, please tick the “Solution” checkbox.

For follow-up questions to me, please use @ToradexAI in your post.