runqemu: QB_FSINFO to support fstype wic images

wic images are handled as vmtype images. Starting qemu with "-kernel"
parameter and an image of type wic is not supported. Especially for
"-machine virt" the combination of wic with -kernel parameter would
be beneficial.

The new parameter QB_FSINFO allows to pass image type specific flags to
runqemu. QB_FSINFO is a space separated list of parameters. Parameters are
structured according to the following pattern: image-type:flag.

For now two parameters are supported:
- wic:no-kernel-in-fs
  The wic image is treated as rootfs only image. A -kernel option is
  passed to qemu.
- wic:kernel-in-fs
  The wic image is treated as VM image including a bootloader and a
  kernel. This is still the default behavior.

Example:
QB_DEFAULT_FSTYPE = "wic"
QB_FSINFO = "wic:no-kernel-in-fs"
QB_KERNEL_ROOT = "/dev/vda1"
QB_SYSTEM_NAME = "qemu-system-aarch64"
QB_MACHINE = "-machine virt"
...

[YOCTO #13336]

(From OE-Core rev: 2aa79a67affd22dfa37e4c2945c6ab0c86321f98)

Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Adrian Freihofer 2019-06-09 14:03:42 +02:00 committed by Richard Purdie
parent 79ef0eab35
commit 0e4c79a7c4

View File

@ -185,10 +185,11 @@ class BaseConfig(object):
self.lock_descriptor = None
self.bitbake_e = ''
self.snapshot = False
self.wictypes = ('wic', 'wic.vmdk', 'wic.qcow2', 'wic.vdi')
self.fstypes = ('ext2', 'ext3', 'ext4', 'jffs2', 'nfs', 'btrfs',
'cpio.gz', 'cpio', 'ramfs', 'tar.bz2', 'tar.gz')
self.vmtypes = ('hddimg', 'hdddirect', 'wic', 'wic.vmdk',
'wic.qcow2', 'wic.vdi', 'iso')
self.vmtypes = ('hddimg', 'hdddirect', 'iso')
self.fsinfo = {}
self.network_device = "-device e1000,netdev=net0,mac=@MAC@"
# Use different mac section for tap and slirp to avoid
# conflicts, e.g., when one is running with tap, the other is
@ -253,7 +254,7 @@ class BaseConfig(object):
def check_arg_fstype(self, fst):
"""Check and set FSTYPE"""
if fst not in self.fstypes + self.vmtypes:
if fst not in self.fstypes + self.vmtypes + self.wictypes:
logger.warning("Maybe unsupported FSTYPE: %s" % fst)
if not self.fstype or self.fstype == fst:
if fst == 'ramfs':
@ -390,7 +391,7 @@ class BaseConfig(object):
unknown_arg = ""
for arg in sys.argv[1:]:
if arg in self.fstypes + self.vmtypes:
if arg in self.fstypes + self.vmtypes + self.wictypes:
self.check_arg_fstype(arg)
elif arg == 'nographic':
self.qemu_opt_script += ' -nographic'
@ -536,6 +537,40 @@ class BaseConfig(object):
else:
raise RunQemuError("FSTYPE is NULL!")
# parse QB_FSINFO into dict, e.g. { 'wic': ['no-kernel-in-fs', 'a-flag'], 'ext4': ['another-flag']}
wic_fs = False
qb_fsinfo = self.get('QB_FSINFO')
if qb_fsinfo:
qb_fsinfo = qb_fsinfo.split()
for fsinfo in qb_fsinfo:
try:
fstype, fsflag = fsinfo.split(':')
if fstype == 'wic':
if fsflag == 'no-kernel-in-fs':
wic_fs = True
elif fsflag == 'kernel-in-fs':
wic_fs = False
else:
logger.warn('Unknown flag "%s:%s" in QB_FSINFO', fstype, fsflag)
continue
else:
logger.warn('QB_FSINFO is not supported for image type "%s"', fstype)
continue
if fstype in self.fsinfo:
self.fsinfo[fstype].append(fsflag)
else:
self.fsinfo[fstype] = [fsflag]
except Exception:
logger.error('Invalid parameter "%s" in QB_FSINFO', fsinfo)
# treat wic images as vmimages (with kernel) or as fsimages (rootfs only)
if wic_fs:
self.fstypes = self.fstypes + self.wictypes
else:
self.vmtypes = self.vmtypes + self.wictypes
def check_rootfs(self):
"""Check and set rootfs"""
@ -832,7 +867,11 @@ class BaseConfig(object):
if self.dtb:
print('DTB: [%s]' % self.dtb)
print('MACHINE: [%s]' % self.get('MACHINE'))
print('FSTYPE: [%s]' % self.fstype)
try:
fstype_flags = ' (' + ', '.join(self.fsinfo[self.fstype]) + ')'
except KeyError:
fstype_flags = ''
print('FSTYPE: [%s%s]' % (self.fstype, fstype_flags))
if self.fstype == 'nfs':
print('NFS_DIR: [%s]' % self.rootfs)
else: