imagetypes_vm: add support for standalone VMDK images

Message ID 20261030115757.25391-1-clara.kowalsky@siemens.com
State Under Review
Headers show
Series imagetypes_vm: add support for standalone VMDK images | expand

Commit Message

Clara Kowalsky Oct. 30, 2026, 11:57 a.m. UTC
Commit 48c1aee5e797 ("imagetypes_vm: clean up intermediate ova
artifacts") removes the VMDK after assembling the OVA. Some use cases
require only a VMDK, both VMDK and OVA, or only OVA.

With this change, it is possible to set:
- IMAGE_FSTYPES = "vmdk" to generate the VMDK without OVA packaging
- IMAGE_FSTYPES = "vmdk ova.zst" to generate both. In that case, OVA
  depends on the VMDK task and reuses its output without converting the
  disk again
- IMAGE_FSTYPES = "ova.zst" to build just the OVA and clean up the
  intermediate artifacts

Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com>
---
 doc/user_manual.md                        |  1 +
 meta/classes-recipe/imagetypes_vm.bbclass | 16 ++++++++++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

Comments

Moessbauer, Felix Oct. 30, 2026, 12:27 p.m. UTC | #1
On Fri, 2026-10-30 at 12:57 +0100, 'Clara Kowalsky' via isar-users
wrote:
> Commit 48c1aee5e797 ("imagetypes_vm: clean up intermediate ova
> artifacts") removes the VMDK after assembling the OVA. Some use cases
> require only a VMDK, both VMDK and OVA, or only OVA.
> 
> With this change, it is possible to set:
> - IMAGE_FSTYPES = "vmdk" to generate the VMDK without OVA packaging
> - IMAGE_FSTYPES = "vmdk ova.zst" to generate both. In that case, OVA
>   depends on the VMDK task and reuses its output without converting the
>   disk again
> - IMAGE_FSTYPES = "ova.zst" to build just the OVA and clean up the
>   intermediate artifacts
> 
> Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com>
> ---
>  doc/user_manual.md                        |  1 +
>  meta/classes-recipe/imagetypes_vm.bbclass | 16 ++++++++++++----
>  2 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/user_manual.md b/doc/user_manual.md
> index 09ac080b..199eb931 100644
> --- a/doc/user_manual.md
> +++ b/doc/user_manual.md
> @@ -540,6 +540,7 @@ Currently, the following image types are provided:
>   - `wic` - full disk image with user-specified partitions created and populated using the wic tool
>   - `ubi` - image for use on mtd nand partitions employing UBI
>   - `ubifs` - raw UBI filesystem image, normally used together with UBI partitions
> + - `vmdk` - virtual machine disk image
>   - `ova` - Open Virtual Appliance: image for use on VirtualBox or VMware
>   - `wsl` - tar file for Windows Subsystem for Linux
>   - `squashfs` - raw squashfs filesystem image
> diff --git a/meta/classes-recipe/imagetypes_vm.bbclass b/meta/classes-recipe/imagetypes_vm.bbclass
> index fd4e97ed..b1be5605 100644
> --- a/meta/classes-recipe/imagetypes_vm.bbclass
> +++ b/meta/classes-recipe/imagetypes_vm.bbclass
> @@ -8,9 +8,13 @@ FILESEXTRAPATHS:prepend = "${LAYERDIR_core}/recipes-core/images:"
>  OVF_TEMPLATE_FILE ?= "virtualbox/vm-img-virtualbox.ovf.tmpl"
>  IMAGE_SRC_URI:ova = "file://${OVF_TEMPLATE_FILE}"
>  
> -IMAGE_TYPEDEP:ova = "wic"
> +IMAGE_TYPEDEP:ova = "${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', 'vmdk', 'wic', d)}"

This manually models the imagetypes logic. Can't we just make the vmdk
a proper imagetype and let the internal logic defer what is removed and
what is kept?

The current implementation interferes with that.

Felix

>  IMAGER_INSTALL:ova += "qemu-utils gawk uuid-runtime"
>  
> +IMAGE_TYPEDEP:vmdk = "wic"
> +IMAGER_INSTALL:vmdk += "qemu-utils"
> +IMAGE_CMD:vmdk = "${convert_wic}"
> +
>  # virtual machine disk settings
>  SOURCE_IMAGE_FILE ?= "${IMAGE_FULLNAME}.wic"
>  
> @@ -19,7 +23,9 @@ SOURCE_IMAGE_FILE ?= "${IMAGE_FULLNAME}.wic"
>  VMDK_SUBFORMAT ?= "monolithicSparse"
>  
>  VIRTUAL_MACHINE_IMAGE_TYPE ?= "vmdk"
> -VIRTUAL_MACHINE_IMAGE_FILE = "${IMAGE_FULLNAME}-disk001.${VIRTUAL_MACHINE_IMAGE_TYPE}"
> +VIRTUAL_MACHINE_IMAGE_FILE = "${IMAGE_FULLNAME}${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', '', '-disk001', d)}.${VIRTUAL_MACHINE_IMAGE_TYPE}"
> +VIRTUAL_MACHINE_IMAGE_TYPE:vmdk = "vmdk"
> +VIRTUAL_MACHINE_IMAGE_FILE:vmdk = "${IMAGE_FULLNAME}.vmdk"
>  VIRTUAL_MACHINE_DISK = "${PP_DEPLOY}/${VIRTUAL_MACHINE_IMAGE_FILE}"
>  
>  def set_convert_options(d):
> @@ -66,7 +72,7 @@ OVA_VARS = "OVA_NAME OVA_MEMORY OVA_NUMBER_OF_CPU OVA_VRAM \
>  IMAGE_TEMPLATE_FILES:ova = "${OVF_TEMPLATE_FILE}"
>  IMAGE_TEMPLATE_VARS:ova = "${OVA_VARS}"
>  
> -do_image_ova[prefuncs] += "convert_wic"
> +do_image_ova[prefuncs] += "${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', '', 'convert_wic', d)}"
>  IMAGE_CMD:ova() {
>      if [ ! ${VIRTUAL_MACHINE_IMAGE_TYPE} = "vmdk" ]; then
>          exit 0
> @@ -96,7 +102,9 @@ IMAGE_CMD:ova() {
>          tar -uvf ${PP_DEPLOY}/${IMAGE_FULLNAME}.ova -C ${PP_DEPLOY} ${VIRTUAL_MACHINE_IMAGE_FILE}
>          rm -f '${DEPLOY_DIR_IMAGE}/${IMAGE_FULLNAME}.mf'
>          rm -f '${DEPLOY_DIR_IMAGE}/${IMAGE_FULLNAME}.ovf'
> -        rm -f '${DEPLOY_DIR_IMAGE}/${VIRTUAL_MACHINE_IMAGE_FILE}'
> +        if [ "${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', '1', '0', d)}" = "0" ]; then
> +            rm -f '${DEPLOY_DIR_IMAGE}/${VIRTUAL_MACHINE_IMAGE_FILE}'
> +        fi
>  EOIMAGER
>  }
>  IMAGE_CMD:ova[depends] = "${PN}:do_transform_template"
> -- 
> 2.56.0
> 
> -- 
> You received this message because you are subscribed to the Google Groups "isar-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com.
> To view this discussion visit https://groups.google.com/d/msgid/isar-users/20261030115757.25391-1-clara.kowalsky%40siemens.com.

Patch

diff --git a/doc/user_manual.md b/doc/user_manual.md
index 09ac080b..199eb931 100644
--- a/doc/user_manual.md
+++ b/doc/user_manual.md
@@ -540,6 +540,7 @@  Currently, the following image types are provided:
  - `wic` - full disk image with user-specified partitions created and populated using the wic tool
  - `ubi` - image for use on mtd nand partitions employing UBI
  - `ubifs` - raw UBI filesystem image, normally used together with UBI partitions
+ - `vmdk` - virtual machine disk image
  - `ova` - Open Virtual Appliance: image for use on VirtualBox or VMware
  - `wsl` - tar file for Windows Subsystem for Linux
  - `squashfs` - raw squashfs filesystem image
diff --git a/meta/classes-recipe/imagetypes_vm.bbclass b/meta/classes-recipe/imagetypes_vm.bbclass
index fd4e97ed..b1be5605 100644
--- a/meta/classes-recipe/imagetypes_vm.bbclass
+++ b/meta/classes-recipe/imagetypes_vm.bbclass
@@ -8,9 +8,13 @@  FILESEXTRAPATHS:prepend = "${LAYERDIR_core}/recipes-core/images:"
 OVF_TEMPLATE_FILE ?= "virtualbox/vm-img-virtualbox.ovf.tmpl"
 IMAGE_SRC_URI:ova = "file://${OVF_TEMPLATE_FILE}"
 
-IMAGE_TYPEDEP:ova = "wic"
+IMAGE_TYPEDEP:ova = "${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', 'vmdk', 'wic', d)}"
 IMAGER_INSTALL:ova += "qemu-utils gawk uuid-runtime"
 
+IMAGE_TYPEDEP:vmdk = "wic"
+IMAGER_INSTALL:vmdk += "qemu-utils"
+IMAGE_CMD:vmdk = "${convert_wic}"
+
 # virtual machine disk settings
 SOURCE_IMAGE_FILE ?= "${IMAGE_FULLNAME}.wic"
 
@@ -19,7 +23,9 @@  SOURCE_IMAGE_FILE ?= "${IMAGE_FULLNAME}.wic"
 VMDK_SUBFORMAT ?= "monolithicSparse"
 
 VIRTUAL_MACHINE_IMAGE_TYPE ?= "vmdk"
-VIRTUAL_MACHINE_IMAGE_FILE = "${IMAGE_FULLNAME}-disk001.${VIRTUAL_MACHINE_IMAGE_TYPE}"
+VIRTUAL_MACHINE_IMAGE_FILE = "${IMAGE_FULLNAME}${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', '', '-disk001', d)}.${VIRTUAL_MACHINE_IMAGE_TYPE}"
+VIRTUAL_MACHINE_IMAGE_TYPE:vmdk = "vmdk"
+VIRTUAL_MACHINE_IMAGE_FILE:vmdk = "${IMAGE_FULLNAME}.vmdk"
 VIRTUAL_MACHINE_DISK = "${PP_DEPLOY}/${VIRTUAL_MACHINE_IMAGE_FILE}"
 
 def set_convert_options(d):
@@ -66,7 +72,7 @@  OVA_VARS = "OVA_NAME OVA_MEMORY OVA_NUMBER_OF_CPU OVA_VRAM \
 IMAGE_TEMPLATE_FILES:ova = "${OVF_TEMPLATE_FILE}"
 IMAGE_TEMPLATE_VARS:ova = "${OVA_VARS}"
 
-do_image_ova[prefuncs] += "convert_wic"
+do_image_ova[prefuncs] += "${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', '', 'convert_wic', d)}"
 IMAGE_CMD:ova() {
     if [ ! ${VIRTUAL_MACHINE_IMAGE_TYPE} = "vmdk" ]; then
         exit 0
@@ -96,7 +102,9 @@  IMAGE_CMD:ova() {
         tar -uvf ${PP_DEPLOY}/${IMAGE_FULLNAME}.ova -C ${PP_DEPLOY} ${VIRTUAL_MACHINE_IMAGE_FILE}
         rm -f '${DEPLOY_DIR_IMAGE}/${IMAGE_FULLNAME}.mf'
         rm -f '${DEPLOY_DIR_IMAGE}/${IMAGE_FULLNAME}.ovf'
-        rm -f '${DEPLOY_DIR_IMAGE}/${VIRTUAL_MACHINE_IMAGE_FILE}'
+        if [ "${@bb.utils.contains('IMAGE_FSTYPES', 'vmdk', '1', '0', d)}" = "0" ]; then
+            rm -f '${DEPLOY_DIR_IMAGE}/${VIRTUAL_MACHINE_IMAGE_FILE}'
+        fi
 EOIMAGER
 }
 IMAGE_CMD:ova[depends] = "${PN}:do_transform_template"