On 05/08/2015 03:39 PM, Juro Bystricky wrote:
Yocto does not support VirtualBox sparse image VDI file format.
This could be achieved by the attached patch. The support mimics
the VMDK support for VMware. The only subtle difference is that
qemu-native has be be built with uuid enabled, as VDI images
need a valid UUID in order to be recognized by VirtualBox.
[YOCTO #7374]
Signed-off-by: Juro Bystricky <[email protected]>
---
meta/classes/boot-directdisk.bbclass | 3 ++-
meta/classes/image-vdi.bbclass | 30 ++++++++++++++++++++++++++++++
meta/classes/image.bbclass | 5 ++++-
meta/classes/image_types.bbclass | 5 +++--
meta/classes/sanity.bbclass | 4 ++++
meta/conf/documentation.conf | 1 +
meta/lib/oe/image.py | 4 ++--
meta/recipes-devtools/qemu/qemu.inc | 2 +-
8 files changed, 47 insertions(+), 7 deletions(-)
create mode 100644 meta/classes/image-vdi.bbclass
diff --git a/meta/classes/boot-directdisk.bbclass
b/meta/classes/boot-directdisk.bbclass
index 44f738b..d2727c4 100644
--- a/meta/classes/boot-directdisk.bbclass
+++ b/meta/classes/boot-directdisk.bbclass
@@ -64,6 +64,7 @@ SYSLINUX_ROOT ?= "root=/dev/sda2"
SYSLINUX_TIMEOUT ?= "10"
IS_VMDK = '${@bb.utils.contains("IMAGE_FSTYPES", "vmdk", "true", "false", d)}'
+IS_VDI = '${@bb.utils.contains("IMAGE_FSTYPES", "vdi", "true", "false", d)}'
boot_direct_populate() {
dest=$1
@@ -101,7 +102,7 @@ build_boot_dd() {
efi_hddimg_populate $HDDDIR
fi
- if [ "${IS_VMDK}" = "true" ]; then
+ if [ "${IS_VMDK}" = "true" ] || [ "${IS_VDI}" = "true" ]; then
if [ "x${AUTO_SYSLINUXMENU}" = "x1" ] ; then
install -m 0644
${STAGING_DIR}/${MACHINE}/usr/share/syslinux/vesamenu.c32
$HDDDIR/${SYSLINUXDIR}/
if [ "x${SYSLINUX_SPLASH}" != "x" ] ; then
diff --git a/meta/classes/image-vdi.bbclass b/meta/classes/image-vdi.bbclass
new file mode 100644
index 0000000..5a145a9
--- /dev/null
+++ b/meta/classes/image-vdi.bbclass
@@ -0,0 +1,30 @@
+
+SYSLINUX_ROOT ?= "root=/dev/sda2"
+SYSLINUX_PROMPT ?= "0"
+SYSLINUX_TIMEOUT ?= "10"
+SYSLINUX_LABELS = "boot"
+LABELS_append = " ${SYSLINUX_LABELS} "
+
+# need to define the dependency and the ROOTFS for directdisk
+do_bootdirectdisk[depends] += "${PN}:do_rootfs"
+ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_BASENAME}-${MACHINE}.ext3"
+
+# creating VDI relies on having a hddimg so ensure we inherit it here.
+inherit boot-directdisk
+
+IMAGE_TYPEDEP_vdi = "ext3"
+IMAGE_TYPES_MASKED += "vdi"
+
+create_vdi_image () {
+ qemu-img convert -O vdi ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hdddirect
${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.vdi
+ ln -sf ${IMAGE_NAME}.vdi ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.vdi
+}
+
+python do_vdiimg() {
+ bb.build.exec_func('create_vdi_image', d)
+}
+
+addtask vdiimg after do_bootdirectdisk before do_build
+
+do_vdiimg[depends] += "qemu-native:do_populate_sysroot"
+
Is there any way that we can create a shared class for vmdk and vdi
since the difference between the two classes is vmdk -> vdi? Can this
be a variable and/or parameter-ized some how?
I know it's a small class, but the code duplication could cause other
problems down the line.
Sau!
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index dc9bd80..578747f 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -127,11 +127,14 @@ def build_live(d):
return "image-live"
IMAGE_TYPE_live = "${@build_live(d)}"
-
inherit ${IMAGE_TYPE_live}
+
IMAGE_TYPE_vmdk = '${@bb.utils.contains("IMAGE_FSTYPES", "vmdk", "image-vmdk",
"", d)}'
inherit ${IMAGE_TYPE_vmdk}
+IMAGE_TYPE_vdi = '${@bb.utils.contains("IMAGE_FSTYPES", "vdi", "image-vdi",
"", d)}'
+inherit ${IMAGE_TYPE_vdi}
+
python () {
deps = " " + imagetypes_getdepends(d)
d.appendVarFlag('do_rootfs', 'depends', deps)
diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass
index 72c7337..d86d108 100644
--- a/meta/classes/image_types.bbclass
+++ b/meta/classes/image_types.bbclass
@@ -13,7 +13,7 @@ def imagetypes_getdepends(d):
deps = []
ctypes = d.getVar('COMPRESSIONTYPES', True).split()
for type in (d.getVar('IMAGE_FSTYPES', True) or "").split():
- if type in ["vmdk", "live", "iso", "hddimg"]:
+ if type in ["vmdk", "vdi", "live", "iso", "hddimg"]:
type = "ext3"
basetype = type
for ctype in ctypes:
@@ -155,6 +155,7 @@ IMAGE_TYPES = " \
tar tar.gz tar.bz2 tar.xz tar.lz4 \
cpio cpio.gz cpio.xz cpio.lzma cpio.lz4 \
vmdk \
+ vdi \
elf \
"
@@ -181,5 +182,5 @@ DEPLOYABLE_IMAGE_TYPES ?= "hddimg iso"
IMAGE_EXTENSION_live = "hddimg iso"
# The IMAGE_TYPES_MASKED variable will be used to mask out from the
IMAGE_FSTYPES,
-# images that will not be built at do_rootfs time: vmdk, hddimg, iso, etc.
+# images that will not be built at do_rootfs time: vmdk, vdi, hddimg, iso, etc.
IMAGE_TYPES_MASKED ?= ""
diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass
index cca39c9..3d4bae5 100644
--- a/meta/classes/sanity.bbclass
+++ b/meta/classes/sanity.bbclass
@@ -822,6 +822,10 @@ def check_sanity_everybuild(status, d):
# Check vmdk and live can't be built together.
if 'vmdk' in d.getVar('IMAGE_FSTYPES', True) and 'live' in
d.getVar('IMAGE_FSTYPES', True):
status.addresult("Error, IMAGE_FSTYPES vmdk and live can't be built
together\n")
+
+ # Check vdi and live can't be built together.
+ if 'vdi' in d.getVar('IMAGE_FSTYPES', True) and 'live' in
d.getVar('IMAGE_FSTYPES', True):
+ status.addresult("Error, IMAGE_FSTYPES vdi and live can't be built
together\n")
def check_sanity(sanity_data):
import subprocess
diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf
index 3a918e8..1305c32 100644
--- a/meta/conf/documentation.conf
+++ b/meta/conf/documentation.conf
@@ -58,6 +58,7 @@ do_uboot_mkimage[doc] = "Creates a uImage file from the
kernel for the U-Boot bo
do_unpack[doc] = "Unpacks the source code into a working directory"
do_validate_branches[doc] = "Ensures that the source/meta branches are on the
locations specified by their SRCREV values for a linux-yocto style kernel"
do_vmdkimg[doc] = "Creates a .vmdk image for use with VMware and compatible
virtual machine hosts"
+do_vdiimg[doc] = "Creates a .vdi image for use with VirtualBox and compatible
virtual machine hosts"
# DESCRIPTIONS FOR VARIABLES #
diff --git a/meta/lib/oe/image.py b/meta/lib/oe/image.py
index 0ce303d..40f6151 100644
--- a/meta/lib/oe/image.py
+++ b/meta/lib/oe/image.py
@@ -66,7 +66,7 @@ class ImageDepGraph(object):
return graph
def _clean_graph(self):
- # Live and VMDK images will be processed via inheriting
+ # Live and VMDK/VDI images will be processed via inheriting
# bbclass and does not get processed here. Remove them from the
fstypes
# graph. Their dependencies are already added, so no worries here.
remove_list = (self.d.getVar('IMAGE_TYPES_MASKED', True) or
"").split()
@@ -76,7 +76,7 @@ class ImageDepGraph(object):
def _image_base_type(self, type):
ctypes = self.d.getVar('COMPRESSIONTYPES', True).split()
- if type in ["vmdk", "live", "iso", "hddimg"]:
+ if type in ["vmdk", "vdi", "live", "iso", "hddimg"]:
type = "ext3"
basetype = type
for ctype in ctypes:
diff --git a/meta/recipes-devtools/qemu/qemu.inc
b/meta/recipes-devtools/qemu/qemu.inc
index 4225db7..cbe9425 100644
--- a/meta/recipes-devtools/qemu/qemu.inc
+++ b/meta/recipes-devtools/qemu/qemu.inc
@@ -90,7 +90,7 @@ PACKAGECONFIG ??= " \
fdt sdl alsa \
${@bb.utils.contains('DISTRO_FEATURES', 'xen', 'xen', '', d)} \
"
-PACKAGECONFIG_class-native ??= "fdt alsa"
+PACKAGECONFIG_class-native ??= "fdt alsa uuid"
PACKAGECONFIG_class-nativesdk ??= "fdt sdl"
NATIVEDEPS = ""
NATIVEDEPS_class-native = "${@bb.utils.contains('DISTRO_FEATURES', 'x11',
'libxext-native', '',d)}"
--
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core