[v2,2/2] imagetypes_vm: add support for standalone vmdk images

Message ID 20261104072600.3229817-2-clara.kowalsky@siemens.com
State New
Headers show
Series [v2,1/2] image: remove unrequested intermediate image types | expand

Commit Message

Clara Kowalsky Nov. 4, 2026, 7:26 a.m. UTC
This adds vmdk as an image type, so virtual machine disks can be
generated without OVA packaging. OVA depends on the vmdk image and
reuses its output. The generic image cleanup removes the intermediate
vmdk unless it is explicitly requested in IMAGE_FSTYPES.

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

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..32a72bf4 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 = "${@'vmdk' if d.getVar('VIRTUAL_MACHINE_IMAGE_TYPE') == 'vmdk' else 'wic'}"
 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,9 +23,16 @@  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 = "${@get_ova_disk_file(d)}"
+VIRTUAL_MACHINE_IMAGE_TYPE:vmdk = "vmdk"
 VIRTUAL_MACHINE_DISK = "${PP_DEPLOY}/${VIRTUAL_MACHINE_IMAGE_FILE}"
 
+def get_ova_disk_file(d):
+    if d.getVar("VIRTUAL_MACHINE_IMAGE_TYPE") == "vmdk":
+        return "%s.vmdk" % d.getVar("IMAGE_FULLNAME")
+    return "%s-disk001.%s" % (
+        d.getVar("IMAGE_FULLNAME"), d.getVar("VIRTUAL_MACHINE_IMAGE_TYPE"))
+
 def set_convert_options(d):
    format = d.getVar("VIRTUAL_MACHINE_IMAGE_TYPE")
    if format == "vmdk":
@@ -66,7 +77,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] += "${@'convert_wic' if d.getVar('VIRTUAL_MACHINE_IMAGE_TYPE') != 'vmdk' else ''}"
 IMAGE_CMD:ova() {
     if [ ! ${VIRTUAL_MACHINE_IMAGE_TYPE} = "vmdk" ]; then
         exit 0
@@ -96,7 +107,6 @@  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}'
 EOIMAGER
 }
 IMAGE_CMD:ova[depends] = "${PN}:do_transform_template"